LoginSignup
1
3

More than 3 years have passed since last update.

[C#]OpenCvSharp3を使ってPictureBoxのImageに矩形を描画すると色が消える問題

Last updated at Posted at 2019-11-23

問題

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);
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3