問題
OpenCvSharp3を使ってビットマップ化したPictureBoxのImageに矩形を描画をすると、再度ビットマップ化したときに色情報が落ちてしまう。
PNGをビットマップ化した場合は問題なかったので違いを調べてみた。
コード(修正前)
Bitmap pngBmp = new Bitmap(@"test.png");
Bitmap pictImageBmp = new Bitmap(this.pictureBox1.Image);
Mat pngMat = BitmapConverter.ToMat(pngBmp);
Mat pictImageMat = BitmapConverter.ToMat(pictImageBmp);
// 緑色の矩形を描画
Rect rect = new Rect(10, 20, 50, 300);
Cv2.Rectangle(pngMat, rect, new Scalar(0, 255, 0), 2);
Cv2.Rectangle(pictImageMat, rect, new Scalar(0, 255, 0), 2);
// 正しい色で矩形が表示される
this.pictureBox1.Image = BitmapConverter.ToBitmap(pictImageMat);
// 矩形が白くなる
this.pictureBox1.Image = BitmapConverter.ToBitmap(pictImageMat);
解決
OpenCvSharp3でMat変換すると、カラータイプが以下の通りになっていた。
PNG → BGR
PictureBoxのImage → BGRA
OpenCvSharp3ではBGRで描画処理をしているため、BGRAでビットマップ化すると色情報が落ちてしまう。
※どうしてそうなるのかは調べきれていません、すみません。
コード(修正後)
// Mat pictImageMat = BitmapConverter.ToMat(pictImageBmp);
// アルファチャンネル付きBGRからBGRに変換
Mat pictImageMat = BitmapConverter.ToMat(pictImageBmp).CvtColor(ColorConversionCodes.BGRA2BGR);