2012年7月30日月曜日

OpenCVのサンプルをVisualC++で動作させる


samples/cppにOpenCVの基本的な機能を学べるサンプルが格納されているが、コマンドラインでのmakeの使用を想定しており、VisualC++を使用する軟弱な開発者向けにはなっていない。

しかし、動作確認だけなら、以下のような手順で簡単に試すことができる。

プロジェクトの作成
プログラム自体は、VisualC++の新規プロジェクトで、Win32コンソールアプリケーションで雛形を作成し、メインcppの中身をサンプルの中身と入れ替えるだけで、コンパイルできる。

例:opencvsampleというプロジェクトを作成したなら、openxvsample.cppの中身をすべて入れ替える

もちろん、プロジェクトのプロパティで自身の環境に応じたincludeとライブラリのパスの設定は行っておく。

これでサンプルをvisualC++ビルドできる用になるが、画像のパスなどを起動時の引数で与える必要がある。

簡単に対処するには、mainの最初の書かれているであろう

    if( argc!=2 )
    {
    help();
        return 1;
    }
    string filename = argv[1];

の部分の引数検査を削除し、ファイルネームはstaticに書いてしまえばよい。


いったんやり方がわかれば、あとは中身を入れ替えていくだけで試せるが、つど、includeファイルや、ライブラリは正しくしてする必要がある。

起動方法
 デバッグ開始でコンソールが表示され、続いて画像表示用のWindowが表示される。

終了方法
 大概のサンプルは、画像表示後、ESCキーの押下で終了するような構成になっている。

OpenCV 2.4.2のsamples\cppの変更点を調べてみた


2.4.2と2.3.1のsamples\cppを比較してみた


追加されたサンプル

  • detection_based_tracker_sample.cpp
  • detector_descriptor_matcher_evaluation.cpp
  • facerec_demo.cpp
  • freak_demo.cpp
  • gencolors.cpp
  • houghcircles.cpp
  • hybridtrackingsample.cpp
  • latentsvm_multidetect.cpp
  • linemod.cpp
  • logpolar_bsm.cpp
  • opencv_version.cpp
  • OpenEXRimages_HighDynamicRange_Retina_toneMapping.cpp
  • OpenEXRimages_HighDynamicRange_Retina_toneMapping_video.cpp
  • openni_capture.cpp
  • phase_corr.cpp
  • point_cloud.cpp
  • rgbdodometry.cpp
  • stitching.cpp
  • stitching_detailed.cpp
  • videostab.cpp
  • kinect_maps.cpp


追加されたフォルダ(中身は画像)

  • rgbdodometry


追加されたマテリアル

  • board.jpg
  • facerec_at_t.txt
  • memorial.exr


変更されたコード(多くはフォーマットの違いであるが、c++のクラスに変更されたり、APIが変更されたものもある)

  • 3calibration.cpp
  • bagofwords_classification.cpp
  • bgfg_segm.cpp
  • brief_match_test.cpp
  • build3dmodel.cpp
  • calibration.cpp
  • calibration_artificial.cpp
  • camshiftdemo.cpp
  • chamfer.cpp
  • CMakeLists.txt
  • connected_components.cpp
  • contours2.cpp
  • convexhull.cpp
  • cout_mat.cpp
  • delaunay2.cpp
  • demhist.cpp
  • descriptor_extractor_matcher.cpp
  • detector_descriptor_evaluation.cpp
  • dft.cpp
  • distrans.cpp
  • drawing.cpp
  • edge.cpp
  • em.cpp
  • fback.cpp
  • ffilldemo.cpp
  • filestorage.cpp
  • fitellipse.cpp
  • generic_descriptor_match.cpp
  • grabcut.cpp
  • houghlines.cpp
  • image.cpp
  • imagelist_creator.cpp
  • inpaint.cpp
  • kalman.cpp
  • kmeans.cpp
  • laplace.cpp
  • letter_recog.cpp
  • lkdemo.cpp
  • matcher_simple.cpp
  • matching_to_many_images.cpp
  • meanshift_segmentation.cpp
  • minarea.cpp
  • morphology2.cpp
  • multicascadeclassifier.cpp
  • peopledetect.cpp
  • points_classifier.cpp
  • retinaDemo.cpp
  • segment_objects.cpp
  • select3dobj.cpp
  • squares.cpp
  • starter_video.cpp
  • stereo_calib.cpp
  • stereo_match.cpp
  • video_dmtx.cpp
  • video_homography.cpp
  • watershed.cpp
以上

OpenCVのサンプルイメージを比較した


OpenCV 2.3.1と2.4.2のsamples cppに含まれているイメージを比較してみた
2.3.1では、41個のイメージであったが、2.4.2では、42個に増えている



231 sample



242 smple

増えたのは、board.jpgであり、どのサンプルプログラムで使用するのかは、今後調べてみる

2012年7月27日金曜日

OpenCV 2.4.2 サンプルのmatching_to_many_imagesを試してみた


samples\cppにあるmatching_to_many_imagesを試してみた

問い合わせ画像と、学習用画像との特徴点を比較する
結果は、一致点を線で結んだ画像が保存される

注:
デフォルトではバグがあり保存されないので、matching_to_many_imagesフォルダの下にresultsフォルダを事前に作成して置く必要がある


デフォルトでは
特徴点 SURF
特徴量 SURF
比較器 FlannBased
が使用される


プログラムの流れを簡単に示す

1 ファイルリストからファイル名を取得し、グレースケールで読み込みMatをコレクションに登録

2 detectKeypoints
 問い合わせ用の画像のSURF特徴点の取得
 学習用画像コレクションからSURF特徴点コレクションの取得

3 computeDescriptors
 問い合わせ用の画像のSURF特徴量の取得
 学習用画像コレクションからSURF特徴量コレクションの取得
 注 2.4から、コレクションも引数に取れるようになった

 発見された特徴量の数を表示

4 matchDescriptors
 比較器に学習用画像のSURF特徴量コレクションを登録
 学習
  BruteForceMatcherは、何もしない
  FlannBasedMatcherは、flann::Indexを学習する

 比較し、一致情報を取得

5 saveResultImages
 学習用画像indexと一致情報の画像indexを比較し、maskデータの作成
 学習用画像と、問い合わせ画像を合成し、一致点を描画
 ファイルに保存



以上

OpenCV 2.4.2でSURFを使うために


2.4からライセンスの関係でSURFやSIFTがnonfreeのライブラリに移動した
使用に当たっては、
#include "opencv2/nonfree/nonfree.hpp"のインクルードと、
#pragma comment(lib,"opencv_nonfree242.lib")のライブラリの指定が必要である。
また、プログラムの起動時に、cv::initModule_nonfree();による初期化が必要になった。


このまじないを唱えずに、

Ptr<FeatureDetector> featureDetector = FeatureDetector::create( "SURF" );
Ptr<DescriptorExtractor> descriptorExtractor = DescriptorExtractor::create( "SURF" );

などを呼んでも、オブジェクトが生成されず、ヌルポになるので注意




ただし、抽象クラスを使用せず明示的なクラスを使用する場合、初期化の宣言なしでも、利用できる

SurfFeatureDetector detector(50);
SurfDescriptorExtractor extractor;

以上

2012年7月10日火曜日

OpenCV 2.3.1とOpenCV 2.4.2のライブラリの比較した


基本末尾のバージョン番号の差異であるが、2.4.2では以下の4つのモジュールが増えている
(2.4.0 2.4.1はスルーしたので、調査していない)

opencv_nonfree242.dll
opencv_photo242.dll
opencv_stitching242.dll
opencv_videostab242.dll

nonfreeは、SURFなどの特許を有するもの
photo, videostabは、扱うファイルの種類が増えたためと思われる
個人的には、stitchingが気になる。

Windows7 32bit版にOpenCV 2.4.2の開発環境を構築した


検索などでこのページを訪れる人が、数は少ないけど、コンスタントにいる。
ちょうどこの上にあるG+1のボタンを押してもらうと、Goolgeの検索に見つかりやすくなるので、ご協力いただきたい。


最新の2.4.6の記事 (7/9 追加)
Windows7 64bit版にOpenCV 2.4.6の開発環境を構築した


・開発環境Visual C++ 2010 Expressのインストール
・画像処理ライブラリOpenCV2.4.2のインストール
 およびインテル並列処理ライブラリのインストール


1 関連ファイルのダウンロード

最新(2.4.2)のopencvを
http://sourceforge.net/projects/opencvlibrary/files/latest/download
からダウンロード

Intel TBBライブラリーを
http://threadingbuildingblocks.org/ver.php?fid=187
June 28, 2012版 tbb40_20120613oss_win.zipをダウンロード

Visual C++ 2010 Expressは、インストールディスクを使用


2 Visual studio expressのインストール
Visual studio express 2010 32bit版のインストールディスクを挿入
c++ を選択してインストール
 オプションのSQLサーバ2008はインストールしない

専用ディスクがない場合は、
 http://www.microsoft.com/japan/msdn/vstudio/express/の
 C++のWebインストールを実行する

3 OpenCVのインストールと環境設定
ダウンロードした
OpenCV-2.4.2.exeを実行

c:\を指定してインストール

c:\opencvをc:\opencv242に名前を変更し移動
binフォルダーの作成
libフォルダーの作成
projectフォルダーの作成

OpenCV libのコピー
c:\opencv242\build\x86\vc10\libの内容を
c:\opencv242\libにコピー

OpenCV binのコピー
c:\opencv242\build\x86\vc10\binの内容を
c:\opencv242\binにコピー


2 tbbライブラリーのコピー
tbb40_20120613oss_win.zipフィルを展開

tbb40_20120613oss_win\tbb40_20120613oss\bin\ia32\vc10フォルダーの
tbb.dll
tbb_debug.dllを
c:\opencv242\binにコピー


4 OSの環境変数の設定(要管理者権限)

コントロールパネル、システムとセキュリティ、システムを開き
システムの詳細設定の環境変数ボタンを押し
システム環境変数のPathの編集

末尾に";c:\opencv242\bin"を追加

以上

2012年7月6日金曜日

LibSVMを使用してみた


0:準備
http://www.csie.ntu.edu.tw/~cjlin/libsvm/のDownload LIBSVMからファイルをダウンロードしPCに展開
windowsフォルダー内に、svm-scale、svm-train、svm-predictのふぁいるが存在している
windowsのコンソールアプリを使用して、下記コマンドを実行する

1:データのスケーリング
svm-scale -s c:\tmp\scale.txt c:\tmp\org.txt > c:\tmp\scaled.txt

in:
org.txt SVM形式の計測データ(クラスに分類済みであること)

out:
scale.txt 計測データのスケール範囲(後でテストデータのスケールの調整に使用)
scaled.txt スケーリングされた計測データ


補足
SVM形式のファイル
1 1:20 2:16 3:28
1 1:26 2:19 3:21
の様に行の先頭にクラスの番号、セパレータ””となり、その後ベクトルの番号、セパレータ:、値、セパレータ””の並びの繰り返しとなる


2:学習
svm-train c:\tmp\scaled.txt
in:
scaled.txt スケーリングされた計測データ

out:
scaled.txt.model モデルデータ(辞書データ)

3:テストデータのスケーリング
svm-scale -r c:\tmp\scale.txt c:\tmp\testdata.txt > c:\tmp\scaledtestdata.txt

in:
scale.txt 1で作成したスケール範囲データ
testdata.txt テスト用の計測データ(頭にどのクラスの分類データを入れておくこと)

out:
scaledtestdata.txt スケーリングされた計測データ

4;データの予測
svm-predict c:\tmp\scaledtestdata.txt c:\tmp\scaled.txt.model c:\tmp\res.txt
注意:テストデータもスケーリングが必要
Accuracy = 100% (194/194) (classification)
ここ出力されるAccuracyは、テストデータに付与されたクラスデータの正確度を示す
間違う場合もある。どのデータが間違いなのかは、res.txtを見ることで確認できる


in:
scaledtestdata.txt スケーリングされたテストデータ
scaled.txt.model 2で作成したモデルデータ

out:
res.txt 判定結果