2013年2月7日木曜日

OpenCVで指定した色の物体を追跡するデモを試してみた


指定した色を有する物体を追跡するデモが、samples\cpp\camshiftdemo.cppで提供されている

ビルドして、コマンドライン引数にカメラ番号を与えて起動すればよいが、めんどくさい場合は、ソースのcap.open()にカメラ番号を直接指定し、ビルドすればよい


大まかな処理の流れ

1 マウスで初期エリアを指定
2 マスク画像の作成
3 RGBからHSV変換し、H画像の取得
4 指定エリアのヒストグラムを計算、正規化、描画
5 ヒストグラムを元にBackProjectionを計算
6 計算結果にマスクをかける
7 CamShiftにより対象エリアの計算
8 次回探索枠の計算
9 結果の表示

であり、2-9を繰り返すことになる


2 マスク画像の作成
inRange(hsv, Scalar(0, smin, MIN(_vmin,_vmax)),Scalar(180, 256, MAX(_vmin, _vmax)), mask);

で H  0-180 (全部)
    S smin - 256 再度の小さい画素は使用しない
  V 明るさ vmin-vmax 黒つぶれ、白とび部は、色相がずれるので使用しない
を指定し、色ベースの追跡を行う画素の選別をしておく

あとで、calcBackProjectの結果とandをとっているが、backproj &= mask;
calcHistの計算時にmaskをかけてもよい気がする

7 CamShift
  meanShift()の改良版 WindowのサイズとWindowの方向性も検出できる
 
CamShift(backproj, trackWindow, TermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ));

  3番目のパラメータは、停止条件であり、CV_TERMCRIT_EPS(精度) 10 または、CV_TERMCRIT_ITER(繰り返し数) 1で停止する
 
  デモでは、ゆるい条件設定になっており早く、終了する

その他
calcBackProjectのtutorialでは、backprojをMatNDで宣言していたが、このデモでは、Matで宣言しているので、あまり厳密に区別しなくてよいみたいだ




0 件のコメント:

コメントを投稿