えーと、今日からfc2からアメブロに移行しようかと思いブログを書きました。
前のブログはこちらから。
http://rorimon.blog32.fc2.com/

今回は「OpenCV」というC/C++用のライブラリを使って顔認識プログラムを作ったのでメモ。
ドライバインストール不要の、UVC(USB Video Class)インターフェイスを使用したのですが、OpenCVの「cvCreateCameraCapture」関数では対応していなかったのでド壺にはまりましたorz
ちなみに対応しているカメラインターフェイスは以下の4つ。

Windows:
1.Video for Windows(VFW)
2.Matrox Imaging Library(MIL)
Linux:
3.Video for Linux(V4L)
4.FireWire(IEEE1394)

自分の環境。

・Windows Vista SP1
・Visial C++ 2008 Express Edition
・dxsdk_march2008

早速メモメモ。

1.「OpenCV」をインストールする
まず下のダウンロード先から「OpenCV_1.0.exe」をダウンロードして、インストールする。
[ダウンロードURL]
Open Computer Vision Library

ここで気を付けなければいけない点は、「OpenCV_1.1pre1a.exe」をインストールするとなぜか不具合が起きる。
なぜかは解明してませんが、「OpenCV_1.0.exe」をインストールすることをお勧めする。
また、デフォで「OpenCV」のインストール先は「C:\Program Files\OpenCV」となっているが、Vistaで「Program Files」にインストールすると制限がかかって不具合が起こるので、適当にCドライブに「Software」というフォルダを作ってそこにインストールすると良い。
今回は「C:\Software\Develop\OpenCV」に置いた。

2.「DirectX SDK」をインストールする

今回はWindowsで行いました。
Windowsでカメラ画像を取得するには「DirectX」の「DirectShow」という機能を使用する。
「DirectShow」はUVCに対応している。
[ダウンロードURL]
DirectX Software Development Kit

3.「DirectShow」を便利に使えるクラスをダウンロードさせて頂く

「EWCLIB」という、「DirectShow」を簡単に使えるようにしたクラスがある。
こちらを作成者様に感謝しながらダウンロードさせて頂きます。
[ダウンロードURL]
Easy Web Camera LIBrary by I.N. 2008/2/19

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

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

5.上記の2.3.4.を合わせた環境を作成する

5-1.「Visual C++」の設定
「Visual C++」(以下、「VC」)にOpenCVの設定をします。
VCで新規プロジェクトを作成。メニューの「ファイル」から「新規作成」→「プロジェクト」と選択し、「Win32 コンソール アプリケーション」のプロジェクトを作成して、適当なプロジェクト名をつける。
なお、プロジェクト作成の際、「追加のオプション」から「プリコンパイル済みヘッダー」のチェックボックスを外しておく。
そしてインクルードとライブラリのパスを設定する必要がある。
メニューの「ツール」→「オプション」から「プロジェクトおよびソリューション」→「VC++ディレクトリ」で「ディレクトリを表示するプロジェクト」を「インクルードファイル」にして、以下を追加する。

C:\Software\Develop\OpenCV\otherlibs\highgui
C:\Software\Develop\OpenCV\otherlibs\cvcam\include
C:\Software\Develop\OpenCV\cxcore\include
C:\Software\Develop\OpenCV\cvaux\include
C:\Software\Develop\OpenCV\cv\include

同じように、「ディレクトリを表示するプロジェクト」を「ライブラリファイル」にして下を1行入力する。

C:\Software\Develop\OpenCV\lib

また、Windowsの環境変数のPATHに以下を追加する。

C:\Software\Develop\OpenCV\bin

次に、ディレクトリを追加する。
これはプロジェクトを作成するごとに設定しないといけない。
メニューの「プロジェクト」から「プロパティ」を選択する。
「構成」で「すべての構成」を選択し、左側のツリーから「C/C++」タブを選択し、「追加のインクルードディレクトリ」にインストールしたOpenCVのホームディレクトリの下の以下のディレクトリを追加する。

cxcore\include, cv\include, otherlibs\highgui, cvaux\include.

今度は、ライブラリへのリンクをはる。
「リンカ」タブを選択し、「追加のライブラリディレクトリ」に「OpenCV」ディレクトリ下の「lib」ディレクトリを追加する。
(例:C:\Software\Develop\OpenCV\lib)
続いて、「構成」を「Debug」に変更し、「リンカ」タブを展開した中の「入力」を選択し、「追加の依存ファイル」で以下を追加する。

「cxcore.lib」, 「cv.lib」, 「highgui.lib」, 「cvaux.lib」

以上で設定は完了。
詳細なマニュアルなどは、以下のサイトで見ることができるので参照する。

OpenCVリファレンスマニュアル(日本語訳)

5-2.「qedit.h」の修正
「DirectX」からは「qedit.h」をインクルードするが、「qedit.h」がさらにインクルードする「dxtrans.h」が「march2008」の「DirectX SDK」には含まれてない。
当然コンパイルエラーになるので「qedit.h」を修正する。
「qedit.h」の場所は「C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include」に入っている。
なので修正する場合は一度コピーして、「Program Files」から出して修正するとよい。
修正箇所は5ヵ所。

・「#include "dxtrans.h"」をコメントアウトする
・「: public IDXEffect」と継承している部分を見つけてすべてコメントアウトする

自分の環境では以下のようになった。

//#include "dxtrans.h" ・・・ 498行目

IDxtCompositor //: public IDXEffect ・・・ 837行目

IDxtAlphaSetter //: public IDXEffect  ・・・1151行目

IDxtJpeg //: public IDXEffect ・・・1345行目

IDxtKey //: public IDXEffect ・・・1735行目

[参考]
DirectX SDK November 2007にdxtrans.hが入っていない件について

以上でUVCカメラインターフェイスで「OpenCV」を使用して、カメラキャリブレーションが正常に行えるはず‥‥。
もし「○○.dllが見つからない」などのエラーが出た場合は、そのdllをメインプログラムと同じディレクトリに配置してあげるとエラーが消えます。
続いて顔認識プログラムの作成。

6.顔認識プログラムの作成

「OpenCV」にはあらかじめ学習された「顔」情報が用意されている。
そのため簡単に顔認識を行うことができる。
今回はその情報を利用させてもらった。
これがそのメインプログラム。

Camera.txt

プログラムファイル(.cppファイル)が欲しい方は下記から.

Camera.cpp

上のプログラムで使用されている学習済み顔画像「haarcascade_frontalface_default.xml」は、「OpenCV」インストールディレクトリ下の「data\haarcascades」にあるので、コピーをするかプログラム中でパスを指定するとよい。
実行画面は以下のようになった。

ふじもんのブログ-1

ちゃんとカメラを利用して顔認識しています。
プログラム初心者にはちょっと難しかったですorz

<補足2>
最新版の「DirectX SDK」をインストールすると、「EWC_Open」の引数の数が違うと怒られるので、第1引数を削除します。そして、「EWC_Open」の消えた第1引数をそのままにしておくと、場合によって画像が2重3重になり、色もグレースケールになったりすることがあります。そんな時は、「EWC_TYPE」を以下のようにします。

#define EWC_TYPE MEDIASUBTYPE_RGB24

[参考URL]
さくさんの日記



あまりまとめきれずに書いたので誤字・脱字がありますがご了承くださいm(-_-)m
今は「Java」から「OpenCV」を利用しようとしているのですがまだうまくいってませんorz
うまくいったらまたまとめます。
ご意見・ご感想等ありましたらコメントでもいいのでお申し付けください。

それじゃバイニー(´・ω・)ノシ
AD