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 を#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を使うのが妥当かと。