2013年5月30日木曜日

OpenCVの特徴点比較のサンプルをまとめてみた


samples\cppに格納されている特徴点検出のサンプルプログラムをまとめてみた。

brief_match_test.cpp
特徴点 Fast
特徴量 Brief
比較 BFMatcher NORM_HAMMING

descriptor_extractor_matcher.cpp
特徴点 指定
特徴量 指定
比較 指定

freak_demo.cpp
特徴点 SURF
特徴量 FREAK
比較 BFMatcher NORM_HAMMING

generic_descriptor_match.cpp
特徴点 SURF
特徴量 SURF
比較 FERN
 引数指定で変更可能となっているが、対象はFERNのみのようだ

matcher_simple.cpp
特徴点 SURF
特徴量 SURF
比較 BFMatcher NORM_L2

matching_to_many_images.cpp
特徴点 SURF
特徴量 SURF
比較 FlannBased
 引数指定で変更可能

以下の2つは各方式の性能比較を行うためのサンプルのようだ

detector_descriptor_evaluation.cpp

detector_descriptor_matcher_evaluation.cpp

2013年5月29日水曜日

Windows7 でファイル名を連番にする

OpenCV用に集めた画像を管理するために、ファイル名に連番を付与したい場合がある。
以下は、専用ツールを使用せずに行う方法である。


  1. エクスプローラで、対象のファイルが保存されているフォルダーを開く
  2. 連番を付与したいファイルを選択する
  3. 選択されている状態で、右クリックの名前の変更を指示する
  4. ファイルの名前の変更モードになるので、識別用の名前をつける

         例 testimage

すると、選択されている画像は、 testimage(1)というように連番つきのファイル名に変更される。

補足
50番から付与したい場合は、一旦番号を付与したあと、再度選択し、testimage(1)を testimage(50)に変更すれば50番からの連番になる

OpenCVの特徴点比較のサンプルを試した 2

samples\cpp\descriptor_extractor_matcher.cppを、right06.jpg、left06.jpgの画像を使用して特徴点の比較を行った。

プログラムは、matcher_simple.cpp と比較して機能が追加されている

・ 特徴点検出、特徴量取得、特徴点の比較の方式を指定できる
  正しい組み合わせを指定しないとエラーとなる
・ 特徴点の比較で、クロスチェック方式を指定できる
  (Aの画像とBの画像の特徴点の双方で、相手の点が一番スコアがよい組み合わせのみ選択)
・ 画像を一枚しか指定しない場合は、1枚目の画像をランダムに変形させて比較できる

今回、SURF SURF FlannBased CrossCheckFilterの組み合わせで、比較した結果を示す。


以上

2013年5月28日火曜日

OpenCVの特徴点比較のサンプルを試した

samples\cpp\matcher_simple.cppを、right06.jpg、left06.jpgの画像を使用して特徴点の比較を行った。

プログラム処理は、

SURFを使用して2枚の画像の、特徴点と特徴量を求め、

BFMatcher matcher(NORM_L2);

で対応する点を求め

drawMatches

で結果を描画している。

対応点の検出方法が、もっとも簡単なものなので間違った対応付けも多い




補足
2.4.5では、SurfFeatureDetectorがドキュメントには、掲載されていないが使用できる状態である。

ドキュメントでは、FeatureDetector::createで、detectorTypeに、"SURF" 指定する方法が掲載されており、こちらが推奨されているように思われる。

2013年5月27日月曜日

OpenCVのソースコードの解析ドキュメント


検索中に見つけたものであるが、2.4.4のソースを解析したドキュメントがここに公開されている

Filesの中を見ると各ファイルの依存関係が図示されている

OpenCVのサンプルプログラム segment_objects.cppを動かしてみた


samples\cpp\segment_objects.cppをC:\opencv245\samples\gpu\768x576.aviで試してみた

helpによると、このサンプルは、背景差分で得られた接続された要素をきれいにする簡単な方法を示すものだそうだ

処理の内容

main関数内で、動画像ファイル(カメラからの入力画像)を読み取り

BackgroundSubtractorMOGを使用して
(update_bg_modelは、背景の更新を行うかを示すフラグ)

前景と背景を求めている

求めた後、refineSegments内で、得られた前景画像に対して

膨張3回、収縮6回、膨張3回を行い、その後、

findContoursで輪郭を検出

検出された各領域の面積を求め、

最大面積を有する輪郭のみ結果の画像として描画している


処理結果画像



本来は、真ん中のように最大物体しか表示しないが、わかりやすいように、右図のようにすべての前景を表示させてみた

dilate(temp, temp, Mat(), Point(-1,-1), niters);
の後に
imshow("temp", temp);を追加

OpenCVの記事が、Interface 2013/7月号に掲載されている。



5/25日に発売されたInterface 2013/7月号の特集がカメラx画像処理であり、5章から8章までOpenCVを使用した内容となっている。

Windows版、2.3.1をベースにしているが、サンプルソースは、2.4.5でも動くと思われる。

2013年5月23日木曜日

複数のバージョンのOpenCVを共存させる


最新版がリリースされてもバグがある可能性があるため、全面的に切り替えるにはリスクを有する
それゆえWindows7で、複数のOpenCVを共存させて、一時的に切り替えて試験をしてみて、問題がなければ切り替えて方がよい。


一時的に切り替える場合のポイントは3つ

1 圧縮ファイルを区別してフォルダーに展開しておく
  例 フォルダーにバージョン名を含める

2 環境変数のパスは、使用したいバージョンのパスを設定する

3 プログラムを開発する場合には、Visual C++ 2010 Expressの設定ファイルのパスを切り替える
  C:\Users\ユーザ名\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.propsのIncludePathとLibraryPathを使用したバージョンのパスに書き換える


一時的に切り替えるには、2,3の書き換え後、一旦ログオフして、再度ログインすればよい


書き換えがめんどくさい場合には、アカウントを複数もうけ、アカウントごとに、2,3の使用したいバージョンを設定しておけばよい

この場合、プロジェクトファイルが各アカウントが共通にアクセスできるフォルダーにおく必要がある。

2013年5月20日月曜日

OpenCV 関連書籍



OS X とiOS のためのOpenCV 環境構築ガイド という本が、6月10日に発売予定とのこと
税込価格 3,150円なので、MacでOpenCVを扱う場合に、役立つかも知れません

OpenCVのバージョンが書いていないところが気になりますが、CUDAやOpenNIとの連携にも触れられています。

OpenCVでパノラマ画像を作成してみた


2.4.2からパノラマ画像を簡単に作成する Stitcher クラスが提供されており、このStitcherのstitch関数を使用するだけでよい

入力は、合成したい画像を std::Vector<cv::Mat>に格納したもの
出力は、合成されたcv::Matとなる

なお、計算時間は非常にかかるため、最初は、QVGAぐらいのサイズで3枚くらいで試してみたほうがよいだろう

また、画像の並びは、3枚の場合を例にすると、左、真ん中、右、あるいは、 右、真ん中、左のどちらでもよい。
  他の並びでは、3枚ではなく2枚が選択されパノラマ画像が作成される


PCでGPUが使用できる場合、GPUフラグをtrueにすれば処理時間が短くなるかも知れない


sampleのソースがsamples\cpp\stitching.cppに提供されている。
stitching_detailed.cppは、原理がわかるようにOpenCVの関数を組み合わせて実現している。

2013年5月14日火曜日

OpenCVが動作するインテリジェントカメラArmadillo-810を見学した


先週開催されたESECにOpenCVが動作するインテリジェントカメラ Armadillo-810が出展されていたので見学してきた。

開発したのは、アットマークテクノであり、カメラモジュールは、シキノハイテックである。

アットマークテクノの人にいくつか話を伺ったところ、

 OpenCVの処理はCPUで行われており、DSP、GPUなどは使用していない
 高速化は、NEONを使用してほしいとのこと
 開発方法は、ここに公開されている
  

デモがいくつか展示されていたが、800MHzでは、処理能力が不足と感じられた。

デフォルトでは、USBインタフェースを有しており、PCに接続すればそのままUSBカメラとなる
有線、無線インタフェースも別売りされている。

デモシステムを小型で実現できるが、価格が5万2500円なので個人での購入には高価かと思われる。

2013年5月8日水曜日

OpenCVで2つの領域の重なり具合を求める



先ほど、2つ領域の重なり判定は、4隅の点が含まれているかを判定すればできると書いたが、もっと簡単な方法があった。

以下に例を示す

cv::Rect rect1(2,2,2,2);
cv::Rect rect2(3,3,2,2);
cv::Rect rect3(4,4,2,2);

cv::Rect rect4 = rect1 & rect2;
cv::Rect rect5 = rect1 & rect3;

rect4は、1と2の重なっている部分の領域(3,3,1,1)となるが、rect5は、(0,0,0,0)となる。

OpenCV任意の点が特定の領域の含まれているかどうかを判定する




(座標は省略)

cv::Point p;
cv::Rect rect;

if (rect.contains(p)) {
  //
  // 含まれている
  //
} else {
}


領域同士の重なりは、片方の4隅の点が、上記を利用し含まれているかどうか見ればよい。

ゲームでは、領域の重なりは当たり判定としてよく使われ、もっと簡単な方法で判定されている。

OpenCVによる画像局所特徴抽出に関して


OpenCVでは、Keypoint(特徴点)の検出と、特徴量の取得にSIFTやSURFが提供されているが、その他、FAST, BRIEF(2.2), ORB(2.3), BRISK(2.4.3)なども提供されている。

画像で試してみるとそれぞれ、結果が異なるがどのような性質を持っているかは、わかりにくい

中京大学の藤吉先生がチュートリアル提供されており、各方式の違いをわかりやすく説明されている。

資料は、ここここ

  藤吉先生は、MIRU2013で講演されます。



また、海外のBlogには、SURF, FREAK, BRISKの比較があります。