OpenCV C _CLR - eiichiromomma/CVMLAB GitHub Wiki

(OpenCV) C++/CLR

C++/CLRのmanaged extensionsを使った.NET GUIとOpenCVを共存させる

※.NET等のWindowsアプリの作成についてはド素人なのでメモ程度のつもりで参照のこと

準備

DirectXの時 と同様に小細工が必要。

プロジェクト

CLRのWindowsフォームアプリケーションのプロジェクトにする。

/clrオプション

プロジェクトのプロパティを開き、「構成プロパティ」-「全般」-「共通言語ランタイム サポート」を 共通言語ランタイム サポート (/clr) にする。 clr:pureだとCLIのmanagedなコードとOpenCVのunmanagedなコードの共存が許されない。

GUIの利用

画像の表示

IplImage→Bitmap

難点だったIplImage→BitmapはOpenCVDotNetプロジェクト のを拝借(TRex Projectも同様)。GPLなので要注意。

  1. cvLoadImageで読み込み
  2. OpenCVDotNetのIplImageToBitmapでBitmapへ変換
  3. PictureBoxのImageに指定 で表示できる。

PictureBoxのモードをZoomにしておけば自動的にリサイズされる。

※としていたが、PictureBoxのPaintイベントでe->Graphicsを使って描画するのが作法らしい。bmpImgの更新毎にRefresh()を行なう。 あとマニフェストに関しても修正。 manifestファイルが不要になる。

スクロール

スクロールバーと連動させる方法はScrollBar クラス (System.Windows.Forms) に例が出ている。

自力でもPictureBoxのサイズとスクロールバーのValueから表示させるROIを決定し、cvCopyImageで更新する手もある。 というか最初は自力で作ってしまった。

スクロール(一番楽な方法)

AutoScrollをtrueにしたパネルコンテナにPictureBoxを作成するのが一番楽。 この状態で描画用のGraphicsの取得もPictureBoxから取得しておけば、表示されている部分だけでなく、全体のGraphicsが取得される。

サンプルソース

適当に作ってみた。メニューのOpenで開いてOpenCVでFilpとXorSの例。

※bmpImg_をdeleteしないとメモリを食い潰す状態だったので修正。

Panelのお陰で何も考えずにスクロールバーが使える。

cvFlipを選ぶと。。。

こんな感じ。

XorSの結果。

OpenCV Ver.1.1以降

デバッグ中にOpenFileDialogを開こうとすると、

'System.Threading.ThreadStateException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました。

追加情報: OLE が呼び出される前に、現在のスレッドが
 Single Thread Apartment (STA) モードに設定されていなければなりません。
Main 関数に STAThreadAttribute が設定されていることを確認してください。
この例外はデバッガがプロセスにアタッチされている場合にのみ発生します。

なるエラーが発生する。highguiのためにアプリケーションが強制的にMTAになってしまうのが原因なようで、highguiを使わないのが手っ取り早い。 cvLoadImageはDrawing::Bitmapに置き換えて、Bitmap->IplImageの変換で対処する。 動画像の場合は諦めてdelegateを使う。

を参照。

Jpegしか使わない場合はOpenCV jpeglibを参照。

参考

  • TRex Project .NETのGUIにCvCaptureで取得した画像を貼り付けている例。