『 C++とOpenCVでWebカメラを簡単に扱う 』
2010 年 8 月 6 日C++でWebカメラからの映像を取り込むとき、OpenCV純正の関数が不安定なので使っていたEWCLIBというライブラリがありまして、このライブラリを簡単に扱うためのDirectShowというライブラリがあったりするんですが、EWCLIBが2.0にバージョンアップしてからDirectShowが使えなくなっていたので少し書き直してみました。中身はほぼDirectShowと一緒です。(EWCLIBの呼び出し引数変更とgetterを加えたくらい)
» CameraEwclib2.h
» CameraEwclib2.cpp
使い方もDirectShowとほぼ一緒。コンストラクタ引数はEWC_Openに合わせています。
//インクルード
#include "CameraEwclib2.h"
int main(void)
{
//キャプチャクラスを生成(引数は省略可)
CameraEwclib2 *camera = new CameraEwclib2(0, 640, 480, 30);
//ウインドウを開く
char *wname = "test_window";
cvNamedWindow(wname, CV_WINDOW_AUTOSIZE);
//以下ループ
while(true)
{
//カメラのキャプチャ
//引数は省略可, 鏡像として取り込みたい場合はtrueを指定
//戻り値はIplImage* (OpenCVの標準的な画像コンテナ)
camera->capture(true);
//ここらへんで何か画像処理をする...
//画像の表示
cvShowImage(wname, camera->image());
//Wait処理およびEscキーで終了
int c = cvWaitKey(10);
if ((char)c == 27) break;
}
//終了処理
delete camera;
cvDestroyWindow(wname);
return 0;
}
CameraEwclib2クラスのコンストラクタ第6引数の画像フォーマットの部分は、持ってるWebカメラが対応していなくて検証できないのと、まだあまり理解していないこともあり、MEDIASUBTYPE_RGB24、MEDIASUBTYPE_RGB32、MEDIASUBTYPE_ARGB32以外は未対応としています。
ビルドにはOpenCV 2.1が必要です。あと、dshow.hを使うのでPlatform SDKやらDirectX SDKやらその辺が必要です、多分。Platform SDKは最近更新されていないっぽいし、最新版だともしかしたらdshow.hは昔みたいにDirectXに戻ってるかも知れない。 → Windows SDKに統合されたっぽい。
» OpenCV
» Platform SDK → Windows SDK
» DirectX SDK
OpenCVを使うには、例えばC:\OpenCV2.1にOpenCV 2.1をインストールしたとすると、以下のディレクトリへパスを追加する必要があります。
・インクルードディレクトリ
C:\OpenCV2.1\include\opencv
・リンカ
C:\OpenCV2.1\lib
・システム環境変数のPath
C:\OpenCV2.1\bin
「~が開けません」ってのは.hのインクルードミス、「~が未解決です」ってのは.libのリンクミス、実行時に落ちるのは.dllが見つからないもしくはバグです。Platform SDKとかDirectX SDKは、インストールしたら勝手にパスへ追加された気がするのでOKです。まあコンパイラに怒られたら適宜追加すればよし。はあ、面倒くさい、Flashやっぱラクだわ~。
追記 10.08.10
デフォルトで使うOpenCVのバージョンを2.1に変更しました。OpenCV 1.0を使う場合はCameraEwclib2.hの最初のほうのlibファイルのリンク部分を以下のように切り替えてください。
//OpenCV 1.0
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"cvaux.lib")
#pragma comment(lib,"highgui.lib")
//OpenCV 2.1
//#ifdef _DEBUG
// #pragma comment(lib,"cv210d.lib")
// #pragma comment(lib,"cxcore210d.lib")
// #pragma comment(lib,"cvaux210d.lib")
// #pragma comment(lib,"highgui210d.lib")
//#else
// #pragma comment(lib,"cv210.lib")
// #pragma comment(lib,"cxcore210.lib")
// #pragma comment(lib,"cvaux210.lib")
// #pragma comment(lib,"highgui210.lib")
//#endif
また、C:\OpenCV1.0にOpenCV 1.0をインストールしたとすると、以下のディレクトリへパスを追加する必要があります。
・インクルードディレクトリ
C:\OpenCV1.0\cv\include
C:\OpenCV1.0\cxcore\include
C:\OpenCV1.0\cvaux\include
C:\OpenCV1.0\otherlibs\highgui
・リンカ
C:\OpenCV1.0\lib
・システム環境変数のPath
C:\OpenCV1.0\bin