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

C# で new Bitmap (10, 10, ~ ) とプログラムから bmp 画像を作成することが出来ること忘れてた。

※ 作成した Bitmap を スクロールバー付き ImageBox に表示し、
スクロールバーを動かすと赤×になる。↓ はreturn bmp している。

 

    cv::Ptr<IplImage> ipImag
        = cvLoadImage("./hoge.bmp", CV_LOAD_IMAGE_UNCHANGED);

    System::Drawing::Bitmap^ bmp
     = gcnew System::Drawing::Bitmap (
     ipImag->width, ipImag->height, ipImag->widthStep,
     System::Drawing::Imaging::PixelFormat::Format24bppRgb,
     (IntPtr)ipImag->imageData);

 

Bitmap( width, height, stride, format, scan0 )

Bitmap(Int32 w, Int32 h, Int32 stride, PixelFormat format, IntPtr scan0)
サイズ・ピクセル形式・ピクセルデータを使用して、
Bitmap クラスの新しいインスタンスを初期化する。

 第一引数:width
Bitmap の幅。( ピクセル単位 )

第二引数:height
Bitmap の高さ。( ピクセル単位 )

第三引数:stride
スキャンラインの間のバイトオフセット数を指定する整数。?
水平方向の解像度 ( 1 インチあたりのピクセル数 ) を取得する。
IplImage で調べた。
ipImag->widthStep:画像の水平方向 1 ライン分をバイト単位で表す値。
これは、ipImag->imageData に直接アクセスする際に使用される。

第四引数:format
PixelFormat 型。ピクセル形式を取得する。
ex ) 文頭に「1 ピクセルあたり 」。
Format24bppRgb:24 ビットの形式。
Format32bppArgb:32 ビットの形式。アルファ、赤、緑、青。

第五引数:scan0
IntPtr型。ピクセルデータ格納するバイトの配列へのポインタ
IplImage で調べた。
実際の画素値が格納されている。

 

 

 

こちらから。
http://www.cellstat.net/cvarrtomat/
https://imagingsolution.net/program/opencv/iplimage2bitmap/
http://opencv.jp/sample/basic_structures.html
Bitmap Constructor (System.Drawing) | Microsoft Docs
PixelFormat Enum (System.Drawing.Imaging) | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/api/system.intptr?view=netframework-4.7.2

以上。