UVCのカメラ画像をOpenCVで操作(Windows Vista sp1)

OpenCVの設定で、またはまりました(T_T)
自分用のメモ書きです。

命題:
ドライバインストール不要の、UVC(USB Video Class)インターフェイスで
取得したカメラ画像をOpenCVで操作せよ。

なぜこれが命題になるか。
OpenCVでカメラ画像処理をする場合は、「cvCreateCameraCapture」関数を使用して
画像のキャプチャを行いますが、対応しているカメラインターフェイスは以下の4つ。
Windows:
1.Video for Windows(VFW)
2.Matrox Imaging Library(MIL)
Linux:
3.Video for Linux(V4L)
4.FireWire(IEEE1394)

つまり、ドライバインストール不要!!という言葉に騙されて、
UVCで嬉々としてOpenCVで画像処理をしようとしても、何もできません(T_T)
しかし、画像処理はOpenCVを使いたい!!
同じことを考え、実行してくれた偉大なる先人の知恵を
ここにまとめます。

[参考]
http://opencv.jp/opencv/document/opencvref_highgui_video.html#highgui_video

環境:
OS:Windows Vista sp1
VC:Visial C++ 2008 Express Edition
DirectX SDK:dxsdk_march2008

やることリスト:
1.DirectX SDKをインストールする。
2.DirectShowを便利に使えるクラスをダウンロードさせて頂く
3.DirectShowで取得したデータをOpenCVで使用できるデータにするクラスを
  ダウンロードさせて頂く。
4.上記の1.2.3.を合わせた環境を作成する。

偉大なる先人様が難しい部分を作成して下さっているので、
たった4つの手順で、できるようになります。

1.DirectX SDKをインストールする。
 今回はWindowsで行います。
 Windowsでカメラ画像を取得するにはDirectXのDirectShowという機能を
 使用します。DirectShowはUVCに対応しています。
 VCはお好きな環境を各自構築してください。

 詳細は省略します。インストーラを落として起動、あとはウィザードの言うとおりにすればOKです。

 [ダウンロードURL]
 http://www.microsoft.com/downloads/details.aspx?FamilyId=572BE8A6-263A-4424-A7FE-69CFF1A5B180&displaylang=en

2.DirectShowを便利に使えるクラスをダウンロードさせて頂く
 EWCLIBという、DirectShowを簡単に使えるようにしたクラスがあります。
 こちらを作成者様に感謝しながらダウンロードさせて頂きます。

 [ダウンロードURL]
 http://www.geocities.jp/in_subaru/ewclib/index.html

3.DirectShowで取得したデータをOpenCVで使用できるデータにするクラスを
  ダウンロードさせて頂く。

 上記2.のEWCLIBを駆使して、UVCで撮ってきた画像データをOpenCVで使用できるデータに
 (つまりIplImage型)にしてくれるクラスとコンパイル環境をアップして頂いているので
 こちらも作成者様に感謝しながらダウンロードさせて頂きます。

 [ダウンロードURL]
 http://wikiwiki.jp/masayashi/?OpenCV%2FDirectShow%A4%C7%A5%AD%A5%E3%A5%D7%A5%C1%A5%E3%A4%B7%A4%BF%B2%E8%C1%FC%A4%F2%C9%BD%BC%A8%A4%B9%A4%EB

4.上記の1.2.3.を合わせた環境を作成する。
 あとはコンパイルして実行するだけですが、わざわざ1項目やることリストに加えたということは
 いろいろ設定するということです。

 4-1.VCの設定
  VCにOpenCVの設定をします。
  インクルードとライブラリのパスを設定する必要があります。

  [参考]
  http://webcs.sit.ac.jp/wiki/index.php?OpenCV#kf385e24
 
 4-2.qedit.hの修正
  DirectXからはqedit.hをインクルードするのですが、 qedit.hがさらに
  インクルードするdxtrans.hがmarch2008のDirectX SDKには含まれておりません。
  当然コンパイルエラーになるので、qedit.hを修正します。
  4-2-1.#include "dxtrans.h"をコメントアウトする。
  4-2-2.: public IDXEffectと継承している部分をみつけすべてコメントアウトする。
  
  [参考]
  http://d.hatena.ne.jp/denpafreak/20080117/1200666936

 4-3.DirectShow.cppの修正
  最新のEWCLIBを使用した場合は、EWC_Openの引数の数が違うと怒られるので、
  第1引数を削除します。

 4-4.ewclib.hの修正
  EWC_Openの消えた第1引数をそのままにしておくと、場合によって
  画像が2重3重になり、色もグレースケールになったりすることがあります。
  そんな時は、EWC_TYPEを以下のようにしてみましょう。
  #define EWC_TYPE MEDIASUBTYPE_RGB24

  [参考]
  http://d.hatena.ne.jp/sakusan_net/searchdiary?word=DLL

 4-5.特殊な事情のある方
  画像処理が終わってもアプリは終了しない用途で使用する場合は、
  main.cppのmain関数にあるframeの初期値をNULLにしてあげましょう。

以上で設定終了です。
UVCカメラインターフェイスでOpenCVを使用して、
カメラキャリブレーションが正常に行えることを確認しました。

 

この記事へのコメント

やまかわ
2016年10月05日 12:58
参考にさせていただきました。
こちらの方法を試すと、opencvをサポートしてないカメラでも認識可能になるのでしょうか?
T_T
2016年11月16日 07:15
やまかわ様

UVCに対応していればキャプチャできます。
GUIはお好きなものをお使いください。

この記事はかなり古いので、
いまはもっと便利になっていると思います。

この記事へのトラックバック

  • 開発日誌/2009-12-01

    Excerpt: 【GSCAN】 今日の作業 -- 松田 デモ向け調整 動画フレーム画像取得のエラー処理を追加しました。 素材を更新しました。 スキャン中プログレスバーの位置を調整しました。 キャプチャ画像の表示範.. Weblog: NBGI (PukiWiki/TrackBack 0.4) racked: 2009-12-01 22:03
  • 開発日誌/2009-12-01

    Excerpt: 【GSCAN】 USBカメラでVista,Windows7で動かない場合がある件 -- 三浦 いろいろ調べたところWindows Vista以降ではVideo for Windowsの対応が徐々に.. Weblog: NBGI (PukiWiki/TrackBack 0.4) racked: 2009-12-01 22:27
  • 【ベアHDDを手軽に外付け】USB変換アダプター「USB-CVIDE7」

    Excerpt: 内蔵型HDD/SSDを外付けできるUSB変換アダプター Weblog: ぱふぅ家のサイバー小物 racked: 2019-02-17 10:50