OpenCV_画像を Mat 型で読み込んで System::Drawing::Bitmap^ に変換 01

IplImage 型でなく Mat 型で試した。

    System::Drawing::Bitmap^ bmpA
        = gcnew System::Drawing::Bitmap(
            mat.cols, mat.rows, mat.step,
            System::Drawing::Imaging::PixelFormat::Format24bppRgb,
            (IntPtr)mat.data);
    System::Drawing::Bitmap^ bmpB = gcnew System::Drawing::Bitmap(bmpA);

mat.type() が 16 ( CV_8UC3 ) の画像。拡張子は JPG と BMP で、
一見動いたように見えた。
だが 16 で BMP で例外発生した画像もある。バイナリファイルで見てみたが分からん。

 

なにやら横幅 4 の倍数必要があるらしい。
確かに例外発生したのは 4 で割りきれない画像だった。

cv::Mat では画像データのメモリ幅が 4 の倍数に調整されていない。
画像の幅が 4 の倍数でない場合は cv::Mat と .NET の Bitmap とでは
メモリのサイズが異なる為、
そのままcv::MatのポインタをBitmapへ渡す事ができない。

そのため、cv::Mat から Bitmap へ変換する場合は cv::Mat そのものを
IplImage を確保してから cv:Mat へ変換するか、画像の 1 行ごとにデータを
コピーするなどの工夫が必要。よく分からない。

 

 

 --Memo--
IplImage 型ではどれも問題なく表示された ( Format24bppRgb )
mat.type() が 2 や 18 でも 同じだった。( 画像はおかしいが例外発生しない )
2 と 18 においては、IpImage 型でも Mat 型でも
Format48bppRgb ・ Format64bppArgb だと bmpB ( bmp2 ) で
メモリ壊れている云々の例外発生。

 

 

 

こちらから。
https://imagingsolution.net/program/opencv/iplimage2bitmap/
http://cometlearning.blogspot.com/2018/01/opencvcopencvmatbitmap.html
http://yamatyuu.net/computer/program/vc2013/opencv/view_gdi3/index.html

以上。