OpenCV、機械学習、はやりのDeep learningの環境構築の方法、サンプルの動かし方、APIの使い方、Tipsなどをすぐに忘れてしまうので、備忘録として記録している。記憶がなくなるスピードが、早いのでメモしておかないと再現できなくなる確率が高まっている。 最近、再度HDDを飛ばしてしまい、過去の自分のページに再度助けられた。 また、DNNモジュールを触る機会が増えているので、C++からPyhonへと鞍替え中。 内容を気にいっていただければ、twitterで紹介願います。
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
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 判定結果
登録:
投稿 (Atom)