とりあえず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による解放の重複を避けるため.