2013年2月7日木曜日

OpenCVで傾いた画像をまっすぐにする


調べ物をしていて偶然見つけたブログのメモ

2つの点から傾きの角度を計算し、画像の中心点を与えてアフィン変換用のmatrixを求め、アフィン変換を行う

  cv::Mat r = cv::getRotationMatrix2D(center, angle, 1.0);
   cv::Mat dst;
   cv::warpAffine(im0, dst, r, im0.size());

ほかにも役立ちそうな内容が掲載されている。

OpenCVで指定した色の物体を追跡するデモの補足


OpenCV 2 Computer Vision Application Programming CookbookのP108に meanShiftを使用した物体検出のデモが掲載されている

こちらでは、RGBからHSVへの変換後、cv::splitで std::vector<cv::Mat>に変換し、v[0]で、Hueデータにアクセスしている

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で宣言しているので、あまり厳密に区別しなくてよいみたいだ




OpenCVのコマンドパーサーについて


OpenCV 2.3からコマンドラインの引数を解析するモジュール cv::CommandLineParser が提供されている

なぜか、OpenCV 2.4.3 documentationの検索では、説明を見つけることができなかったが、ドキュメントはここに準備されている

コマンドラインに与えられた引数を、get<T>("name")または、get<T>(index)で取得できる

2013年2月6日水曜日

OpenCVでバーコードの読み取りがサポートされるかも


OpenCVの関係者の定例meetingの議題にバーコードが取り上げられており、zxingと協力を検討しているようだ

今後、zxingへのコンタクトが、アクションアイテムに含まれている

OpenCVのBack Projection試してみた2


Back Projectionがよくわからないので、tutrialを試してみた。
ソースは、samples\cpp\tutorial_code\Histograms_MatchingのcalcBackProject_Demo2.cppを使用した

Demo2の説明は、残念ながら準備されていないようだが、ソースを追えば、処理内容は理解できる。

今度は、トラックバーがbinの数ではなく、Floodfillnの範囲を指示するために使用している。

また、ヒストグラムの計算と、calcBackProjectでは、Floodfillで作成したマスク画像を使用している。

Maskすることの効果は、何か理解できていない

参考にプログラムを実行した図を載せておく


OpenCVのBack Projection試してみた


Back Projectionがよくわからないので、tutorialを試してみた。

ソースは、samples\cpp\tutorial_code\Histograms_MatchingのcalcBackProject_Demo1.cppを使用した

コードの説明は、ここに記載されており、各処理に関しての説明が記載されているが、これを読んでも何ができるのかよく理解できなった。

いろいろ調べた結果、Back Projectionの役割に関しては、OpenCV 2 Computer Vision Application Programming CookbookのP103のほうがわかりやすい。

元のROIのヒストグラムを計算しヒストグラムを特徴量として、基準画像と比較対処の画像の類似度を求めるのが、calcBackProjectという理解をした