Linux,CUI使いの私がWindowsでGUIプログラミングしてみた

とりあえずVisual Studio Express Edition,OpenCVをインストール.OpenCVは画像処理に関する便利なライブラリで,Linuxでもよく使う.奈良先端大の千原研のWikiが参考になる.

OpenCVでもある程度GUIは使えるんですが,マルチプラットフォームなやつでしょぼい.で,Visual Studio使うしWindowsのGUIを使ってみた.

ここでのWindowsのGUIっていうのは .NET で作ったやつで,プロジェクト的には「Windowsフォームアプリケーション」.

適当にフォームを作り,PictureBoxコンポーネントを配置(pictureBox1という名前になった).

で,そのpictureBox1に画像を表示するわけですが,ここで,OpenCVで使うIplImage*というやつはそのままPictureBoxには表示できない.PictureBoxにはBitmapという型のデータが入る.

で,IplImage* から Bitmapを作る必要があるわけです.IplImage*は普通のポインタなのでアンマネージド,Bitmapはマネージドコードなので変換がめんどい.

今回は,IntPtrを使った.コードはこんな感じ

// test.jpgを読み込み
IplImage *img=cvLoadImage("test.jpg");
// 変数を用意(Windowsでの画像データを保持)
IntPtr ip(new unsigned char[img->widthStep*img->height]);
// データをコピー
memcpy(ip->toPointer(),img->imageData,img->widthStep*img->height);
// 画像(OpenCVの方)の解放
cvReleaseImage(&img);
// ビットマップを作って
Bitmap^ bmp = gcnew Bitmap(img->width, img->height, img->widthStep,
System::Drawing::Imaging::PixelFormat::Format24bppRgb, ip);
// 表示
this->pictureBox1->Image = bmp;

これでOK.IplImage *とPictureBox^ を引数に持つ関数を作ってまとめておけば便利.

img->imageDataをmemcpyでコピーするのは,IntPtrによる解放とcvReleaseImageによる解放の重複を避けるため.

コメントする