んで,ネイティブにインストールしたRC2にOpenCV1.0いれてキャプチャしてみたら・・・動かない.
orz...
追記.できないと思っていたら,どうもUSBドライバが悪さをしていたらしく,入れ直したらうまくいった.よかったよかった
ってやればいいわけだけど,これと同じ事がcvMat構造体でもできる.すなわち,IpliImage ipliImage;
int r,g,b,i,j;
r =(uchar) ipliImage->imageData[i *ipliImage->widthStep+ j * ipliImage->nChannels + 2];
g =(uchar) ipliImage->imageData[i *ipliImage->widthStep+ j * ipliImage->nChannels + 1];
b =(uchar) ipliImage->imageData[i *ipliImage->widthStep+ j * ipliImage->nChannels + 0];
でOK.CvMat cvMat;
r = cvMat->data.ptr[i *ipliImage->widthStep+ j * ipliImage->nChannels + 2]);
g = cvMat->data.ptr[i *ipliImage->widthStep+ j * ipliImage->nChannels + 1]);
b = cvMat->data.ptr[i *ipliImage->widthStep+ j * ipliImage->nChannels + 0]);
ちなみにビデオカメラのモデルはSONY DCR-PC300.
だれかやりかた知ってたら教えてくれ〜
生成した識別器の能力を調べる方法として,"performance.exe"がある.これはhaartraining.exeで作った識別器データを使って,物体の座標と大きさ及び画像ファイル名を指定したテストファイルを読み込むことで,その物体が抽出されたか,他の関係ない物体は抽出されなかったか,等をはき出してくれる.また検出結果は画像ファイルとしても保存される.
テストファイルとは,例えばこんな感じ.
最初が画像ファイル名で,2番目が物体の数.で後は座標(左上)と大きさを物体数分書く.画像ファイルのパスはテストファイルからみた相対パス.この場合だと,同じフォルダにある.lena.jpg 1 180 180 210 210
テストファイル"test/test.txt"を作成したら,次のコマンドで実行する.
-dataが利用する識別器,-infoがテストファイル.実行すると,コマンドプロンプトにHitsとMiss,Falseが表示され,それぞれ正しく検出,未検出,誤検出となる.performance.exe -data classifier/test -info test/test.txt -w 24 -h 24
ポジティブサンプルを作成したら,次はいよいよトレーニング.
"-data"引数には作成するカスケード識別器名を記述する.ここではclassifierディレクトリの下のtestディレクトリとして作成される.testディレクトリの下に,トレーニング後の各ステージのパラメータがテキストとして保存される.haartraining.exe -data classifier/test -vec vec/positive.vec -bg bg/negative.txt -npos 100 -nneg 100 -mem 2000 -minhitrate 0.90 -maxfalsealarm 0.01 -nstages 3 -w 24 -h 24
"-vec"引数にはcreatesamples.exeで作成したポジティブサンプルデータを指定する.
"-bg"引数にはネガティブサンプル画像を指示したbackgroundファイルを指定する.中身はこんな感じ.
"-npos", "-nneg"はそれぞれ使用するポジティブ及びネガティブサンプル数.ネガティブサンプルは指定したファイルから自動的に切り取られて作成されるので,"-nneg"=画像数としなくても良い(みたい?).../negative_samples/neg_1.jpg
../negative_samples/neg_1.jpg
...
../negative_samples/neg_100.jpg
"-mem"引数にはPCがプログラムに割り当てるメモリー量を設定する.この値が大きければ一時的に使用する変数を常に確保して処理できるので速く処理が進む(らしい).
"-minhitrate"引数には各カスケードステージで保証する検出率を指定する.最終的な検出率は後の"-nstages"引数により,-minhitrateの-nstages乗となる(0.90%,10stagesなら0.35%, 0.99なら0.90).
"-maxfalsealarm"引数には各カスケードステージで保証する誤検出率を指定する.最終的な誤検出率は"-nstages"乗となる(0.01%,10stagesなら1E-20%, 0.1%なら1E-10%).
"-nstages"はカスケードステージ数.上述のように,ステージ数は最終的な検出率・誤検出率に影響する.当然増やせば処理時間がかかる.
"-w, -h"引数にはポジティブサンプルのサイズを指定する.
実行すると,コマンドプロンプトにいろいろ表示されて,トレーニングの様子がわかる.
ちなみに,
ディレクトリの初期構造は以下の通り.各exeファイルはOpenCVのインストールディレクトリから取ってこよう(ひょっとするとビルドし直さないといけないかも?).
bg/
negative.txt
classifier/
positive_samples/
pos_1.jpg
pos_2.jpg
...
pos_100.jpg
negative_samples/
neg_1.jpg
neg_2.jpg
...
neg_100.jpg
test/
lena.jpg
test.txt
vec/
xml/
createsamples.exe
facedetect.exe
haarconv.exe
haartraining.exe
performance.exe
positive.txt
OpenCVの顔検出プログラム"facedetect.exe"では,"haartraining.exe"で学習したxmlファイルを利用している.これはサンプルとしてOpenCVに付いてくるのだが,他の物体を検出したい場合は自作しないといけない.
トレーニングするには,検出したい物体を含んだ"ポジティブ"サンプルと,検出したい物体を全く含んでいない"ネガティブ"サンプルが必要になる.それぞれのサンプルは画像ファイル.
ポジティブサンプルファイルには物体が複数含まれていても良いし,サイズの上限は特にない?(未確認),全てのファイルが同じサイズ,つまり物体の領域で切り抜いた画像ファイルになっていても良い.ただし,トレーニングするときに画像ファイル中の物体数とそのxy座標(左上原点),物体のサイズを指定する必要があるので,あらかじめ物体領域を切り出しておいて,サイズを全て揃えておいた方が楽なのかもしれない.
ネガティブサンプルには物体が含まれていなければ良いだけなので,特に気にしなくても良いと思うが,簡単な特徴ばかりの画像を持ってくるとあまり意味がない(同じ画像だらけになる)ので,複雑な背景画像を持ってきた方が良いかもしれない(未確認).
最初に,自分で集めたポジティブサンプル画像を,haartraining.exeが読み込めるデータに変換する.
"positive.txt"に画像ファイルへのパスと,含まれる物体数及び座標を記述する."positive_samples/"の下にある画像を参照するこの例だと,createsamples.exe -info positive.txt -vec vec/positive.vec -num 100 -w 24 -h 24
とする(当然pos_100.jpgまで書く).ここでは画像ファイルそのものが24x24の物体だとした.positive_samples/pos_1.jpg 1 0 0 24 24
positive_samples/pos_2.jpg 1 0 0 24 24
画像のある位置に物体が含まれているような,例えば人が写っていて人の顔を物体として検出するような場合,例えば"lena.jpg"(C:/Program Files/OpenCV/samples/c/にあり)なら,
といった具合に指定する.lena.jpg 1 200 200 180 180
その他の引数は,"positive.vec"が生成されるデータファイル名,-numの引数がポジティブサンプル数,-w, -hは物体の基本画像サイズ.このサイズが検出する時の最小物体画像サイズになるので注意.
次回はhaartraining.exeについて書こう.
最初,ビルドは成功するんだけど、実行したらエラーがでて動かない。どうも"cvCaptureFromCAM()"関数が使えないという状況.理由がわからずしばし悩んだが,OPenCVのsampleプロジェクトはコンパイルできるので(同じ関数が使われてる),両者の違いを調べてみると,プロジェクトのプロパティで,"全般→マネージ拡張"が違うことに気づく.自分のプロジェクトは"はい"になっていたので,"いいえ"にすると見事実行できた.

DirectShowに比べてかなり簡単.数十行でキャプチャしてデータ取得して表示できる.あぁ,最初っからOPenCVがあれば良かったなぁ(あったのかなぁ...).
これから画像処理系勉強する人,OPenCV使った方がいいかもよ.
あ,ちなみに動作確認したUSBカメラはpersolのPBC003っていう一昔前のやつ.もう売ってないですね...たぶん主要なメーカのやつなら大丈夫でしょう.
![]() | PBC003 USB2.0対応WEBカメラ・ヘッドセットパック () パーソル この商品の詳細を見る |
あと,Logitech(ロジクール?)のQV-700N Qcam for NoteBooks Proっていうのでも確認できましたよ.
![]() | LOGICOOL QV-700N Qcam for NoteBooks Pro (2002/11/29) ロジクール この商品の詳細を見る |


















