OpenCV〜インストール編
OpenCV2.2をインストールしてみた。
Wikipediaによると、OpenCVとはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリらしい。
とにかく、まず使える環境を作ってみる。
http://sourceforge.net/projects/opencvlibrary/
↑このへんからDLしてインストールしましょう。
インストールするときにPATHを通すかどうかを訊かれるのでYESと答えましょう。
早速サンプルプログラムを動かしてみる。
http://opencv.jp/sample/video_io.html#capture
↑URLを参考にしてサンプルプログラムを作成。とりあえずVC2005でWin32コンソールアプリを作成してMFCをONにしておく。
#ifdef _DEBUG #define new DEBUG_NEW #endif // 唯一のアプリケーション オブジェクトです。 CWinApp theApp; using namespace std; //#include <highgui.h> /* 当初のincludeファイル */ #include <opencv2/highgui/highgui.hpp> /* 修正後のincludeファイル */ int Main2() { //DirectShowを利用してカメラから画像をキャプチャーする //frameBuffへのポインタも定義する CvCapture *capture; IplImage *frameBuff; //カメラの設定 //CV_CAP_DSHOWを指定すると自動的に一番小さいデバイスIDを取得してくれる //イメージのサイズはCV_CAP_DROP_FRAMEで設定する capture = cvCreateCameraCapture(CV_CAP_ANY); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 640); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480); printf("CV_CAP_DSHOW=%d\n", CV_CAP_ANY); printf("0\n"); //ウィンドウを生成 cvNamedWindow("camera", CV_WINDOW_AUTOSIZE); cvWaitKey(1000); printf("1\n"); //ESCキーでループを抜ける char c = 0; while(27 != c){ //内部バッファに画像を転送し //RetrieveFrameでフレームバッファのポインタを取得 //cvQueryFrameよりも高速に動作する cvGrabFrame(capture); frameBuff = cvRetrieveFrame(capture); //フレームバッファの画像をウィンドウに表示する cvShowImage("camera", frameBuff); //1msキー入力待ち c = cvWaitKey(1); } /*---------------------------*/ //後処理 //すべてのウィンドウを破壊 cvDestroyAllWindows(); //カメラ構造体を破壊 cvReleaseCapture(&capture); // cvReleaseImage(&frameBuff); //フレームバッファの解放は禁止されている return 0; } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // MFC を初期化して、エラーの場合は結果を印刷します。 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: 必要に応じてエラー コードを変更してください。 _tprintf(_T("致命的なエラー: MFC の初期化ができませんでした。\n")); } else { // TODO: アプリケーションの動作を記述するコードをここに挿入してください。 nRetCode = Main2(); } return nRetCode; }
コンパイルをかけるとどうにもhighgui.hがみつからんらしい。
インクルードディレクトリにC:\OpenCV2.2\include\を追加したがやはりhighgui.hは見つからず。
C:\OpenCV2.2\include\の内容物をみるとC:\OpenCV2.2\include\opencv2\highgui\highgui.hppなるファイルを発見。
#include
すると未解決シンボルが大量に発生
1>CVtest3.obj : error LNK2019: 未解決の外部シンボル _cvReleaseCapture が関数 "int __cdecl Main2(void)" (?Main2@@YAHXZ) で参照されました。
1>CVtest3.obj : error LNK2019: 未解決の外部シンボル _cvDestroyAllWindows が関数 "int __cdecl Main2(void)" (?Main2@@YAHXZ) で参照されました。
1>CVtest3.obj : error LNK2019: 未解決の外部シンボル _cvShowImage が関数 "int __cdecl Main2(void)" (?Main2@@YAHXZ) で参照されました。
1>CVtest3.obj : error LNK2019: 未解決の外部シンボル _cvRetrieveFrame が関数 "int __cdecl Main2(void)" (?Main2@@YAHXZ) で参照されました。
1>CVtest3.obj : error LNK2019: 未解決の外部シンボル _cvGrabFrame が関数 "int __cdecl Main2(void)" (?Main2@@YAHXZ) で参照されました。
1>CVtest3.obj : error LNK2019: 未解決の外部シンボル _cvWaitKey が関数 "int __cdecl Main2(void)" (?Main2@@YAHXZ) で参照されました。
1>CVtest3.obj : error LNK2019: 未解決の外部シンボル _cvNamedWindow が関数 "int __cdecl Main2(void)" (?Main2@@YAHXZ) で参照されました。
1>CVtest3.obj : error LNK2019: 未解決の外部シンボル _cvSetCaptureProperty が関数 "int __cdecl Main2(void)" (?Main2@@YAHXZ) で参照されました。
1>CVtest3.obj : error LNK2019: 未解決の外部シンボル _cvCreateCameraCapture が関数 "int __cdecl Main2(void)" (?Main2@@YAHXZ) で参照されました。
libファイルへのリンクが必要らしい。
そこで、プロジェクトのプロパティのリンカにてC:\OpenCV2.2\libを追加のライブラリディレクトリに指定、opencv_highgui220.libを追加の依存ファイルに指定。これでようやく動きます。
OpenCV2.0の解説はネットをみると幾つか見つかりますが、OpenCV2.2となると解説はまだ少ないようです。今回は調子こいて最新版の2.2をインストールしたので余計な苦労をした模様。
因みにソースコード中の
//カメラの設定 //CV_CAP_DSHOWを指定すると自動的に一番小さいデバイスIDを取得
とあるところですが、うちのPCではCV_CAP_DSHOWでデバイスが取得できませんでした。
highgui_c.hのソースを見に行くと、
enum { CV_CAP_ANY =0, // autodetect CV_CAP_MIL =100, // MIL proprietary drivers CV_CAP_VFW =200, // platform native CV_CAP_V4L =200, CV_CAP_V4L2 =200, CV_CAP_FIREWARE =300, // IEEE 1394 drivers CV_CAP_FIREWIRE =300, CV_CAP_IEEE1394 =300, CV_CAP_DC1394 =300, CV_CAP_CMU1394 =300, CV_CAP_STEREO =400, // TYZX proprietary drivers CV_CAP_TYZX =400, CV_TYZX_LEFT =400, CV_TYZX_RIGHT =401, CV_TYZX_COLOR =402, CV_TYZX_Z =403, CV_CAP_QT =500, // QuickTime CV_CAP_UNICAP =600, // Unicap drivers CV_CAP_DSHOW =700, // DirectShow (via videoInput) CV_CAP_PVAPI =800 // PvAPI, Prosilica GigE SDK };
とあるので、CV_CAP_ANYを使うのが妥当かと。