『 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 SDKWindows 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

« 
» 

Leave a Reply