OpenCV -素のまま利用する- Visual Studio 2008 C++

| | コメント(0) | トラックバック(2)

OpenCV ( Open Conputer Vision)とは?

画像処理用のライブラリといえば、フォーマットや色調変換などの画像のプロパティに対しての処理でしたが、OpenCVは画像の認識を目的としたライブラリになっています。

つまり、エッジ抽出や領域抽出などのフィルタ処理や、学習アルゴリズムを比較的簡単なプログラムで実現できます。

デフォルトの学習データとして、顔画像認識用のデータセットも容易されているので、顔領域の抽出なら15分でプログラムができます

C#や、VB.Netでコードを書けるとよいのですが、OpenCVのAPIがオブジェクト指向向けにつくられていないため、多くの人がラッパ作りに挑戦していますが挫折しているようです。

一応ラッパとしては次のようなものがあるようです。

OpenCVDotNet
SharperCV (開発停止)
STL Like OpenCV Wrapper (中をみてないのでよくわからない)
OpenCVLib (よくできているんだけど、環境によっては動かない。ソースコードからコンパイルしないとだめっぽい)

まずは、ラッパを使わずにそのままOpenCVを使う方法をまとめておきます。

 

1, 最新版のOpenCVをダウンロードしインストール

Sorce Forgeからダウンロードします。1.0系と1.1系がありますが、世の中にある多くのサンプルは1.0系なので、サンプルを動かしたいだけの人は1.0系のほうが安全だとおもいます。ここでは1.1Preを使って話を進めます。

1.0と1.1の差は・・・・ 結構バグフィクスやパフォーマンスチューニングがされているようです。あとは

Daniel FilipによるWImageが便利そう。

ファイルは実行すると展開されてProgram Files\OpenCV\に展開されます。このディレクトリ中のbinフォルダのPathを環境変数に設定すればOKです。

2、OpenCVをコンパイルしてみる

OpenCVを利用する際は、OpenCV自身のバグなどに悩まされることになるのは必然です。OpenCVをコンパイルできないと、公式にバグが修正されるのを待つしかありません。

_makeフォルダにソリューションファイル「opencv.vs2005.sln」があるのでなにも考えずにコンパイルしてみましょう。下記のようなエラーがでてコンパイルできないはずです。

'foreground_regions' : 'CvFGDStatModel' のメンバではありません。 c:\Program Files (x86)\OpenCV\cvaux\src\cvbgfg_acmmm2003.cpp

これは一部のコメントが文字化けしているせいです。(英語環境だと問題ない?)

cvaux.hにあるCV_BG_STAT_MODEL_FIELDSのコメントを修正してあげてください

CvMemStorage*   storage;      /*storage for 吐oreground_regions・/   ←コメントを閉じる
CvSeq*          foreground_regions /*foreground object contours*/

Debugビルドした場合は、binフォルダとlibフォルダにcv110d.dll, cvd.libなど、デバッグのdが付帯したdllファイルが作成されているかとおもいます。OpenCVの内部実装を追いかけたい場合にはこちらを利用します。

3、OpenCVのプロジェクトを作ってみる

C++のFormプロジェクトを作ります。

「ツール」→「オプション」→「プロジェクトおよびソリューション」→「VC++ディレクトリ」を選択する。「ディレクトリを表示するプロジェクト」のインクルードファイルフォルダ、ライブラリフォルダに、以下の項目を設定する。

インクルード
...\OpenCV\cv\include
...\OpenCV\cvaux\include
...\OpenCV\cvcore\include
...\OepnCV\ml\include
...\OpenCV\_graphics\include

ライブラリ
...\OpenCV\lib

ライブラリのリンクはparagmaを使うと便利です。

#pragma comment( lib, "cv.lib" )
#pragma comment( lib, "cxcore.lib" )
#pragma comment( lib, "cvaux.lib" )
#pragma comment( lib, "highgui.lib" )

コンパイルオプションで、共通言語ランタイムサポートを/clrに設定する。(OpenCVがマネージドでないため)

4、プログラムを書く

FormにはPictureBoxをひとつだけ設置し、test.jpgを読み込んで表示してみましょう。

やることは単純で、cvLoadImage( char* filename ); を使ってIplImageを作成し、IplImageをBitmapオブジェクトに変換しPictureBoxにセットするだけです。

// 読み込みファイル
String^ s = "c:\\test.jpg";
// String^型をchar*に安全に変換
char* pStr = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi( s ).ToPointer();

// ファイル読み込み
IplImage* img = cvLoadImage( pStr );
if( img == 0 ){
 return;
}

// Bitmapに直接img->imgDataを読ませると、エラーになるのでコピーデータを渡す
IntPtr ip( new unsigned char[ img->widthStep * img->height ] );
memcpy( ip.ToPointer(), img->imageData, img->widthStep * img->height );   
Bitmap^ bmp = gcnew Bitmap(img->width, img->height, img->widthStep, System::Drawing::Imaging::PixelFormat::Format24bppRgb, ip);
// 読み込みデータは解放
cvReleaseImage( &img );
// PictureBoxにBitmapをセット
this->pictureBox1->Image = bmp;

 ポイントは、Native C++とC++/CLIのメモリ管理の差を理解してやることです。

 その他参考資料:

OpenCV 1.1 リファレンスマニュアル(日本語)   サンプルコード

Introdcution to programing with OpenCV (英語:一通り知識をつけたい場合)

IplImageからBitmapを確保する (サンプル)、 OpenCV C++/CLIでIplImageを表示する

OpenCV Wiki (こまったらここをみること)

OpenCV.jp (国内で最大?)

OpenCV FrontPage (奈良先端)

Moma's Wiki (サンプル多数)

Haar Cascades (学習ファイルが各種ある)

Yahoo Open CV コミュニティ (米国Yahoo)

lab.comp@wiki

msvcr90.dllのエラー対策

トラックバック(2)

このブログ記事を参照しているブログ一覧: OpenCV -素のまま利用する- Visual Studio 2008 C++

このブログ記事に対するトラックバックURL: http://mt.nogutetu.com/mt-tb.cgi/406

1.プロジェクトの作成 Visual C++ 2008 Express Edition で 「Windows フォーム アプリケーション」を作成する。 2.静的ライブラリの設定、共通言語ランタイム サポートの変更 「プロジェクト(P)」→「***のプロパティ(P)」→「構成プロパティ」→「リンカ」→「入力」で 「追加の依存ファイル」を追加 cv.lib、cxcore.lib、cvaux.lib、highgui.lib 「プロジェクト(P)」→「***のプロパティ(P)」→「構成プロパティ」... 続きを読む

» 網研/第5フェーズ/参考リンク(TriAx 事業部横断 WIKI (PukiWiki/TrackBack 0.4))~のトラックバック

これは開発途中で参考にしたサイトのリンク TreeView C#でエクスプローラ風のフォルダ表示をするための短いサンプル. 骨格部分で参考にした. ドライブをとってきている TreeViewで各要素にアイコンを設定する方法 .NET上でC++からunmanagedなコードを呼び出す場合の例... 続きを読む

コメントする

コネタ

全部みる

食事歴

全部みる

このブログ記事について

このページは、noguが2009年1月10日 06:03に書いたブログ記事です。

ひとつ前のブログ記事は「ブログ媒体でのプロモーション」です。

次のブログ記事は「広告費の増大で倒産 アーバンエステート を考察する」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。