ここからC++専用を選択してダウンロードを行う
ダウンロード後に実行権を付与し、インストールを行う
新規のC++のプロジェクトを作成
インクルードパスの設定
メニュー > ツール > オプションを選択
コード支援 > C++のタブを選択
追加ボタンを押し、 /usr/local/includeを指定
ライブラリの設定
プロジェクトを選択し、右クリックでメニューを表示 プロパティを選択
リンカーを選択し、すべての構成にする
追加のライブラリディレクトリに、/usr/local/libを追加する
また、ライブラリにOpenCVを追加する
その後main内部にプログラムを記述し、プロジェクトの実行を指示
以上
OpenCV、機械学習、はやりのDeep learningの環境構築の方法、サンプルの動かし方、APIの使い方、Tipsなどをすぐに忘れてしまうので、備忘録として記録している。記憶がなくなるスピードが、早いのでメモしておかないと再現できなくなる確率が高まっている。 最近、再度HDDを飛ばしてしまい、過去の自分のページに再度助けられた。 また、DNNモジュールを触る機会が増えているので、C++からPyhonへと鞍替え中。 内容を気にいっていただければ、twitterで紹介願います。
2013年12月17日火曜日
2013年12月16日月曜日
Ubuntu 12.10 64bitにOpenCV2.4.7の環境を構築した
ここからファイルをダウンロードし、homeにopencv247として展開する
事前にここのページやOpenCVプログラミングブックを参考に必要な環境をインストールする
cd opencv247 に移動
今回は、デフォルトの設定で構築
cmake -DCMAKE_BUILD_TYPE=RELEASE
make
sudo make install
sudo ldconfig
cmakeのオプション -Dのあとにスペースを入れるとエラーとなる
デフォルトでは、OpenCV関連のファイルは、以下のディレクトリーにコピーされる
/usr/local/include
/usr/local/lib
/usr/local/share
jpgファイルを表示させるプログラムのビルドしてみる
#include <opencv2/opencv.hpp>
int main( int argc, char** argv )
{
cv::Mat mat = cv::imread( "/home/hoge/opencv247/samples/cpp/baboon.jpg");
cv::imshow( "Color Image", mat );
cv::waitKey(0);
return 0;
}
ビルド
g++ -o a.out test.cpp -I/usr/local/include -L/usr/local/lib -lopencv_highgui -lopencv_core
実行
./a.out
以上
事前にここのページやOpenCVプログラミングブックを参考に必要な環境をインストールする
cd opencv247 に移動
今回は、デフォルトの設定で構築
cmake -DCMAKE_BUILD_TYPE=RELEASE
make
sudo make install
sudo ldconfig
cmakeのオプション -Dのあとにスペースを入れるとエラーとなる
デフォルトでは、OpenCV関連のファイルは、以下のディレクトリーにコピーされる
/usr/local/include
/usr/local/lib
/usr/local/share
jpgファイルを表示させるプログラムのビルドしてみる
#include <opencv2/opencv.hpp>
int main( int argc, char** argv )
{
cv::Mat mat = cv::imread( "/home/hoge/opencv247/samples/cpp/baboon.jpg");
cv::imshow( "Color Image", mat );
cv::waitKey(0);
return 0;
}
ビルド
g++ -o a.out test.cpp -I/usr/local/include -L/usr/local/lib -lopencv_highgui -lopencv_core
実行
./a.out
以上
OpenCV 2.4.7.2のリリースがアナウンスされた
ようやく公式ページで2.4.7.2のリリースがアナウンスされた。
2.4.7.2はWindows版のみで、Change Logsに記載されていなく、アナウンスに書かれているOpenCLとVS2013対応のみのようだ
2.4.7.2はWindows版のみで、Change Logsに記載されていなく、アナウンスに書かれているOpenCLとVS2013対応のみのようだ
2013年12月13日金曜日
OpenCVのopencv_traincascadeの辞書属性を調べる
CascadeClassifierで辞書を読み込んだ場合、辞書の属性を取得するためのメソッドを調べてみたが、getFeatureTypeとgetOriginalWindowSizeしか提供されていない
また、getFeatureTypeの戻り値がintなので、変換が必要となる
(システム定数として HAAR 0 LBP 1 HOG 2とcv::FeatureEvaluatorに定義いる)
他の属性は、辞書のXMLファイルを読み込み、自分で解析するしかない。
cv::FileStorage fs(filename, CV_STORAGE_READ);
cv::FileNode topnode(fs.fs, NULL);
cv::FileNode cnode = topnode[std::string("cascade")];
cv::FileNode cn1 = cnode[std::string("featureType")];
std::cout << "FeatureType : " << (std::string)cn1 << std::endl;
cv::FileNode cn2 = cnode[std::string("stageNum")];
std::cout << "Stage Number : " << (int)cn2 << std::endl;
cv::FileNode cnode2 = cnode[std::string("stageParams")];
cv::FileNode cn3 = cnode2[std::string("boostType")];
std::cout << "boostType : " << (std::string)cn3 << std::endl;
以上
また、getFeatureTypeの戻り値がintなので、変換が必要となる
(システム定数として HAAR 0 LBP 1 HOG 2とcv::FeatureEvaluatorに定義いる)
他の属性は、辞書のXMLファイルを読み込み、自分で解析するしかない。
以下のコードで、
- featureType
- stageNum
- boostType
を得ることができる
cv::FileStorage fs(filename, CV_STORAGE_READ);
cv::FileNode topnode(fs.fs, NULL);
cv::FileNode cnode = topnode[std::string("cascade")];
cv::FileNode cn1 = cnode[std::string("featureType")];
std::cout << "FeatureType : " << (std::string)cn1 << std::endl;
cv::FileNode cn2 = cnode[std::string("stageNum")];
std::cout << "Stage Number : " << (int)cn2 << std::endl;
cv::FileNode cnode2 = cnode[std::string("stageParams")];
cv::FileNode cn3 = cnode2[std::string("boostType")];
std::cout << "boostType : " << (std::string)cn3 << std::endl;
以上
2013年12月12日木曜日
OpenCVで検出器用の辞書を作成してみた
OpenCVが提供している分類器 CascadeClassifier用の辞書を作成してみた。
前回学習方法を訳してみたが、実際にを動かしてみると、相違点や問題点が見つかったので、メモしておく
1 特徴量は、HAAR、LBPだけでなくHOGが使用できる
-featureType HOGで指定する
2 -vec のファイルで指定したサンプルファイルに登録されているpositive画像数を -numPos で指定すると opencv_traincascadeが落ちる
以前から指摘されているようであり、numPos の数を9割くらいに減らせばよい
3 メモリが少ないと、opencv_traincascadeの起動時にメモリアロケーションエラーで落ちる
その場合は、-numPosや、-numNegで指定する数を減らす
-w -hで指定するサイズを小さくする (その場合、vecファイルを作り直す)必要がある
4 それでもステージの途中でメモリ不足で落ちる場合があるが、再度実行すると問題なく終了できる場合がある。
5 選んだ画像によっては、収束しないで無限に計算している場合がある
(negのカウンタが増えていかない)
その場合は、パラメータを変える、画像を変えるなどしないといけない
条件やマシンに依存するが、posi 500枚くらいだと 30分くらいで終了する
最初は -numStages を少なくしておき、検出精度をみながら増やしていくとよい
6 検出プログラムは、顔検出用のサンプルなどがそのまま使用できる
辞書指定で、自作の辞書ファイルのパスを指定すればよい
positive辞書作成時に使用した画像で、検証すればよい
7 計算時間短縮のためにコンソールから、プログラムを起動するときに start /highを付け加え、プロセスの優先度をあげるとよい
反面、他の作業に支障が出る場合がある
8 時間がかかる場合、途中で計算を打ち切ることができ、後日、同じコマンドで再開することができる。
再開時にパラメータが異なると、プログラムは起動後、すぐに終了してしまう
パラメータを変えたい場合は、辞書保存用のフォルダー内をクリアする必要がある
9 指定する画像のサイズは、最低でも16画素必要である。
追加2013/12/13
10 ファイルのリストは、相対パスでも絶対パスでもよい
11 positive画像に指定した画像をテストした場合、検出できない場合もある
自作辞書の印象だが、誤検出は少ない分、検出できないケースも多い。
positive辞書に、検出できない状況の画像を登録すればよいが、辞書が爆発することが予測できるので、ある程度妥協が必要である。
前回学習方法を訳してみたが、実際にを動かしてみると、相違点や問題点が見つかったので、メモしておく
1 特徴量は、HAAR、LBPだけでなくHOGが使用できる
-featureType HOGで指定する
2 -vec のファイルで指定したサンプルファイルに登録されているpositive画像数を -numPos で指定すると opencv_traincascadeが落ちる
以前から指摘されているようであり、numPos の数を9割くらいに減らせばよい
3 メモリが少ないと、opencv_traincascadeの起動時にメモリアロケーションエラーで落ちる
その場合は、-numPosや、-numNegで指定する数を減らす
-w -hで指定するサイズを小さくする (その場合、vecファイルを作り直す)必要がある
4 それでもステージの途中でメモリ不足で落ちる場合があるが、再度実行すると問題なく終了できる場合がある。
5 選んだ画像によっては、収束しないで無限に計算している場合がある
(negのカウンタが増えていかない)
その場合は、パラメータを変える、画像を変えるなどしないといけない
条件やマシンに依存するが、posi 500枚くらいだと 30分くらいで終了する
最初は -numStages を少なくしておき、検出精度をみながら増やしていくとよい
6 検出プログラムは、顔検出用のサンプルなどがそのまま使用できる
辞書指定で、自作の辞書ファイルのパスを指定すればよい
positive辞書作成時に使用した画像で、検証すればよい
7 計算時間短縮のためにコンソールから、プログラムを起動するときに start /highを付け加え、プロセスの優先度をあげるとよい
反面、他の作業に支障が出る場合がある
8 時間がかかる場合、途中で計算を打ち切ることができ、後日、同じコマンドで再開することができる。
再開時にパラメータが異なると、プログラムは起動後、すぐに終了してしまう
パラメータを変えたい場合は、辞書保存用のフォルダー内をクリアする必要がある
9 指定する画像のサイズは、最低でも16画素必要である。
追加2013/12/13
10 ファイルのリストは、相対パスでも絶対パスでもよい
11 positive画像に指定した画像をテストした場合、検出できない場合もある
自作辞書の印象だが、誤検出は少ない分、検出できないケースも多い。
positive辞書に、検出できない状況の画像を登録すればよいが、辞書が爆発することが予測できるので、ある程度妥協が必要である。
2013年12月11日水曜日
OpenCVのカスケード分類器の学習の章を訳してみた
オリジナルはここ
専門用語が理解できていないため、パラメータに関しての訳はかなり怪しい。
また、これだけ呼んだだけでは、各パラメータに指定すべき値が分からないので、辞書作成用のチュートリアルが欲しい。
ここから
カスケード分類器の作業は、学習と検出の2段階です。検出は、OpenCVのドキュメントの検出モジュールに記載されている。ドキュメントには、カスケード分類器の基本情報が記載されている。
ここでは、カスケード分類器の学習方法、学習データの準備とアプリの使用方法を示す。
注意事項
OpenCVは、 opencv_haartraining と opencv_traincascadeの2種類のカスケード分類器の学習アプリケーションがある。opencv_traincascade の方がOpenCVのVer2以降のC++APIで書かれており新しい。
しかし、大きな差異は、opencv_traincascadeは、HaarとLBP特徴量の両方をサポートしている。LBP特徴量は、整数なので、Haarと比較して学習と検出の速度が数倍早い。検出精度は、学習に依存しており、第一に学習用のデータの質であり、その次に学習パラメータである。LBPの分類器でもHaarの分類器と同等の性能を得ることは可能である。
opencv_traincascade と opencv_haartrainingの学習データは、異なるフォーマットで保存される。
新しいインタフェースは、両方のフォーマットをサポートしている。(オブジェクト検出のCascadeClassifier classを参照) opencv_traincascadeは、古いフォーマットで保存することができる。
しかし、opencv_traincascade と opencv_haartraining は、処理の途中で異なるタイプのフォーマットのデータを読み込むことはできない。
TBBオプションでOpenCVをビルドした場合、opencv_traincascadeは、TBBによりマルチコアに対応する。
また、学習用の支援ツールが準備されている。
・opencv_createsamplesは、ポジティブデータとテストデータを準備するために使用でき、opencv_haartraining
and opencv_traincascadeの両方で使用できる、ポジティブサンプルのデータを作成する。
出力ファイルの拡張子は、.vecであり、画像データを含むバイナリデータである。
・opencv_performanceは、opencv_haartrainingで作成した分類器の精度を評価するために使用される。事前に準
備したリストを用いて、分類器を実行し、検出できた数、できなかった数、誤検出などの情報を報告する。
opencv_haartraining は、サポートを廃止したので、これ以降、opencv_traincascadeのみ説明する。
opencv_createsamplesは、opencv_traincascadeの学習データの準備に必要なので合わせて説明する。
学習データの準備
学習には、ポジティブ、ネガティブの2種類のデータが必要である。ポジティブ画像は、検出対象の画像であり、ネガティブ画像は、検出対象ではない画像である。ポジティブ画像のデータセットは、opencv_createsamplesで作成できるが、ネガティブ画像のデータセットは手動で準備しなければいけない
ネガティブサンプル
ネガティブ画像は、検出対象を含まない任意の画像である。ネガティブ画像のデータセットのための、専用ファイルが必要である。各ラインに専用ファイルからの相対パスを含むファイル名を記したテキストファイルである。
ネガティブ画像は、背景画像と呼ばれることもあり、本ドキュメントでは、同じ意味である。画像のサイズは異なっていてもよいが、学習ウィンドウサイズよりも大きくなければいけない。
というのは、学習用のサイズに縮小されるためである。
bg.txtとネガティブ画像を格納したimageフォルダーが同じ場所にある場合、
bg.txtの内容は
image/image1.jpg
image/image2.jpg
のようになる
ポジティブサンプル
opencv_createsamplesで作成する。検出対象を含む1枚の画像から、あるいは、ネガティブのように専用ファイルから作ることもできる。ツールを使用する前に、多くのデータを準備する必要がある。
OpenCVのロゴのような剛体の場合、1枚の画像を準備するだけでよいが、顔の場合、百、あるいは、千必要となる。顔の場合、人種、年代、表情、ひげなど考慮しないといけない。
1 単一物体の画像
大量のポジティブサンプルの画像は、与えられた画像を回転させたり、明るさを変えたり、任意の背景の上に重ねたりして作られる
opencv_createsamples utilityの引数により、変化量をコントロールする。
引数
-vec <vec_file_name>
学習結果出力ファイル名
-img <image_file_name>
もとになる画像ファイル名
-bg <background_file_name>
背景に使用される画像ファイルのリストを格納したファイル
-num <number_of_samples>
作成するポジティブサンプ数
-bgcolor <background_color>
背景色(現在は白黒を想定)は、透過色を示している 圧縮の影響があるかもしれないので -bgthreshで許容量を指定する。bgcolor-bgthreshとbgcolor+bgthreshの範囲にある画素は、透過色とみなされる
-bgthresh <background_color_threshold>
-inv
指定されると、色が反転される
-randinv
指定されると、ランダムに色を反転させる
-maxidev <max_intensity_deviation>
サンプルの明るさの変化の最大値
-maxxangle <max_x_rotation_angle>
-maxyangle <max_y_rotation_angle>
-maxzangle <max_z_rotation_angle>
radiansで指定された最大回転角度
-show
デバッグオプション 指定すると、各サンプルが表示される Escキー押下で次の画像に移動する
-w <sample_width>
出力画像の幅
-h <sample_height>
出力画像の高さ
サンプル画像の作成のために以下の処理が行われる。
2 ポジティブサンプル
ポジティブサンプルは、事前にマークアップした画像からも得ることがきる。サンプル用画像は、背景画像のリストファイルのようなフォーマットでテキストフファイルに記述される。
各行は、画像に対応している。1番目は、ファイル名、2番目は、オブジェクトの数、そのあとは、オブジェクトを示す矩形情報(X座標 Y座標、幅、高さの組み合わせ)をオブジェクトの数だけ
info.datとポジティブ画像を格納したimageフォルダーが同じ場所にある場合、
info.datの内容は
image/image1.jpg 1 140 100 45 45
image/image2.jpg 2 100 200 50 50 50 30 25 25
のようになる
image1.jpgは、1つのオブジェクトを含んでおり、その矩形情報は、 (140, 100, 45, 45)を示す
image2.jpgは、2つのオブジェクトを含んでおり、その矩形情報は、(100 200 50 50) と (50 30 25 25)を示す
サンプル用画像からポジティブサンプルを作成するには、-img の代わりに、-infoを引数とする
-info <collection_file_name>
マークアップした画像情報を格納したファイル名
作成手順は以下様になる
変形処理は行われないので、有効な引数は、-w, -h, -show and -numとなる。
opencv_createsamples は、ポジティブサンプルファイル内のサンプル画像を調べるために使用されるかも知れない。その場合、引数は、-vec, -w and -h を使用する。
opencv/data/vec_files/trainingfaces_24-24.vecは、vec-fileのサンプルである。
window size -w 24 -h 24で顔検出器の学習用に使用される
カスケード学習
次は分類器の学習である。opencv_haartraining か opencv_traincascade のどちらかを使用することができるが、opencv_traincascadeの説明を行う
opencv_traincascade のコマンドラインの引数は、目的別に分類されている。
1 共通
-data <cascade_dir_name>
結果ファイルの保存フォルダー名
-vec <vec_file_name>
opencv_createsamples で作成されたvecファイル
-bg <background_file_name>
背景ファイルのリストを格納したファイル
-numPos <number_of_positive_samples>
-numNeg <number_of_negative_samples>
各ステージで使用する、ポジティブ、ネガティブのサンプル数
-numStages <number_of_stages>
学習ステージ数
-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>
事前計算した特徴量用のメモリサイズ
-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>
事前計算した特徴量用のバッファメモリー 多いと計算速度が速くなる
-baseFormatSave
Haar-like 向けに使用され、古いフォーマットで保存される。
2 カスケードパラメータ
-stageType <BOOST(default)>
学習ステージのタイプ。現時点ではboostのみサポート
-featureType<{HAAR(default), LBP}>
特徴量のタイプ
-w <sampleWidth>
-h <sampleHeight>
サンプルのサイズ。opencv_createsamplesで使用したサイズを指定すること
3 Boost分類器のパラメータ
-bt <{DAB, RAB, LB, GAB(default)}>
boost分類器のタイプ
DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost.
-minHitRate <min_hit_rate>
各ステージでの最小ヒット率
min_hit_rate^number_of_stagesで、ヒット率を予測できる
-maxFalseAlarmRate <max_false_alarm_rate>
各ステージでの最大false alarm率
max_false_alarm_rate^number_of_stagesで、false alarm率を予測できる
-weightTrimRate <weight_trim_rate>
値によりトリミングを行うか指定する
0.95が好ましい
-maxDepth <max_depth_of_weak_tree>
弱検出器の最大の深さ 1が好ましい
-maxWeakCount <max_weak_tree_count>
-maxFalseAlarmRateを達成用に必要とされる各ステージでの弱分類器の最大数
4 Haar-like 特徴量用のパラメータ
-mode <BASIC (default) | CORE | ALL>
学習に使用する基本特徴量のタイプ
基本は、直行特徴量のみ使用 ALLの場合、45度回転した特徴量も使用
詳細は、[Rainer2002]を参照
5 LBP 特徴量用のパラメータ
なし
学習が終了したら、-data で指定したフォルダーに、cascade.xml が作成される。途中で中断すると、作業ファイルが作成されるので、手動で削除すること。
以上
専門用語が理解できていないため、パラメータに関しての訳はかなり怪しい。
また、これだけ呼んだだけでは、各パラメータに指定すべき値が分からないので、辞書作成用のチュートリアルが欲しい。
ここから
カスケード分類器の作業は、学習と検出の2段階です。検出は、OpenCVのドキュメントの検出モジュールに記載されている。ドキュメントには、カスケード分類器の基本情報が記載されている。
ここでは、カスケード分類器の学習方法、学習データの準備とアプリの使用方法を示す。
注意事項
OpenCVは、 opencv_haartraining と opencv_traincascadeの2種類のカスケード分類器の学習アプリケーションがある。opencv_traincascade の方がOpenCVのVer2以降のC++APIで書かれており新しい。
しかし、大きな差異は、opencv_traincascadeは、HaarとLBP特徴量の両方をサポートしている。LBP特徴量は、整数なので、Haarと比較して学習と検出の速度が数倍早い。検出精度は、学習に依存しており、第一に学習用のデータの質であり、その次に学習パラメータである。LBPの分類器でもHaarの分類器と同等の性能を得ることは可能である。
opencv_traincascade と opencv_haartrainingの学習データは、異なるフォーマットで保存される。
新しいインタフェースは、両方のフォーマットをサポートしている。(オブジェクト検出のCascadeClassifier classを参照) opencv_traincascadeは、古いフォーマットで保存することができる。
しかし、opencv_traincascade と opencv_haartraining は、処理の途中で異なるタイプのフォーマットのデータを読み込むことはできない。
TBBオプションでOpenCVをビルドした場合、opencv_traincascadeは、TBBによりマルチコアに対応する。
また、学習用の支援ツールが準備されている。
・opencv_createsamplesは、ポジティブデータとテストデータを準備するために使用でき、opencv_haartraining
and opencv_traincascadeの両方で使用できる、ポジティブサンプルのデータを作成する。
出力ファイルの拡張子は、.vecであり、画像データを含むバイナリデータである。
・opencv_performanceは、opencv_haartrainingで作成した分類器の精度を評価するために使用される。事前に準
備したリストを用いて、分類器を実行し、検出できた数、できなかった数、誤検出などの情報を報告する。
opencv_haartraining は、サポートを廃止したので、これ以降、opencv_traincascadeのみ説明する。
opencv_createsamplesは、opencv_traincascadeの学習データの準備に必要なので合わせて説明する。
学習データの準備
学習には、ポジティブ、ネガティブの2種類のデータが必要である。ポジティブ画像は、検出対象の画像であり、ネガティブ画像は、検出対象ではない画像である。ポジティブ画像のデータセットは、opencv_createsamplesで作成できるが、ネガティブ画像のデータセットは手動で準備しなければいけない
ネガティブサンプル
ネガティブ画像は、検出対象を含まない任意の画像である。ネガティブ画像のデータセットのための、専用ファイルが必要である。各ラインに専用ファイルからの相対パスを含むファイル名を記したテキストファイルである。
ネガティブ画像は、背景画像と呼ばれることもあり、本ドキュメントでは、同じ意味である。画像のサイズは異なっていてもよいが、学習ウィンドウサイズよりも大きくなければいけない。
というのは、学習用のサイズに縮小されるためである。
bg.txtとネガティブ画像を格納したimageフォルダーが同じ場所にある場合、
bg.txtの内容は
image/image1.jpg
image/image2.jpg
のようになる
ポジティブサンプル
opencv_createsamplesで作成する。検出対象を含む1枚の画像から、あるいは、ネガティブのように専用ファイルから作ることもできる。ツールを使用する前に、多くのデータを準備する必要がある。
OpenCVのロゴのような剛体の場合、1枚の画像を準備するだけでよいが、顔の場合、百、あるいは、千必要となる。顔の場合、人種、年代、表情、ひげなど考慮しないといけない。
1 単一物体の画像
大量のポジティブサンプルの画像は、与えられた画像を回転させたり、明るさを変えたり、任意の背景の上に重ねたりして作られる
opencv_createsamples utilityの引数により、変化量をコントロールする。
引数
-vec <vec_file_name>
学習結果出力ファイル名
-img <image_file_name>
もとになる画像ファイル名
-bg <background_file_name>
背景に使用される画像ファイルのリストを格納したファイル
-num <number_of_samples>
作成するポジティブサンプ数
-bgcolor <background_color>
背景色(現在は白黒を想定)は、透過色を示している 圧縮の影響があるかもしれないので -bgthreshで許容量を指定する。bgcolor-bgthreshとbgcolor+bgthreshの範囲にある画素は、透過色とみなされる
-bgthresh <background_color_threshold>
-inv
指定されると、色が反転される
-randinv
指定されると、ランダムに色を反転させる
-maxidev <max_intensity_deviation>
サンプルの明るさの変化の最大値
-maxxangle <max_x_rotation_angle>
-maxyangle <max_y_rotation_angle>
-maxzangle <max_z_rotation_angle>
radiansで指定された最大回転角度
-show
デバッグオプション 指定すると、各サンプルが表示される Escキー押下で次の画像に移動する
-w <sample_width>
出力画像の幅
-h <sample_height>
出力画像の高さ
サンプル画像の作成のために以下の処理が行われる。
- 入力画像を、ランダムの角度で3軸方向に回転させる
- bg_color-bg_color_threshold; bg_color+bg_color_thresholdの色が透過色としてみなされる
- 白色雑音が、前景に加算される
- -invの指定があれば、前景の明るさが反転される
- -randinvがあれば、ランダムに色を反転するかどうか決められる
- 最後に、作成した画像を任意の画像上に重ねる
- -w and -h のサイズに大きさを変える
- -vecで指定されたファイルに保存する
2 ポジティブサンプル
ポジティブサンプルは、事前にマークアップした画像からも得ることがきる。サンプル用画像は、背景画像のリストファイルのようなフォーマットでテキストフファイルに記述される。
各行は、画像に対応している。1番目は、ファイル名、2番目は、オブジェクトの数、そのあとは、オブジェクトを示す矩形情報(X座標 Y座標、幅、高さの組み合わせ)をオブジェクトの数だけ
info.datとポジティブ画像を格納したimageフォルダーが同じ場所にある場合、
info.datの内容は
image/image1.jpg 1 140 100 45 45
image/image2.jpg 2 100 200 50 50 50 30 25 25
のようになる
image1.jpgは、1つのオブジェクトを含んでおり、その矩形情報は、 (140, 100, 45, 45)を示す
image2.jpgは、2つのオブジェクトを含んでおり、その矩形情報は、(100 200 50 50) と (50 30 25 25)を示す
サンプル用画像からポジティブサンプルを作成するには、-img の代わりに、-infoを引数とする
-info <collection_file_name>
マークアップした画像情報を格納したファイル名
作成手順は以下様になる
- オブジェクトを切り出す
- -w, -hのサイズに大きさを変える
- -vecで指定されたファイルに保存する
変形処理は行われないので、有効な引数は、-w, -h, -show and -numとなる。
opencv_createsamples は、ポジティブサンプルファイル内のサンプル画像を調べるために使用されるかも知れない。その場合、引数は、-vec, -w and -h を使用する。
opencv/data/vec_files/trainingfaces_24-24.vecは、vec-fileのサンプルである。
window size -w 24 -h 24で顔検出器の学習用に使用される
カスケード学習
次は分類器の学習である。opencv_haartraining か opencv_traincascade のどちらかを使用することができるが、opencv_traincascadeの説明を行う
opencv_traincascade のコマンドラインの引数は、目的別に分類されている。
1 共通
-data <cascade_dir_name>
結果ファイルの保存フォルダー名
-vec <vec_file_name>
opencv_createsamples で作成されたvecファイル
-bg <background_file_name>
背景ファイルのリストを格納したファイル
-numPos <number_of_positive_samples>
-numNeg <number_of_negative_samples>
各ステージで使用する、ポジティブ、ネガティブのサンプル数
-numStages <number_of_stages>
学習ステージ数
-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>
事前計算した特徴量用のメモリサイズ
-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>
事前計算した特徴量用のバッファメモリー 多いと計算速度が速くなる
-baseFormatSave
Haar-like 向けに使用され、古いフォーマットで保存される。
2 カスケードパラメータ
-stageType <BOOST(default)>
学習ステージのタイプ。現時点ではboostのみサポート
-featureType<{HAAR(default), LBP}>
特徴量のタイプ
-w <sampleWidth>
-h <sampleHeight>
サンプルのサイズ。opencv_createsamplesで使用したサイズを指定すること
3 Boost分類器のパラメータ
-bt <{DAB, RAB, LB, GAB(default)}>
boost分類器のタイプ
DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost.
-minHitRate <min_hit_rate>
各ステージでの最小ヒット率
min_hit_rate^number_of_stagesで、ヒット率を予測できる
-maxFalseAlarmRate <max_false_alarm_rate>
各ステージでの最大false alarm率
max_false_alarm_rate^number_of_stagesで、false alarm率を予測できる
-weightTrimRate <weight_trim_rate>
値によりトリミングを行うか指定する
0.95が好ましい
-maxDepth <max_depth_of_weak_tree>
弱検出器の最大の深さ 1が好ましい
-maxWeakCount <max_weak_tree_count>
-maxFalseAlarmRateを達成用に必要とされる各ステージでの弱分類器の最大数
4 Haar-like 特徴量用のパラメータ
-mode <BASIC (default) | CORE | ALL>
学習に使用する基本特徴量のタイプ
基本は、直行特徴量のみ使用 ALLの場合、45度回転した特徴量も使用
詳細は、[Rainer2002]を参照
5 LBP 特徴量用のパラメータ
なし
学習が終了したら、-data で指定したフォルダーに、cascade.xml が作成される。途中で中断すると、作業ファイルが作成されるので、手動で削除すること。
以上
2013年12月10日火曜日
OpenCV 2.4.7.2の変更点を少し調べてみた
Build情報を表示させてみた
cv::getBuildInformation()を使用し、windows版のOpenCV2.4.7.2のビルド条件を表示させてみた
Version Controlの値は、2.4.7のままであり、オプションの変更もないと思われる。
Version Vontrolの値は、2.4.7.2になっているが、オプションの変更はないと思われる。
ソースを比較
OpenCL関連が大幅に変更されている。
2.4.7では、いくつかの関数でエラーが出ていたのがこれで治るかも知れない
残念ながら修正されていない。また速度が低下した関数もある。
CMakeを比較
VisualStudio 2013 対応が追加されているようだ
elseif(MSVC_VERSION EQUAL 1800)
set(OpenCV_RUNTIME vc12)
サンプルを比較
システム定数が変更されている。
いくつかの関数は頭のcvがなくなっているものもありますが割愛
上が2.4.7 下が2.4.7.2
cvtColor(frame, gray, CV_RGB2GRAY);
cvtColor(frame, gray, COLOR_RGB2GRAY);
cvtColor(image, hsv, CV_BGR2HSV);
cvtColor(image, hsv, COLOR_BGR2HSV);
cvtColor(I, I_YUV, CV_BGR2YCrCb);
cvtColor(I, I_YUV, COLOR_BGR2YCrCb);
putText( img, text.str(), Point(10,25), CV_FONT_HERSHEY_SIMPLEX, 0.8f, WHITE_COLOR, 2 );
putText( img, text.str(), Point(10,25), FONT_HERSHEY_SIMPLEX, 0.8f, WHITE_COLOR, 2 );
namedWindow( winName, CV_WINDOW_AUTOSIZE );
namedWindow( winName, WINDOW_AUTOSIZE );
namedWindow("image", CV_WINDOW_NORMAL);
namedWindow("image", WINDOW_NORMAL);
circle(img_corr, features1[i].pt, 3, CV_RGB(255, 0, 0));
circle(img_corr, features1[i].pt, 3, Scalar(0, 0, 255));
また、CMakeLists.txt にOCLのコンパイルオプションが含められており
points_classifier.cpp
bagofwords_classification.cpp
で、OCLを利用するコードが追加されている
OCLサンプル
facedetect.cpp
でマルチスレッドの使用を追加
以上
cv::getBuildInformation()を使用し、windows版のOpenCV2.4.7.2のビルド条件を表示させてみた
Version Vontrolの値は、2.4.7.2になっているが、オプションの変更はないと思われる。
ソースを比較
OpenCL関連が大幅に変更されている。
2.4.7では、いくつかの関数でエラーが出ていたのがこれで治るかも知れない
残念ながら修正されていない。また速度が低下した関数もある。
CMakeを比較
VisualStudio 2013 対応が追加されているようだ
elseif(MSVC_VERSION EQUAL 1800)
set(OpenCV_RUNTIME vc12)
サンプルを比較
システム定数が変更されている。
いくつかの関数は頭のcvがなくなっているものもありますが割愛
上が2.4.7 下が2.4.7.2
cvtColor(frame, gray, CV_RGB2GRAY);
cvtColor(frame, gray, COLOR_RGB2GRAY);
cvtColor(image, hsv, CV_BGR2HSV);
cvtColor(image, hsv, COLOR_BGR2HSV);
cvtColor(I, I_YUV, CV_BGR2YCrCb);
cvtColor(I, I_YUV, COLOR_BGR2YCrCb);
putText( img, text.str(), Point(10,25), CV_FONT_HERSHEY_SIMPLEX, 0.8f, WHITE_COLOR, 2 );
putText( img, text.str(), Point(10,25), FONT_HERSHEY_SIMPLEX, 0.8f, WHITE_COLOR, 2 );
namedWindow( winName, CV_WINDOW_AUTOSIZE );
namedWindow( winName, WINDOW_AUTOSIZE );
namedWindow("image", CV_WINDOW_NORMAL);
namedWindow("image", WINDOW_NORMAL);
circle(img_corr, features1[i].pt, 3, CV_RGB(255, 0, 0));
circle(img_corr, features1[i].pt, 3, Scalar(0, 0, 255));
また、CMakeLists.txt にOCLのコンパイルオプションが含められており
points_classifier.cpp
bagofwords_classification.cpp
で、OCLを利用するコードが追加されている
OCLサンプル
facedetect.cpp
でマルチスレッドの使用を追加
以上
OpenCV 2.4.7.2がリリースされた
現時点で公式のアナウンスがありませんが、Windows版が2.4.7.2となっています
ダウンロードはここから
opencv-2.4.7.2.exeファイルサイズは、若干増加している
変更点は、公式のchange logは2.4.7のままなので不明ですが、サンプルの差分を見れば、変更の一部が分かるかもしれません。
ダウンロードはここから
opencv-2.4.7.2.exeファイルサイズは、若干増加している
変更点は、公式のchange logは2.4.7のままなので不明ですが、サンプルの差分を見れば、変更の一部が分かるかもしれません。
2013年12月9日月曜日
OpenCVforAndroid 2.4.7.1のサンプルをビルドしてみた
2.4.6の記事はここ
最初に
ubuntuの更新
Android SDKの更新
をしておく
NDKの更新方法がわからないので古いのをそのまま使用している
あとで削除して最新に入れ替えてみる
OpenCV-2.4.7.1-android-sdk.zipをここからダウンロード
ファイルサイズが97.2Mから、117.3Mに増加している
2.4.6のプロジェクトがあるとややこしくなるので、eclipseのPackage Explorerからすべて削除
Package Explorerを右クリックしimportでOpenCV-2.4.7.1-android-sdk/sdk/javaを登録
その後に、
OpenCV-2.4.7.1-android-sdk/samples/tutorial-1-camerapreview
OpenCV-2.4.7.1-android-sdk/samples/tutorial-2-mixedprocessing
OpenCV-2.4.7.1-android-sdk/samples/tutorial-3-cameracontrol
を順番にimportする
また、tutorial-2のndkのビルド用のバッチがwindows用になっているため、
プロジェクトのプロパティを開きC++buildの
ndk-build.cmdをndk-buildに直す
すべてのソースで
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_7, this, mLoaderCallback);
のバージョンが2.4.3のままなので、2_4_7に直しておく
以上でサンプルアプリができる
エミュレータから、OpenCV Managerをアンインストールし、OpenCV-2.4.7.1-android-sdk/apkの
OpenCV_2.4.7.1_Manager_2.15_armv7a-neon.apkを代わりにインストールする
2.4.6の時エミュレータでもノートPCの内蔵カメラがが利用でき表示も問題なかったが、2.4.7にアプリを2.4.7に変えると表示が乱れるようになった。
あとで実機で確認してみる
最初に
ubuntuの更新
Android SDKの更新
をしておく
NDKの更新方法がわからないので古いのをそのまま使用している
あとで削除して最新に入れ替えてみる
OpenCV-2.4.7.1-android-sdk.zipをここからダウンロード
ファイルサイズが97.2Mから、117.3Mに増加している
2.4.6のプロジェクトがあるとややこしくなるので、eclipseのPackage Explorerからすべて削除
Package Explorerを右クリックしimportでOpenCV-2.4.7.1-android-sdk/sdk/javaを登録
その後に、
OpenCV-2.4.7.1-android-sdk/samples/tutorial-1-camerapreview
OpenCV-2.4.7.1-android-sdk/samples/tutorial-2-mixedprocessing
OpenCV-2.4.7.1-android-sdk/samples/tutorial-3-cameracontrol
を順番にimportする
また、tutorial-2のndkのビルド用のバッチがwindows用になっているため、
プロジェクトのプロパティを開きC++buildの
ndk-build.cmdをndk-buildに直す
すべてのソースで
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_7, this, mLoaderCallback);
のバージョンが2.4.3のままなので、2_4_7に直しておく
以上でサンプルアプリができる
エミュレータから、OpenCV Managerをアンインストールし、OpenCV-2.4.7.1-android-sdk/apkの
OpenCV_2.4.7.1_Manager_2.15_armv7a-neon.apkを代わりにインストールする
2.4.6の時エミュレータでもノートPCの内蔵カメラがが利用でき表示も問題なかったが、2.4.7にアプリを2.4.7に変えると表示が乱れるようになった。
あとで実機で確認してみる
2013年12月5日木曜日
OpenCVで計算終了時に一時的に停止させる
OpenCVで何らかの計算を行い、その結果を確認した場合がある。
OpenCVのプログラムが、コンソールベースなので、メイン関数を終了するとコンソールウィンドウが消えてしまし結果を見ることができない。ファイルに出力すればよいのだが、不要なファイルが増えてしまう。
そのような場合、メイン関数終了時に
cv::Mat disp = cv::Mat::zeros(cv::Size(320, 240), CV_8UC1);
cv::imshow("dummy", disp);
int key = cv::waitKey(0);
の3行加えておくと、何らかのキーを押下するまで、コンソールウィンドウが表示させておくことができる。
OpenCVのプログラムが、コンソールベースなので、メイン関数を終了するとコンソールウィンドウが消えてしまし結果を見ることができない。ファイルに出力すればよいのだが、不要なファイルが増えてしまう。
そのような場合、メイン関数終了時に
cv::Mat disp = cv::Mat::zeros(cv::Size(320, 240), CV_8UC1);
cv::imshow("dummy", disp);
int key = cv::waitKey(0);
の3行加えておくと、何らかのキーを押下するまで、コンソールウィンドウが表示させておくことができる。
2013年12月3日火曜日
言う吉くんはOpenCVを使用している
国立印刷局は、アイフォーン用音声式日本銀行券簡易券種識別支援アプリケーション 「言う吉くん(スマホ)」を12月3日より公開とのこと
詳細は こちら
本アプリケーションについて のドキュメント内でOpenCV (Ver 2.3)の使用に関して記載されている
当然、SIFTやSURFを使用していないと思われるが
詳細は こちら
本アプリケーションについて のドキュメント内でOpenCV (Ver 2.3)の使用に関して記載されている
当然、SIFTやSURFを使用していないと思われるが
2013年12月2日月曜日
OpenCV2.4.7のリファレンスマニュアルは、2種類あった。
2.4.7のSDKには、11/7のVer2.4.7.0のリファレンスマニュアルのpdfが含まれているが、Tegraに関して説明はない。(当方のSDKダウンロード後に、内容が修正された可能性もある)
doc.opencv.orgで公開されているリファレンスマニュアルにはChap 19 TEGRA-POWERED COMPUTER VISIONが含まれている。こちらのタイトルもThe OpenCV Reference Manual Release 2.4.7.0になっているが、日付は11/09となっている
補足
以前からnVidiaがTegraでのOpenCVをサポートしていたが、本日(12/2)nVidiaからTegra Note 7の国内販売がリリースされ、モバイルでのCVのパフォーマンスの改善が期待できそうな世の中になってきた。
doc.opencv.orgで公開されているリファレンスマニュアルにはChap 19 TEGRA-POWERED COMPUTER VISIONが含まれている。こちらのタイトルもThe OpenCV Reference Manual Release 2.4.7.0になっているが、日付は11/09となっている
補足
以前からnVidiaがTegraでのOpenCVをサポートしていたが、本日(12/2)nVidiaからTegra Note 7の国内販売がリリースされ、モバイルでのCVのパフォーマンスの改善が期待できそうな世の中になってきた。
2013年の技術系Advent Calendarがはじまる
とういニュースがありました。
Computer Vision Advent Calendar 2013も紹介されていますが、残念なことに誰もエントリーしていない状況です。 まだ開始されていません。6人の方がエントリーされており、中には、去年に続き今年も参加される人がいます。
昨年も行われています。
Computer Vision Advent Calendar 2012
手を挙げてみようか考慮中
補足
iOS Advent Calendar 2013
の2日目に
「顔以外」のものを画像認識する
が公開されています。
Computer Vision Advent Calendar 2013も紹介されていますが、残念なことに誰もエントリーしていない状況です。 まだ開始されていません。6人の方がエントリーされており、中には、去年に続き今年も参加される人がいます。
昨年も行われています。
Computer Vision Advent Calendar 2012
手を挙げてみようか考慮中
補足
iOS Advent Calendar 2013
の2日目に
「顔以外」のものを画像認識する
が公開されています。
2013年11月29日金曜日
OpenCV 2.4.7でOpenCLを試してみた 6
2.4.7からOpenCVをビルドしなくてもOpenCLが利用できるようになっている。
以前のバージョンで試していないのでわからないが、2.4.7では、OCLのソースをターゲットの環境に合わせて実行時にコンパイルが行われバイナリファイルが作成される
このバイナリファイルは、ディスクにキャッシュされ、次回プログラムを実行するときはこのバイナリファイルが使用されるとのこと
ファイル名は、モジュール名+OpenCLデバイス名+.clbの形式である。
Visual Studioから実行すると、ソースファイルが格納されているフォルダーにバイナリファイルが格納され、プログラム単体で実行すると、実行したフォルダーに作成される
下記は、ocl::hogを利用するプログラムを実行させた場合にできるファイルである。
以上
以前のバージョンで試していないのでわからないが、2.4.7では、OCLのソースをターゲットの環境に合わせて実行時にコンパイルが行われバイナリファイルが作成される
このバイナリファイルは、ディスクにキャッシュされ、次回プログラムを実行するときはこのバイナリファイルが使用されるとのこと
ファイル名は、モジュール名+OpenCLデバイス名+.clbの形式である。
Visual Studioから実行すると、ソースファイルが格納されているフォルダーにバイナリファイルが格納され、プログラム単体で実行すると、実行したフォルダーに作成される
下記は、ocl::hogを利用するプログラムを実行させた場合にできるファイルである。
以上
2013年11月28日木曜日
OpenCVでBOWで辞書作成ではまった
BOWの辞書作成プログラムを作ろうとしているが、試験的に作成したプログラムが作成した辞書と
リファクタリングしたプログラムで作成した辞書の値が異なり悩んでしまった。
乱数を使用しているか思ったが、同じプログラムでは、ソースを変更しても結果は同じとなるため
原因がつかめなかった。
そこで、同一プログラム内で
cv::BOWKMeansTrainer bowTrainer1(DIC_SIZE, tc, 1, cv::KMEANS_PP_CENTERS); //BOW_kmeans設定
cv::BOWKMeansTrainer bowTrainer2(DIC_SIZE, tc, 1, cv::KMEANS_PP_CENTERS); //BOW_kmeans設定
int size = mLstMat.size();
for (int i = 0 ; i < size ;i++) {
bowTrainer1.add(mLstMat.at(i));
bowTrainer2.add(mLstMat.at(i));
}
cv::Mat f1 = bowTrainer1.cluster();
std::cout << f1 << std::endl << std::endl;
cv::Mat f2 = bowTrainer2.cluster();
std::cout << f2 << std::endl << std::endl;
のようのBOWKMeansTrainerのインスタンスを2つ作成し、同一データで辞書を作成したところ、値が異なることがわかった
再度ドキュメントのBOWKMeansTrainerのコンストラクタの説明をみると
パラメータは、kmeans()をみとろのこと
kmeans()の説明では、flagパラメータのKMEANS_PP_CENTERSは、 kmeans++の初期化を使用とのこと
wikiのK-means++法の説明をみると、
「まず始めにデータ点をランダムに選び1つ目のクラスタ中心とし」
と記載されている
同じプログラムを使用しないと、辞書が異なる可能性が大きい
同じプログラムでも実行マシンを変えるとどうなるのだろうか
リファクタリングしたプログラムで作成した辞書の値が異なり悩んでしまった。
乱数を使用しているか思ったが、同じプログラムでは、ソースを変更しても結果は同じとなるため
原因がつかめなかった。
そこで、同一プログラム内で
cv::BOWKMeansTrainer bowTrainer1(DIC_SIZE, tc, 1, cv::KMEANS_PP_CENTERS); //BOW_kmeans設定
cv::BOWKMeansTrainer bowTrainer2(DIC_SIZE, tc, 1, cv::KMEANS_PP_CENTERS); //BOW_kmeans設定
int size = mLstMat.size();
for (int i = 0 ; i < size ;i++) {
bowTrainer1.add(mLstMat.at(i));
bowTrainer2.add(mLstMat.at(i));
}
cv::Mat f1 = bowTrainer1.cluster();
std::cout << f1 << std::endl << std::endl;
cv::Mat f2 = bowTrainer2.cluster();
std::cout << f2 << std::endl << std::endl;
のようのBOWKMeansTrainerのインスタンスを2つ作成し、同一データで辞書を作成したところ、値が異なることがわかった
再度ドキュメントのBOWKMeansTrainerのコンストラクタの説明をみると
パラメータは、kmeans()をみとろのこと
kmeans()の説明では、flagパラメータのKMEANS_PP_CENTERSは、 kmeans++の初期化を使用とのこと
wikiのK-means++法の説明をみると、
「まず始めにデータ点をランダムに選び1つ目のクラスタ中心とし」
と記載されている
同じプログラムを使用しないと、辞書が異なる可能性が大きい
同じプログラムでも実行マシンを変えるとどうなるのだろうか
OpenCVの特徴点検出で使用するAPIに関して 2
正確なバージョンは調べないといけないが、2.4以降、OpenCVのドキュメントの特徴量の取得のためのAPIは、複数のアルゴリズムの切り替えを簡単にするために、共通インタフェースを使用する形式となっている。
インスタンスの生成は、
Ptr<DescriptorExtractor> DescriptorExtractor::create(const string& descriptorExtractorType)
を使用し、descriptorExtractorTypeにアルゴリズム名を指定する形となっている。
SIFTを使用する場合、"SIFT"を代入することになる。
このAPIでは、各アルゴリズム特有の初期設定ができないため、SIFTの角度の計算を行わないようにするなどの設定ができなくなってしまう。
また、このAPIでは、SURFとSIFTを使用するためには、
OpenCV 2.4.2でSURFを使うために
に書いたような注意が必要となる。
2.4.7でも
cv::SiftDescriptorExtractor extractor;
は使用できる
Visual studio のインテリセンスでSiftDescriptorExtractorのコンストラクターの引数をみることができるが、2.4.7では、
extractor(cv::SIFT::DescriptorParams::GET_DEFAULT_MAGNIFICATION(), true, false);
のような引数の並びではなくなっている。
インスタンスの生成は、
Ptr<DescriptorExtractor> DescriptorExtractor::create(const string& descriptorExtractorType)
を使用し、descriptorExtractorTypeにアルゴリズム名を指定する形となっている。
SIFTを使用する場合、"SIFT"を代入することになる。
このAPIでは、各アルゴリズム特有の初期設定ができないため、SIFTの角度の計算を行わないようにするなどの設定ができなくなってしまう。
また、このAPIでは、SURFとSIFTを使用するためには、
OpenCV 2.4.2でSURFを使うために
に書いたような注意が必要となる。
2.4.7でも
cv::SiftDescriptorExtractor extractor;
は使用できる
Visual studio のインテリセンスでSiftDescriptorExtractorのコンストラクターの引数をみることができるが、2.4.7では、
extractor(cv::SIFT::DescriptorParams::GET_DEFAULT_MAGNIFICATION(), true, false);
のような引数の並びではなくなっている。
OpenCV 2.4.7でOpenCLを試してみた 5
2.4.7からOpenCVをビルドしなくてもOpenCLが利用できるようになっている。
カラー、白黒変換のAPIで処理時間を計測してみた。
処理内容
0 VGAサイズのカラー画像を読み込む
1 matのcloneでデータのコピー
2 cvtColorで白黒に変換
3 matのcloneでデータのコピー
4 表示
5 キー入力待ち
while()で1-5の処理の繰り返す
時間の計測は、1,2,3の前後でcv::getTickCount()を呼び、その差から計算している
CPU版
リリースモードでビルドしているが、Visual Studio から実行しているので、若干オーバヘッドが含まれている
1回目のcvtColorに時間がかかっているが、あとはほぼ一定の時間と思われる
1,3でのデータ転送量の比(3:1)が、そのまま処理時間の比と同じである
OCL版
処理内容は同じであるが使用する関数とMatがOCL対応になる
1回目は、カーネルのコンパイル時間が含まれており、5秒近くの処理時間がかかっている
2回目以降の処理時間は安定しているが、1,3での処理時間が変わらない結果となっている
1,2の処理時間も約4倍となっており、当方の環境では、VGAサイズの画像に対して簡単な処理をOCL化することは、まったく速くならないことが確認された。
特徴点やObject検出など計算量が多い場合には、処理時間の短縮が見込めるかも知れない
メモ
ocl版resizeでは、フィルターtタイプに、INTER NEAREST or INTER LINEARしか使えない
他の値では、落ちる
カラー、白黒変換のAPIで処理時間を計測してみた。
処理内容
0 VGAサイズのカラー画像を読み込む
1 matのcloneでデータのコピー
2 cvtColorで白黒に変換
3 matのcloneでデータのコピー
4 表示
5 キー入力待ち
while()で1-5の処理の繰り返す
時間の計測は、1,2,3の前後でcv::getTickCount()を呼び、その差から計算している
CPU版
リリースモードでビルドしているが、Visual Studio から実行しているので、若干オーバヘッドが含まれている
1回目のcvtColorに時間がかかっているが、あとはほぼ一定の時間と思われる
1,3でのデータ転送量の比(3:1)が、そのまま処理時間の比と同じである
OCL版
処理内容は同じであるが使用する関数とMatがOCL対応になる
1回目は、カーネルのコンパイル時間が含まれており、5秒近くの処理時間がかかっている
2回目以降の処理時間は安定しているが、1,3での処理時間が変わらない結果となっている
1,2の処理時間も約4倍となっており、当方の環境では、VGAサイズの画像に対して簡単な処理をOCL化することは、まったく速くならないことが確認された。
特徴点やObject検出など計算量が多い場合には、処理時間の短縮が見込めるかも知れない
メモ
ocl版resizeでは、フィルターtタイプに、INTER NEAREST or INTER LINEARしか使えない
他の値では、落ちる
2013年11月27日水曜日
OpenCVの特徴点検出で使用するAPIに関して
前回のメモ
OpenCVでBOWを使用して認識を行うための調査をした
の中で、参考Webページ
OpenCV で SIFT 記述子を Dense Sampling する
のサンプルコードは、2.3.1を対象として書かれている
そのソースを2.4.7の環境で使用すると、記事下部の
cv::SIFT::DescriptorParams::GET_DEFAULT_MAGNIFICATION()
のところでDescriptorParamsがみつからないとエラーとなる
特徴点の検出用 API および、特徴量の取得用 APIに関してOpenCVのサンプルやチュートリアルでもばらつきが生じており、使用を推奨されないAPIも多数あるというこまった状態である。
チュートリアルの、2次元特徴点の検出のチュートリアルのサンプルでは、SurfFeatureDetector が使用されているが、Sift同様にドキュメントの検索でAPIの説明はみつからない
同じく、特徴量取得のチュートリアルのサンプルでは、特徴量の取得に、SurfDescriptorExtractor が使用されているが、SurfFeatureDetector 同様にドキュメントの検索でAPIの説明はみつからない
ということで、sample内のソースを覗いてみることにする。
OpenCVでBOWを使用して認識を行うための調査をした
の中で、参考Webページ
OpenCV で SIFT 記述子を Dense Sampling する
のサンプルコードは、2.3.1を対象として書かれている
そのソースを2.4.7の環境で使用すると、記事下部の
cv::SIFT::DescriptorParams::GET_DEFAULT_MAGNIFICATION()
のところでDescriptorParamsがみつからないとエラーとなる
特徴点の検出用 API および、特徴量の取得用 APIに関してOpenCVのサンプルやチュートリアルでもばらつきが生じており、使用を推奨されないAPIも多数あるというこまった状態である。
チュートリアルの、2次元特徴点の検出のチュートリアルのサンプルでは、SurfFeatureDetector が使用されているが、Sift同様にドキュメントの検索でAPIの説明はみつからない
同じく、特徴量取得のチュートリアルのサンプルでは、特徴量の取得に、SurfDescriptorExtractor が使用されているが、SurfFeatureDetector 同様にドキュメントの検索でAPIの説明はみつからない
ということで、sample内のソースを覗いてみることにする。
OpenCVでBOWを使用して認識を行うための調査をした
BOW Bag of visual keyword
ほかに、
BOK Bag of keypoints
BOF Bag of features
などと呼ばれている
特徴量を指しているのでこれだけでは認識できない。SVMと組み合わせて使用する
ベースとなる考え方なので、性能向上のためにさまざまな派生の方法が考案されている。
また、実際に使用するに当たっては、さまざまな文書化されていないノウハウが必要である。
サンプルプログラムは
sources\samples\cpp\bagofwords_classification.cpp
に格納されている
ファイルサイズが、114kもあり、それなりのボリュームなのでソースを見ても全体の流れが把握しにくい
google先生に尋ねてみるといくつかの資料が見つかった
以下調査中なので個人的メモ
以上
ほかに、
BOK Bag of keypoints
BOF Bag of features
などと呼ばれている
特徴量を指しているのでこれだけでは認識できない。SVMと組み合わせて使用する
ベースとなる考え方なので、性能向上のためにさまざまな派生の方法が考案されている。
また、実際に使用するに当たっては、さまざまな文書化されていないノウハウが必要である。
サンプルプログラムは
sources\samples\cpp\bagofwords_classification.cpp
に格納されている
ファイルサイズが、114kもあり、それなりのボリュームなのでソースを見ても全体の流れが把握しにくい
google先生に尋ねてみるといくつかの資料が見つかった
以下調査中なので個人的メモ
以上
2013年11月21日木曜日
2013年11月20日水曜日
Windows7 64bit版にOpenCV 2.4.7の開発環境を構築した
検索などでこのページを訪れる人が、数は少ないけど、コンスタントにいる。
ちょうどこの上にあるG+1のボタンを押してもらうと、Goolgeの検索に見つかりやすくなるので、ご協力いただきたい。
Windows版は、OpenGL、OpenNI、CUDAを使用しなければ、ダウンロードしたファイルを展開して設定すれば使用できるので、30分もかからず環境ができる。
(ダウンロード時間や、Visual Studio 2010 Express Editionのインストールを除く)
2.4.4からVisual Studio 2012がサポートされるようになったが、以下は、Windows7 64bit版上で、Visual Studio 2010 Express Editionでプログラムを開発するためのものである
(Windows7 32bit版でも同じ手順でできる)
また、2.4.7からは、2008がサポートされなくなったので注意
1 ここからWindows版をダウンロードする
2 OpenCV-2.4.7.0.exeを実行しインストールディレクトリc:\を指定する
3 展開後、ディレクトリ名をopencvからopencv247に変更する
4 OSの環境変数の設定(要管理者権限)
コントロールパネル、システムとセキュリティ、システムを開き
システムの詳細設定の環境変数ボタンを押し
システム環境変数のPathの編集
末尾に";C:\opencv247\build\x86\vc10\bin"を追加
(この作業後、一度ログオフし、再度ログインする)
注意 64bitの開発を行う場合は、x64を選択すること Visual Studio 2010 Express Editionでは、64bit開発できないので32bitを用いている
5 Visual C++ 2010 Expressのパスの設定を行う
この記事を参考に
6 手持ちのサンプルをビルドし動作確認する
以上
ちょうどこの上にあるG+1のボタンを押してもらうと、Goolgeの検索に見つかりやすくなるので、ご協力いただきたい。
Windows版は、OpenGL、OpenNI、CUDAを使用しなければ、ダウンロードしたファイルを展開して設定すれば使用できるので、30分もかからず環境ができる。
(ダウンロード時間や、Visual Studio 2010 Express Editionのインストールを除く)
2.4.4からVisual Studio 2012がサポートされるようになったが、以下は、Windows7 64bit版上で、Visual Studio 2010 Express Editionでプログラムを開発するためのものである
(Windows7 32bit版でも同じ手順でできる)
また、2.4.7からは、2008がサポートされなくなったので注意
1 ここからWindows版をダウンロードする
2 OpenCV-2.4.7.0.exeを実行しインストールディレクトリc:\を指定する
3 展開後、ディレクトリ名をopencvからopencv247に変更する
4 OSの環境変数の設定(要管理者権限)
コントロールパネル、システムとセキュリティ、システムを開き
システムの詳細設定の環境変数ボタンを押し
システム環境変数のPathの編集
末尾に";C:\opencv247\build\x86\vc10\bin"を追加
(この作業後、一度ログオフし、再度ログインする)
注意 64bitの開発を行う場合は、x64を選択すること Visual Studio 2010 Express Editionでは、64bit開発できないので32bitを用いている
5 Visual C++ 2010 Expressのパスの設定を行う
この記事を参考に
6 手持ちのサンプルをビルドし動作確認する
以上
Visual C++ 2010 ExpressにOpenCVのディレクトリを設定した 修正版
毎回プロジェクトにincludeパスを設定したり、ソースのパスを修正するのも手間がかかるのでVisual C++ 2010 ExpressにOpenCVのディレクトリを設定した。
前回は手動で設定ファイルを編集したが、Visual C++ 2010 Expressのメニューから編集できる
1 プロジェクトを作成、あるいは、読み込み、メニューの表示のプロパティーマネージャを選択
2 Microsoft.Cpp.Win32.userを編集
3 共通プロパティのC++、全般を選択
4 追加のインクルードディレクトリを選択
5 追加のインクルードディレクトリにOpenCVのインクルード用のフォルダーを設定
6 Microsoft.Cpp.Win32.userを保存
注意
・Debug,Relese双方編集する必要あり
・Microsoft.Cpp.Win32.userを編集するとすべてのプロジェクトが影響を受ける
以上
前回は手動で設定ファイルを編集したが、Visual C++ 2010 Expressのメニューから編集できる
1 プロジェクトを作成、あるいは、読み込み、メニューの表示のプロパティーマネージャを選択
2 Microsoft.Cpp.Win32.userを編集
3 共通プロパティのC++、全般を選択
4 追加のインクルードディレクトリを選択
5 追加のインクルードディレクトリにOpenCVのインクルード用のフォルダーを設定
6 Microsoft.Cpp.Win32.userを保存
注意
・Debug,Relese双方編集する必要あり
・Microsoft.Cpp.Win32.userを編集するとすべてのプロジェクトが影響を受ける
以上
2013年11月19日火曜日
OpenCVでHOG特徴量+SVMで人物検出を行う 1
以前サンプルを動かしてみたが、独自の辞書作成のためにOpenCVのHOGを調査している。
(現在2.4.7になっており内容が異なっているので、2.4.6限定の話である。
また、調査した時期も数カ月前なのでoclを考慮していない)
OpenCV2.4.6のHOGのソースは、
modules\objdetect\src\hog.cpp
であり、CPU版のサンプルは、
samples\cpp\peopledetect.cpp
GPU版のサンプルは、
samples\gpu\hog.cpp
である。
OCL版も準備されているが、OCLの環境がないため無視する。
CPU版のソースをみると計算される特徴量は、
INRIA Object Detection and Localization Toolkit
(http://pascal.inrialpes.fr/soft/olt/)
と互換性があるとのことだが、オリジナルが英語なので現在未読である。
サンプルプログラムの内容
CPU版のサンプルプログラムで、HOG関連をひらっていくと
インスタンスの作成
Line48で、HOGDescriptor hog;
辞書の設定
Line49で、hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
検出処理
Line79で、hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2);
検出結果は、cv::vector<Rect> foundに格納される
検出した領域の重複検査を行い、重複がない場合のみ、cv::vector<Rect> found_filteredに格納されている。(Line 83-91)
また、オリジナルの辞書は、人の周りの余白が多いため、表示の時に検出された領域を縮小している。(Line 92-102)
以上のような処理を行っている。
HOG関数
なぜか、CPU版のドキュメントは準備されていない。Webで検索するとGPU版の説明のみHitする。
HOGDescriptorには、各種パラメータが設定できるようになっているが、コードの実装は固定値を使用しており、自由に変更できない
CELLサイズ 8x8のみサポート
BLOCKサイズ 16x16のみサポート
BINサイズ 9bins
BLOCK移動量 CELLサイズの整数倍
また、入力画像にガンマ補正処理のフラグがあり、デフォルトではtrueとなっている
Line49 API名は、setSVMDetectorとなっているが、HOGDescriptor::getDefaultPeopleDetector()の戻り値は、static std::vector<float>であり、
実際の処理は検出用の辞書データを設定している。
CPU版のソースでgetDefaultPeopleDetectorをみてみると
vector<float> HOGDescriptor::getDefaultPeopleDetector()
{
static const float detector[] = {
以下 辞書データをそのままfloatの配列に書き込んでいる
一見、辞書の差し替えができる構造に見えるが、辞書作成用のHOG + SVMのツールは、提供されていないので、INRIA Object Detection and Localization Toolkitで
自力で作成する必要がある。
あとドキュメント化されていないようだが、getDefaultPeopleDetectorの辞書に登録されている画像データのサイズは64x128画素であり、
この大きさより、小さい人物を検出したい場合は、対象の画像を拡大しないといけない。
拡大すると、検出精度が低下するため、別途48x96画素の辞書データが準備されている
その場合、HOGDescriptor::getDaimlerPeopleDetector()を使用しないといけない
HOG関数内での基本処理
ガンマ補正
縦、横の3x3のsobelフィルター
角度と長さの計算
blockのヒストグラム計算
ヒストグラムの正規化
SVMの計算
マルチスケールで各スケール画像で領域を検出した後、領域を統合する必要がある
計算コストの関係で、meansiftが使用されるとのこと
ソース内部でも
if ( useMeanshiftGrouping )
{
groupRectangles_meanshift(foundLocations, foundWeights, foundScales, finalThreshold, winSize);
}
else
{
groupRectangles(foundLocations, (int)finalThreshold, 0.2);
のように使用されている
groupRectangles_meanshiftは、cascadedetect.cppで定義されており、自作プログラムからは、cv::groupRectangles_meanshiftで呼び出すことが可能である。
しかし、ドキュメントには説明はないので、なくなる可能性もある
//new grouping function with using meanshift
static void groupRectangles_meanshift(vector<Rect>& rectList, double detectThreshold, vector<double>* foundWeights,
vector<double>& scales, Size winDetSize)
関数内部では、MeanshiftGroupingクラスが使用されており、計算はこのクラスで行っているようだ。
関連ドキュメント
(現在2.4.7になっており内容が異なっているので、2.4.6限定の話である。
また、調査した時期も数カ月前なのでoclを考慮していない)
OpenCV2.4.6のHOGのソースは、
modules\objdetect\src\hog.cpp
であり、CPU版のサンプルは、
samples\cpp\peopledetect.cpp
GPU版のサンプルは、
samples\gpu\hog.cpp
である。
OCL版も準備されているが、OCLの環境がないため無視する。
CPU版のソースをみると計算される特徴量は、
INRIA Object Detection and Localization Toolkit
(http://pascal.inrialpes.fr/soft/olt/)
と互換性があるとのことだが、オリジナルが英語なので現在未読である。
サンプルプログラムの内容
CPU版のサンプルプログラムで、HOG関連をひらっていくと
インスタンスの作成
Line48で、HOGDescriptor hog;
辞書の設定
Line49で、hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
検出処理
Line79で、hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2);
検出結果は、cv::vector<Rect> foundに格納される
検出した領域の重複検査を行い、重複がない場合のみ、cv::vector<Rect> found_filteredに格納されている。(Line 83-91)
また、オリジナルの辞書は、人の周りの余白が多いため、表示の時に検出された領域を縮小している。(Line 92-102)
以上のような処理を行っている。
HOG関数
なぜか、CPU版のドキュメントは準備されていない。Webで検索するとGPU版の説明のみHitする。
HOGDescriptorには、各種パラメータが設定できるようになっているが、コードの実装は固定値を使用しており、自由に変更できない
CELLサイズ 8x8のみサポート
BLOCKサイズ 16x16のみサポート
BINサイズ 9bins
BLOCK移動量 CELLサイズの整数倍
また、入力画像にガンマ補正処理のフラグがあり、デフォルトではtrueとなっている
Line49 API名は、setSVMDetectorとなっているが、HOGDescriptor::getDefaultPeopleDetector()の戻り値は、static std::vector<float>であり、
実際の処理は検出用の辞書データを設定している。
CPU版のソースでgetDefaultPeopleDetectorをみてみると
vector<float> HOGDescriptor::getDefaultPeopleDetector()
{
static const float detector[] = {
以下 辞書データをそのままfloatの配列に書き込んでいる
一見、辞書の差し替えができる構造に見えるが、辞書作成用のHOG + SVMのツールは、提供されていないので、INRIA Object Detection and Localization Toolkitで
自力で作成する必要がある。
あとドキュメント化されていないようだが、getDefaultPeopleDetectorの辞書に登録されている画像データのサイズは64x128画素であり、
この大きさより、小さい人物を検出したい場合は、対象の画像を拡大しないといけない。
拡大すると、検出精度が低下するため、別途48x96画素の辞書データが準備されている
その場合、HOGDescriptor::getDaimlerPeopleDetector()を使用しないといけない
HOG関数内での基本処理
ガンマ補正
縦、横の3x3のsobelフィルター
角度と長さの計算
blockのヒストグラム計算
ヒストグラムの正規化
SVMの計算
マルチスケールで各スケール画像で領域を検出した後、領域を統合する必要がある
計算コストの関係で、meansiftが使用されるとのこと
ソース内部でも
if ( useMeanshiftGrouping )
{
groupRectangles_meanshift(foundLocations, foundWeights, foundScales, finalThreshold, winSize);
}
else
{
groupRectangles(foundLocations, (int)finalThreshold, 0.2);
のように使用されている
groupRectangles_meanshiftは、cascadedetect.cppで定義されており、自作プログラムからは、cv::groupRectangles_meanshiftで呼び出すことが可能である。
しかし、ドキュメントには説明はないので、なくなる可能性もある
//new grouping function with using meanshift
static void groupRectangles_meanshift(vector<Rect>& rectList, double detectThreshold, vector<double>* foundWeights,
vector<double>& scales, Size winDetSize)
関数内部では、MeanshiftGroupingクラスが使用されており、計算はこのクラスで行っているようだ。
関連ドキュメント
- fastHOG - a real-time GPU implementation of HOG
- Computer Vision on GPU with OpenCV
- GPU & CPU Cooperative Accelerated Pedestrian and Vehicle Detection
- OpenCV on a GPU
- 統計的学習手法による人検出
- 局所特徴量と統計学習手法による物体検出
OpenVXがリリースされた
OpenCV 2.4.7でOpenCLを試してみた 4
OpenCVのOpenCL モジュール紹介を訳してみた
当方OpenCLのまったくの初心者なので、誤った解釈をしていたり意味不明な点も多いあるが、OpenCVのOpenCL モジュール紹介を訳してみた。
将来すべてのOpenCLデバイスで実現したいが、現在対応しているのはGPUデバイスのみである
GPUデバイスは、NVidia, AMDの単体GPUデバイスだけでなく、AMD APU, Intel HDのような統合チップも含んでいる
パフォーマンスはデバイスに依存するが、精度はCPUと同じであることをすべてのGPUと環境(Windows, Linux)で確認している
OpenCV OCL モジュールは、OpenCLの知識なしで使用できるようにデザインされている
OpenCV OCL モジュールは、GPUデバイスの可能性を得るアクセラレータとみなすこともできるが、ユーザ自身のカーネルを作成するための取り掛かりとみなすこともできる
OpenCLの知識があれば手助けになるが、カーネルのソースは、OpenCLの勉強に役立つと望んでいる。
カーネルの知識は、既存のOpenCLのカーネルチューニングだけでなく、機能追加に必須である
正しくOpenCLのモジュールを動作させるためには、デバイスベンダーのランタイムが必要である
OCLを使用するには、CMakeで、WITH_OPENCL=ONにしてOpenCVを作成する必要がある(2.4.7のWindows版は、対応しているので不要である)
フラグがオンで、かつ、SDKがインストールされている場合は、OCLモジュールが作成される
AMD’S FFT や BLAS のライブラリがーあれば、WITH_OPENCLAMDFFT=ON, WITH_OPENCLAMDBLAS=ON.を使用できる
OCLのモジュールは、modulesに格納されている
C++のラッパークラスのソースコードは、modules/ocl/srcに、カーネル自身は、modules/ocl/src/openclに格納されている
サンプルは、samples/oclに、精度のテストは、modules/ocl/testに、パフォーマンスは、module/ocl/perfに格納されている
環境変数 OPENCV_OPENCL_DEVICE で使用するOpenCLデバイスを指定できる
(指定方法は略)
あるいは、cv::ocl::setDeviceで指定することもできる。この関数により、OpenCLのランタイムを初期化し、指定のデバイスを計算デバイスとして設定する。
現在、すべてのスレッドは同じコンテキストを共有しており、マルチデバイスには対応していないが、すぐに対応する予定である
4chをサポートすれば、3chもサポートしないといけない。oclMatでは、3chのRGBイメージは、4chを意味しており、3chの場合
4ch目は使用されていない。OpenCVのMatとoclMatとの互換性のためである
開発者ノート
CPUと単体GPU間でのデータ転送のコストは大きいので、アルゴリズムのパイプラインの最初と最後のみデータ転送すべきである
将来すべてのOpenCLデバイスで実現したいが、現在対応しているのはGPUデバイスのみである
GPUデバイスは、NVidia, AMDの単体GPUデバイスだけでなく、AMD APU, Intel HDのような統合チップも含んでいる
パフォーマンスはデバイスに依存するが、精度はCPUと同じであることをすべてのGPUと環境(Windows, Linux)で確認している
OpenCV OCL モジュールは、OpenCLの知識なしで使用できるようにデザインされている
OpenCV OCL モジュールは、GPUデバイスの可能性を得るアクセラレータとみなすこともできるが、ユーザ自身のカーネルを作成するための取り掛かりとみなすこともできる
OpenCLの知識があれば手助けになるが、カーネルのソースは、OpenCLの勉強に役立つと望んでいる。
カーネルの知識は、既存のOpenCLのカーネルチューニングだけでなく、機能追加に必須である
正しくOpenCLのモジュールを動作させるためには、デバイスベンダーのランタイムが必要である
OCLを使用するには、CMakeで、WITH_OPENCL=ONにしてOpenCVを作成する必要がある(2.4.7のWindows版は、対応しているので不要である)
フラグがオンで、かつ、SDKがインストールされている場合は、OCLモジュールが作成される
AMD’S FFT や BLAS のライブラリがーあれば、WITH_OPENCLAMDFFT=ON, WITH_OPENCLAMDBLAS=ON.を使用できる
OCLのモジュールは、modulesに格納されている
C++のラッパークラスのソースコードは、modules/ocl/srcに、カーネル自身は、modules/ocl/src/openclに格納されている
サンプルは、samples/oclに、精度のテストは、modules/ocl/testに、パフォーマンスは、module/ocl/perfに格納されている
環境変数 OPENCV_OPENCL_DEVICE で使用するOpenCLデバイスを指定できる
(指定方法は略)
あるいは、cv::ocl::setDeviceで指定することもできる。この関数により、OpenCLのランタイムを初期化し、指定のデバイスを計算デバイスとして設定する。
現在、すべてのスレッドは同じコンテキストを共有しており、マルチデバイスには対応していないが、すぐに対応する予定である
4chをサポートすれば、3chもサポートしないといけない。oclMatでは、3chのRGBイメージは、4chを意味しており、3chの場合
4ch目は使用されていない。OpenCVのMatとoclMatとの互換性のためである
開発者ノート
CPUと単体GPU間でのデータ転送のコストは大きいので、アルゴリズムのパイプラインの最初と最後のみデータ転送すべきである
- FULL ProfileサポートのOpenCL1.1以降が必要
- 現在、OpenCLのコンテキストとコマンドキューは1つある。マルチデバイスとマルチキューを将来サポートしたい
- 可能な場合、多くのカーネルは、256のワークグループを使用しているので、デバイスの最大ワークグループ数は256以上必要である。すべてのGPUデバイスは、対応しているが、それ以外のデバイスは対応していない
- もしデバイスが、倍精度をサポートしていない場合は、エラーとなる
- oclMatは、イメージオブジェクトではなく、バッファオブジェクトを使用している
- oclMatでは、3chのRGBイメージは、4chを意味しており、3chの場合4ch目は使用されていない。OpenCVのMatとoclMatとの互換性のためである
- oclMatでは、列方向に配置される。(now the alignment factor for step is 32+ byte) means, m.cols * m.elemSize() <= m.step.となる
- ・Mat and oclMat間でのデータ転送 もし、Matが列方向に配置されていると転送は速い。そうでない場合は、アライメントを保証するために、clEnqueueRead/WriteBufferRectを使用する。3chの場合例外で、デバイスに転送される場合に4chに変換される(CPUへの転送は逆になる)
- Mat and oclMat間ではROIの扱いが異なる。oclMatでは、ROIが扱えないので、すべての画像がデバイスにいったん転送される。
- カーネルのソースは、modules/ocl/src/opencl/の拡張子、.clである。 opencl_kernels.cppで、カーネルは変換され、拡張子のないファイル名がソースのファイル名になる
2013年11月18日月曜日
OpenCV 2.4.7でOpenCLを試してみた 3
2.4.7からOpenCVをビルドしなくてもOpenCLが利用できるようになっている。
OpenCLに関しては、"これからの並列計算のためのGPGPU連載講座(VI)" を参考にさせていただいた
本来なら、前処理など複雑な手順が必要であるが、OpenCVでは、これらの作業が隠避されており、素人に対しての障壁が低くなっている。
OpenCVのOpenCL用の関数のソースが、sources\modules\ocl\srcに格納されているので、気になる人は覗いてみると面白いかもしれない。
ソースの中を覗いているとコマンドキューにコマンドを送る関数 openCLExecuteKernel がメインとなっており、多くのクラスは、ラッパーとなっている。
また、sources\modules\ocl\src\openclにカーネルのソースが格納されており、sources\modules\ocl\src\cl_runtimeにランタイム関連のソースが含まれている
このあたりを参考にすれば、原理的には自前の関数をOCL対応でき、OpenCVから呼び出すことが可能かと考えられるが、当方スキル不足なので実現は無理である。
OpenCLに関しては、"これからの並列計算のためのGPGPU連載講座(VI)" を参考にさせていただいた
本来なら、前処理など複雑な手順が必要であるが、OpenCVでは、これらの作業が隠避されており、素人に対しての障壁が低くなっている。
OpenCVのOpenCL用の関数のソースが、sources\modules\ocl\srcに格納されているので、気になる人は覗いてみると面白いかもしれない。
ソースの中を覗いているとコマンドキューにコマンドを送る関数 openCLExecuteKernel がメインとなっており、多くのクラスは、ラッパーとなっている。
また、sources\modules\ocl\src\openclにカーネルのソースが格納されており、sources\modules\ocl\src\cl_runtimeにランタイム関連のソースが含まれている
このあたりを参考にすれば、原理的には自前の関数をOCL対応でき、OpenCVから呼び出すことが可能かと考えられるが、当方スキル不足なので実現は無理である。
OpenCV 2.4.7でOpenCLを試してみた 2
2.4.7からOpenCVをビルドしなくてもOpenCLが利用できるようになっている。
使用している開発マシンのOpenCLデバイス情報を調べてみた。
デバイス情報は、cv::ocl::getOpenCLDevicesを用いて、cv::ocl::DevicesInfoを取得することで得られる。
最初、deviceTypeを指定しないと、DevicesInfoのsizeが0になり焦ったが、deviceTypeにCVCL_DEVICE_TYPE_CPUを指定することでデータを取得できた。
本来ならコンソールに各情報を取得するプログラムを書きたかったが、手抜きでデバッガーで変数を表示させている
気になる値
local Memory size 個々のWorkGroup用のローカルメモリーは32kである
Max memory allocation size ?は、約511Mである
使用している開発マシンのOpenCLデバイス情報を調べてみた。
デバイス情報は、cv::ocl::getOpenCLDevicesを用いて、cv::ocl::DevicesInfoを取得することで得られる。
最初、deviceTypeを指定しないと、DevicesInfoのsizeが0になり焦ったが、deviceTypeにCVCL_DEVICE_TYPE_CPUを指定することでデータを取得できた。
本来ならコンソールに各情報を取得するプログラムを書きたかったが、手抜きでデバッガーで変数を表示させている
気になる値
local Memory size 個々のWorkGroup用のローカルメモリーは32kである
Max memory allocation size ?は、約511Mである
2013年11月15日金曜日
OpenCV 2.4.7でOpenCLを試してみた 1
2.4.7からOpenCVをビルドしなくてもOpenCLが利用できるようになっている。
1 準備
最初に自分の環境あったデバイスのOpenCL SDKをインストールしておく
GPUを所持していないので、Intel版で試す。
IntelのSDKは、ここからダウンロードする。
注意
Visual studio 2010 Express Editionを使用しているとき、インストール途中のVisual studio 2010のチェックをはずすこと
2 動作テスト
sources\samples\oclにサンプルのコードがあるが、テストプログラムを作成
OCL関連のヘッダーとライブラリを加える
#include <opencv2/ocl/ocl.hpp>
#pragma comment(lib,"opencv_ocl247d.lib")
ソース(コアのみ)
int main(int argc, char** argv)
{
cv::Mat matIn = cv::imread("c:\\hoge.png"), matDisp;
cv::imshow("Color", matIn);
cv::ocl::oclMat oclIn(matIn), oclOut;
cv::ocl::cvtColor(oclIn, oclOut, cv::COLOR_BGR2GRAY);
oclOut.download(matDisp);
cv::imshow("Gray",matDisp);
cv::waitKey(0);
return 0;
}
テストプログラムでは、白黒に変換している。
起動すると、絵が表示されるまでに10秒近く時間がかかる。
注意
追加11/15 17:50 未確認
当方の環境 OpenCL対応デバイスが、Intel CPUのみなので初期化が不要であったが、グラフィックスボードを追加し、ボードに対応したOpenCL SDKをインストールした場合には、ocl::setDeviceを呼ぶ必要があるかもしれない
関連ドキュメント
1 準備
最初に自分の環境あったデバイスのOpenCL SDKをインストールしておく
GPUを所持していないので、Intel版で試す。
IntelのSDKは、ここからダウンロードする。
注意
Visual studio 2010 Express Editionを使用しているとき、インストール途中のVisual studio 2010のチェックをはずすこと
2 動作テスト
sources\samples\oclにサンプルのコードがあるが、テストプログラムを作成
OCL関連のヘッダーとライブラリを加える
#include <opencv2/ocl/ocl.hpp>
#pragma comment(lib,"opencv_ocl247d.lib")
ソース(コアのみ)
int main(int argc, char** argv)
{
cv::Mat matIn = cv::imread("c:\\hoge.png"), matDisp;
cv::imshow("Color", matIn);
cv::ocl::oclMat oclIn(matIn), oclOut;
cv::ocl::cvtColor(oclIn, oclOut, cv::COLOR_BGR2GRAY);
oclOut.download(matDisp);
cv::imshow("Gray",matDisp);
cv::waitKey(0);
return 0;
}
テストプログラムでは、白黒に変換している。
起動すると、絵が表示されるまでに10秒近く時間がかかる。
注意
- OCLは、実行時に環境にあわせたカーネルソースがバイナリにコンパイルされるため、オーバヘッドが大きいので、よく使用する関数は、起動時にダミーを呼んでおくのがよいそうだ。
- メモリーと対象デバイス間の転送時間がかかるため、サイズの大きい画像でないとメリットはない
- ネットには事前に、ocl::getDeviseを呼ぶようにとかかれたものがあるが、2.4.7では必要ないし、そのような関数はなくなっている
追加11/15 17:50 未確認
当方の環境 OpenCL対応デバイスが、Intel CPUのみなので初期化が不要であったが、グラフィックスボードを追加し、ボードに対応したOpenCL SDKをインストールした場合には、ocl::setDeviceを呼ぶ必要があるかもしれない
関連ドキュメント
OpenCV関連のkindle本が安い
11/15での価格 改定される可能性あり
Mastering OpenCV With Practical Computer Vision Projects
ペーパ 4661円 kindle 1853円
Android Application Programming with Opencv
ペーパ 3629円 kindle 1447円
amazonにこんなマニアックなカテゴリが
Artificial Intelligence Machine Vision の ベストセラー
Mastering OpenCV With Practical Computer Vision Projects
ペーパ 4661円 kindle 1853円
Android Application Programming with Opencv
ペーパ 3629円 kindle 1447円
amazonにこんなマニアックなカテゴリが
Artificial Intelligence Machine Vision の ベストセラー
2013年11月14日木曜日
OpenCV 2.4.7の Build情報を表示させてみた
cv::getBuildInformation()を使用し、windows版のOpenCV2.4.7のビルド条件を表示させてみた。
2.4.7から、OpenCLがデフォルトでONとなっている
また、FFMPEGのバージョンが更新されている
2.4.6はこちら
2.4.7から、OpenCLがデフォルトでONとなっている
また、FFMPEGのバージョンが更新されている
2.4.6はこちら
2013年11月13日水曜日
OpenCV2.4.7のサンプルを見てみた
sources\sample\cppの内容を2.4.6と比較してみた
tutorialは調べていない
変更点
空白行削除
bgfg_gmg.cpp
calibration_artificial.cpp
dft.cpp
houghlines.cpp
opencv_version.cpp
phase_corr.cpp
retinaDemo.cpp
stereo_calib.cpp
stitching.cpp
stitching_detailed.cpp
コンパイルオプションの追加
hybridtrackingsample.cpp
後処理追加
latentsvm_multidetect.cpp
名前の変更
新 OpenEXRimages_HDR_Retina_toneMapping.cpp
旧 OpenEXRimages_HighDynamicRange_Retina_toneMapping.cpp
名前の変更+コンパイルオプションの追加
新 OpenEXRimages_HDR_Retina_toneMapping_video.cpp
旧 OpenEXRimages_HighDynamicRange_Retina_toneMapping_video.cpp
以上
tutorialは調べていない
変更点
空白行削除
bgfg_gmg.cpp
calibration_artificial.cpp
dft.cpp
houghlines.cpp
opencv_version.cpp
phase_corr.cpp
retinaDemo.cpp
stereo_calib.cpp
stitching.cpp
stitching_detailed.cpp
コンパイルオプションの追加
hybridtrackingsample.cpp
後処理追加
latentsvm_multidetect.cpp
名前の変更
新 OpenEXRimages_HDR_Retina_toneMapping.cpp
旧 OpenEXRimages_HighDynamicRange_Retina_toneMapping.cpp
名前の変更+コンパイルオプションの追加
新 OpenEXRimages_HDR_Retina_toneMapping_video.cpp
旧 OpenEXRimages_HighDynamicRange_Retina_toneMapping_video.cpp
以上
2013年11月12日火曜日
OpenCVのリンクするライブラリのバージョンを変更する
ソースに以下用に記述するすると変更が簡単で間違いも少なくなる
#ifdef _DEBUG
//Debugモードの場合
#define CV_VER "247d"
#else
//Releaseモードの場合
#define CV_VER "247"
#endif
#pragma comment(lib, "opencv_core"CV_VER".lib")
#pragma comment(lib, "opencv_imgproc"CV_VER".lib")
#pragma comment(lib, "opencv_highgui"CV_VER".lib")
#pragma comment(lib, "opencv_video"CV_VER".lib")
#pragma comment(lib,"opencv_objdetect"CV_VER".lib")
#ifdef _DEBUG
//Debugモードの場合
#define CV_VER "247d"
#else
//Releaseモードの場合
#define CV_VER "247"
#endif
#pragma comment(lib, "opencv_core"CV_VER".lib")
#pragma comment(lib, "opencv_imgproc"CV_VER".lib")
#pragma comment(lib, "opencv_highgui"CV_VER".lib")
#pragma comment(lib, "opencv_video"CV_VER".lib")
#pragma comment(lib,"opencv_objdetect"CV_VER".lib")
OpenCV 2.4.7のドキュメントの変更点
ダウンロードしたSDKのbuild/docにドキュメントが格納されている
ページ数のみの比較
The OpenCV User Guide Release 2.4.7.0
P17(21) 2013/11/7
2.4.6から変更
The OpenCV Tutorials Release 2.4.6.0
P421(427) 2013/7/1
2.4.6から変わらず
The OpenCV Reference Manual Release 2.4.7.0
P869(875) 2013/11/7
2.4.6から大幅に増加
The OpenCV Manager Manual Release 2.4.7.0
P11(15) 2013/11/7
2.4.6に存在していたか未確認
以上
ページ数のみの比較
The OpenCV User Guide Release 2.4.7.0
P17(21) 2013/11/7
2.4.6から変更
The OpenCV Tutorials Release 2.4.6.0
P421(427) 2013/7/1
2.4.6から変わらず
The OpenCV Reference Manual Release 2.4.7.0
P869(875) 2013/11/7
2.4.6から大幅に増加
The OpenCV Manager Manual Release 2.4.7.0
P11(15) 2013/11/7
2.4.6に存在していたか未確認
以上
OpenCv2.4.7がリリースされた
ようやく公式でアナウンスされた。
変更点
OpenCL
OpenCL SDKがなくてもビルドできる
実行時に動的にOpenCLの使用が判断される
再ビルドなしにデフォルトのCLデバイスを変更可能
モジュールの最適化、バグ修正、ドキュメントの更新
SVM, MOG/MOG2, KalmanFilter なども対応
CUDA
histograms, TV-L1 optical flow 、 resizeに対応
stereo matchingのサンプル更新
BGR<->YUV変換とbitwize操作のバグ修正
ビルド時の問題を解決
Android
NDK-r9をサポート
native cameraのバグ修正
API level 14 以降のMediaRecorder hintに対応
JavaCameraViewの速度低下を修正
WindowsRT
OpenEXR とカメラを除くMSの認証試験の問題に対応
XAMLベースのビデオ処理を実装
back-end for VideoCaptureを修正
github
326の382 pull requestsをマージ
バグ修正
2.4.6で報告された54のバグを修正
2013年11月8日金曜日
OpenCV 2.4.7が公開された
公式はアナウンスされていないが、ここからダウンロードできる。
ただし、Win版(ダウンロードサイズが272M)とUNIX版のみでiOSとAndoridは遅れているようだ
変更点のアナウンスはまだされていない
ダウンロードした中身を見たらフォルダー構成が変更されており、直下には、buildとsourcesのみとなった
2.4.6まで、直下にあった他のbuild以外のフォルダーは、sourcesの下に移動したので注意
Win版のサポートされている開発環境からvc9(Visual Studio 2008)がなくなり、vc10(Visual Studio 2010)とvc11(Visual Studio 2012)になった。
Visual Studio 2013もまだ対応されていないので注意
ただし、Win版(ダウンロードサイズが272M)とUNIX版のみでiOSとAndoridは遅れているようだ
変更点のアナウンスはまだされていない
ダウンロードした中身を見たらフォルダー構成が変更されており、直下には、buildとsourcesのみとなった
2.4.6まで、直下にあった他のbuild以外のフォルダーは、sourcesの下に移動したので注意
Win版のサポートされている開発環境からvc9(Visual Studio 2008)がなくなり、vc10(Visual Studio 2010)とvc11(Visual Studio 2012)になった。
Visual Studio 2013もまだ対応されていないので注意
2013年9月21日土曜日
PERC to OpenCV その3
わけがあり、Intel Perceputual Computing SDK (PERC SDK)を触ることになったが、情報がいまひとつ少ない。depth imageがほしいだけなので、PERCとOpenCVのブリッジを作成し、OpenCVで処理することとした。
depthイメージの取得方法をどうするか考えていたがintelにサンプルと説明のページがあったので、それをベースにすることにした。ページの最後にソースがあるので取得する。
環境さえできていればそのまま動かすことができるはずだが、初期化ではまってしまった。
原因は、カメラをPCのUSB1.0の口ににさしていたためであり、2.0の口に変えることで無事動作した。
BackgroundMaskCleanerは、depth画像にノイズが多い場合にノイズを減らすものである。
中の処理は、MorphologyExを使用してopenとcloseを行っている。
なぜかcで記述しているので自分で書き直したほうがよいだろう。
原理は、説明のページに書かれているが、急いでいるのでBlackBoxとして使用するつもりだが、速度に関しては30fpsに届かないので、速度面でCaptureStreamの中身を調べてみる。
CaptureStreamを自分のプログラムに組み込めば距離情報でマスクされたカラー画像を得ることができる。これでようやくめどがついた。
depthイメージの取得方法をどうするか考えていたがintelにサンプルと説明のページがあったので、それをベースにすることにした。ページの最後にソースがあるので取得する。
環境さえできていればそのまま動かすことができるはずだが、初期化ではまってしまった。
原因は、カメラをPCのUSB1.0の口ににさしていたためであり、2.0の口に変えることで無事動作した。
BackgroundMaskCleanerは、depth画像にノイズが多い場合にノイズを減らすものである。
中の処理は、MorphologyExを使用してopenとcloseを行っている。
なぜかcで記述しているので自分で書き直したほうがよいだろう。
原理は、説明のページに書かれているが、急いでいるのでBlackBoxとして使用するつもりだが、速度に関しては30fpsに届かないので、速度面でCaptureStreamの中身を調べてみる。
CaptureStreamを自分のプログラムに組み込めば距離情報でマスクされたカラー画像を得ることができる。これでようやくめどがついた。
2013年9月13日金曜日
PERC to OpenCV その2
一月ほど開いてしまったが、締め切りが迫ってしまい、少しお尻に火がつき始めた。
わけがあり、Intel Perceputual Computing SDK (PERC SDK)を触ることになったが、情報がいまひとつ少ない。depth imageがほしいだけなので、PERCとOpenCVのブリッジを作成し、OpenCVで処理することとした。
PERCでは、MatにあたるクラスがPXCImageとなる
ようやくRGBの変換方法がわかった。エラー処理は抜いている。
UtilPipeline pp;
PXCImage* pImage;
PXCImage::ImageData imageData;
cv::Mat matRGB = cv::Mat(cv::Size(640, 480), CV_8UC3);
pp.EnableImage(PXCImage::COLOR_FORMAT_RGB24, 640, 480);
pp.Init();
pp.AcquireFrame(true);
if (pImage->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::COLOR_FORMAT_RGB24, &imageData) >= PXC_STATUS_NO_ERROR)
{
memcpy(matRGB.data, (uchar*)imageData.planes[0], 640*480*3*sizeof(uchar));
}
pp.ReleaseFrame();
これで、matRGBにカラーデータが格納される
複数からアクセスされることを想定しているため、イメージのリソースにアクセスする前に、調停を行い、アクセス権を取得しなければいけない。また、アクセス権は、短時間で開放しないといけないので、1フレーム毎に、アクセス権が必要となる。
少しめんどくさいし、アクセス権取得のオーバヘッドはどれくらいなのだろうか?
また、他のアプリは想定していないので、アクセス権が取れない場合を想定していないが、まじめに考えるとエラー処理が必要となる。
わけがあり、Intel Perceputual Computing SDK (PERC SDK)を触ることになったが、情報がいまひとつ少ない。depth imageがほしいだけなので、PERCとOpenCVのブリッジを作成し、OpenCVで処理することとした。
PERCでは、MatにあたるクラスがPXCImageとなる
ようやくRGBの変換方法がわかった。エラー処理は抜いている。
UtilPipeline pp;
PXCImage* pImage;
PXCImage::ImageData imageData;
cv::Mat matRGB = cv::Mat(cv::Size(640, 480), CV_8UC3);
pp.EnableImage(PXCImage::COLOR_FORMAT_RGB24, 640, 480);
pp.Init();
pp.AcquireFrame(true);
if (pImage->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::COLOR_FORMAT_RGB24, &imageData) >= PXC_STATUS_NO_ERROR)
{
memcpy(matRGB.data, (uchar*)imageData.planes[0], 640*480*3*sizeof(uchar));
}
pp.ReleaseFrame();
これで、matRGBにカラーデータが格納される
複数からアクセスされることを想定しているため、イメージのリソースにアクセスする前に、調停を行い、アクセス権を取得しなければいけない。また、アクセス権は、短時間で開放しないといけないので、1フレーム毎に、アクセス権が必要となる。
少しめんどくさいし、アクセス権取得のオーバヘッドはどれくらいなのだろうか?
また、他のアプリは想定していないので、アクセス権が取れない場合を想定していないが、まじめに考えるとエラー処理が必要となる。
2013年8月14日水曜日
OpenCVのMatを特定の値に設定する 2
以前内容をすべて0に設定する方法として
cv::Mat image(cv::Size(640, 480), CV_8UC3);
mat = cv::Scalar::all(0);
としていたが、最近
// 赤一色の塗りつぶし
//
cv::Mat mat = cv::Scalar(0,0,255)
のように特定の値にできることがわかった
cv::Mat image(cv::Size(640, 480), CV_8UC3);
mat = cv::Scalar::all(0);
としていたが、最近
// 赤一色の塗りつぶし
//
cv::Mat mat = cv::Scalar(0,0,255)
のように特定の値にできることがわかった
PERC to OpenCV その1
わけがあり、Intel Perceputual Computing SDK (PERC SDK)を触ることになったが、情報がいまひとつ少ない。depth imageがほしいだけなので、PERCとOpenCVのブリッジを作成し、OpenCVで処理することとした。
PERCでは、MatにあたるクラスがPXCImageとなる
PXCImageは、統一的な画像バッファーへのインタフェースである。
説明は、ここに
サンプルでのカメラからの取り込み画像の情報を取得してみる
サンプルにコードを追加
PXCImage::ImageInfo info;
color_image->QueryInfo(&info);
height = info.height;
width = info.width;
format = info.format;
サンプルを実行した値は、480, 640, 65539 (0x10003)となる
PERCでは、MatにあたるクラスがPXCImageとなる
PXCImageは、統一的な画像バッファーへのインタフェースである。
説明は、ここに
サンプルでのカメラからの取り込み画像の情報を取得してみる
サンプルにコードを追加
PXCImage::ImageInfo info;
color_image->QueryInfo(&info);
height = info.height;
width = info.width;
format = info.format;
サンプルを実行した値は、480, 640, 65539 (0x10003)となる
PERC SDKでカラー画像を表示してみた
Intel Perceputual Computing SDK (PERC SDK)をインストールしてみた
(SDKインストールとCreativeカメラに関しては別途)
Visual C++ 2010 Expressで雛形にコマンドラインアプリを選び、新規に作成
PERC用のプロパティーシート (PERCSDK.porps)を作成
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<IncludePath>C:/Program Files/Intel/PCSDK/Include;C:/Program Files/Intel/PCSDK/Sample/Common/Include;$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup>
<LibraryPath>C:/Program Files/Intel/PCSDK/lib/$(PlatformName);C:/Program Files/Intel/PCSDK/sample/common/lib/$(PlatformName)/$(PlatformToolset);$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup>
<Link Condition="'$(Configuration)'=='Debug'">
<AdditionalDependencies>libpxc_d.lib;libpxcutils_d.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<Link Condition="'$(Configuration)'=='Release'">
<AdditionalDependencies>libpxc.lib;libpxcutils.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<ClCompile Condition="'$(Configuration)'=='Debug'">
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
<ClCompile Condition="'$(Configuration)'=='Release'">
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup />
</Project>
プロジェクトに作成したプロパティシートを追加
サンプルは、ここ説明のプログラムをコピー
ビルドができれば、OKだが、Creativeのカメラでなくても試せる
(SDKインストールとCreativeカメラに関しては別途)
Visual C++ 2010 Expressで雛形にコマンドラインアプリを選び、新規に作成
PERC用のプロパティーシート (PERCSDK.porps)を作成
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<IncludePath>C:/Program Files/Intel/PCSDK/Include;C:/Program Files/Intel/PCSDK/Sample/Common/Include;$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup>
<LibraryPath>C:/Program Files/Intel/PCSDK/lib/$(PlatformName);C:/Program Files/Intel/PCSDK/sample/common/lib/$(PlatformName)/$(PlatformToolset);$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup>
<Link Condition="'$(Configuration)'=='Debug'">
<AdditionalDependencies>libpxc_d.lib;libpxcutils_d.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<Link Condition="'$(Configuration)'=='Release'">
<AdditionalDependencies>libpxc.lib;libpxcutils.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<ClCompile Condition="'$(Configuration)'=='Debug'">
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
<ClCompile Condition="'$(Configuration)'=='Release'">
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup />
</Project>
プロジェクトに作成したプロパティシートを追加
サンプルは、ここ説明のプログラムをコピー
ビルドができれば、OKだが、Creativeのカメラでなくても試せる
2013年8月6日火曜日
2013年7月25日木曜日
NVIDIAがMobile Keplerのデモを公開
Mobile Keplerは、Tegra"Logan"に搭載され、2014に出荷される予定である
残念ながら、Mobile Keplerのデモは、OpenGLの機能を示すデモだったが、Mobile KeplerはCUDAをサポートするため、モバイルでのOpenCVの処理速度の増加が期待できる
ニュースは、ここ
残念ながら、Mobile Keplerのデモは、OpenGLの機能を示すデモだったが、Mobile KeplerはCUDAをサポートするため、モバイルでのOpenCVの処理速度の増加が期待できる
ニュースは、ここ
2013年7月24日水曜日
GPU Tech ConferenceでのOpenCV CUDAのプレゼン資料とビデオが公開された
OpenCVニュースでGPU Tech Conferenceでのスライドとビデオが公開されたと案内されていた。
双方ともダウンロード可能なので取得して見てみるつもりである
今回は、技術的内容が少なかったが、7月に行われる2回目では、OpenCV on GPUのコードのサンプルが示されるだろうとのこ
補足
ニュースにWebinarと聞きなれない単語が出てきたので調べてみると、
ウェビナー/Webinar
WebとSeminarを組み合わせた造語。ネット上で行われるWebセミナーのことを指す
だそうだ
補足
ニュースにWebinarと聞きなれない単語が出てきたので調べてみると、
ウェビナー/Webinar
WebとSeminarを組み合わせた造語。ネット上で行われるWebセミナーのことを指す
だそうだ
2013年7月18日木曜日
OpenCVのチュートリアルが 9th International Conference on Computerで行われる
イベントに関してはここ
チュートリアルの概要を読むと、
- iOS and Androidのサポート
- モバイル機での開発のポイント
- 既存コードの移植
- サンプル tipsの紹介
が話されるようだ
海外のイベントなので聞くことができないが、そこで使用される資料が公開されている
2013年7月12日金曜日
OpenCV 2.4.6でHOGを試してみた
人物検出器として有名なHOGDescriptorがOpenCVで提供されている
sampleが samples\cpp\peopledetect.cppで提供されているので試してみた
説明はここ。GPUが付かないオリジナルの説明はない
パラメータを調整しないと性能は出ない。
検出結果を増やすには、hit_threshold とgroup_threshold の値を下げる。
オリジナル
hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2);
padding は、must be (0,0)と説明があるが、sampleでは他の値が設定されている
パラメータ調整
hog.detectMultiScale(img, found, -0.5, Size(4,4), Size(0,0), 1.05, 1);
相違は少ない
パラメータ調整 2
hog.detectMultiScale(img, found, -0.5, Size(4,4), Size(0,0), 1.05, 0);
グループ閾値が0だと結果がグルーピングされない
2013年7月11日木曜日
OpenCVのロードマップが更新されている 続き
昨日ロードマップが更新されたばかりだが、今日見てみるとさらに更新されていた。
変更点
2.4.7が 11/1から10/1に
対応予定のチケットを減らしてリリースを速めたようだ
3.0-alpha 10/1
3.0-beta 12/1 がリリースされ、正式版が 2014/2/1に延期
alpha、betaの内容は記載がないので、機能限定になるのか、安定性の違いになるのかは不明
また2.4.8が新たに追加され 2014/3/1にリリース予定
内容は未定
変更点
2.4.7が 11/1から10/1に
対応予定のチケットを減らしてリリースを速めたようだ
3.0-alpha 10/1
3.0-beta 12/1 がリリースされ、正式版が 2014/2/1に延期
alpha、betaの内容は記載がないので、機能限定になるのか、安定性の違いになるのかは不明
また2.4.8が新たに追加され 2014/3/1にリリース予定
内容は未定
2013年7月10日水曜日
OpenCV2.4.6のsampleを眺めてみた
2.4.6と2.4.5の samples\cppを眺めてみた
tutorialは見ていないが、変更されたソースは4点
大した変更ではない
tutorialは見ていないが、変更されたソースは4点
- freak_demo.cpp バグ修正
- latentsvm_multidetect.cpp windowsコンパイル条件の変更
- lkdemo.cpp バグ修正
- stereo_calib.cpp コメント変更
大した変更ではない
2013年7月9日火曜日
OpenCVのロードマップが更新されている
2.4.6のリリースが1月遅れてしまった。その影響で3.0の予定が遅れると思っていたが、変わりがなかった。
しかし、今日ロードマップを見てみると、3.0のリリースが12/1になっており、また、2.4.7が追加され、11/1にリリース予定となっている
チケットの一覧が表示されているが数が多い。画面右側にカテゴリで分類されているので、気になる項目を確認してみるとよいだろう
Windows7 64bit版にOpenCV 2.4.6の開発環境を構築した
検索などでこのページを訪れる人が、数は少ないけど、コンスタントにいる。
ちょうどこの上にあるG+1のボタンを押してもらうと、Goolgeの検索に見つかりやすくなるので、ご協力いただきたい。
Windows版は、OpenGLやOpenNIを使用しなければ、ダウンロードしたファイルを展開して設定すれば使用できるので、30分もかからず環境ができる。
(ダウンロード時間や、Visual Studio 2010 Express Editionのインストールを除く)
2.4.4からVisual Studio 2012がサポートされるようになったが、以下は、Windows7 64bit版上で、Visual Studio 2010 Express Editionでプログラムを開発するためのものである
(Windows7 32bit版でも同じ手順でできる)
1 ここからWindows版をダウンロードする
2 OpenCV-2.4.6.0.exeを実行しインストールディレクトリc:\を指定する
3 展開後、ディレクトリ名をopencvからopencv246に変更する
4 OSの環境変数の設定(要管理者権限)
コントロールパネル、システムとセキュリティ、システムを開き
システムの詳細設定の環境変数ボタンを押し
システム環境変数のPathの編集
末尾に";C:\opencv246\build\x86\vc10\bin"を追加
(この作業後、一度ログオフし、再度ログインする)
5 Visual C++ 2010 Expressのパスの設定を行う
この記事を参考
ただし、各パスは、C:\opencv246\build\includeと、C:\opencv246\build\x86\vc10\libに変更する
6 手持ちのサンプルをビルドし動作確認する
参考 古いバージョンの記事
Windows7 64bit版にOpenCV 2.4.5の開発環境を構築した
Windows7 64bit版にOpenCV 2.4.4の開発環境を構築した
Windows7 64bit版にOpenCV 2.4.3の開発環境を構築した
Windows7 32bit版にOpenCV 2.4.2の開発環境を構築した
ちょうどこの上にあるG+1のボタンを押してもらうと、Goolgeの検索に見つかりやすくなるので、ご協力いただきたい。
Windows版は、OpenGLやOpenNIを使用しなければ、ダウンロードしたファイルを展開して設定すれば使用できるので、30分もかからず環境ができる。
(ダウンロード時間や、Visual Studio 2010 Express Editionのインストールを除く)
2.4.4からVisual Studio 2012がサポートされるようになったが、以下は、Windows7 64bit版上で、Visual Studio 2010 Express Editionでプログラムを開発するためのものである
(Windows7 32bit版でも同じ手順でできる)
1 ここからWindows版をダウンロードする
2 OpenCV-2.4.6.0.exeを実行しインストールディレクトリc:\を指定する
3 展開後、ディレクトリ名をopencvからopencv246に変更する
4 OSの環境変数の設定(要管理者権限)
コントロールパネル、システムとセキュリティ、システムを開き
システムの詳細設定の環境変数ボタンを押し
システム環境変数のPathの編集
末尾に";C:\opencv246\build\x86\vc10\bin"を追加
(この作業後、一度ログオフし、再度ログインする)
5 Visual C++ 2010 Expressのパスの設定を行う
この記事を参考
ただし、各パスは、C:\opencv246\build\includeと、C:\opencv246\build\x86\vc10\libに変更する
6 手持ちのサンプルをビルドし動作確認する
参考 古いバージョンの記事
Windows7 64bit版にOpenCV 2.4.5の開発環境を構築した
Windows7 64bit版にOpenCV 2.4.4の開発環境を構築した
Windows7 64bit版にOpenCV 2.4.3の開発環境を構築した
Windows7 32bit版にOpenCV 2.4.2の開発環境を構築した
OpenCV Manager 2.4.6のrev2がリリースされていた
isw11scのOpenCV Managerを 2.4.6に更新したらサンプルが動作しなくなったので、手動で2.4.5に戻していたが、その後rev2がリリースされていた
コメントには、いくつかのHWでロードされないバグを修正とあったので、再度更新したところ、2.4.6のサンプルが無事に動作した。
コメントには、いくつかのHWでロードされないバグを修正とあったので、再度更新したところ、2.4.6のサンプルが無事に動作した。
2013年7月8日月曜日
OpenCVのライブラリーのビルドに関して
Windows用のOpenCVはバイナリーで提供されており、試すだけなら自分でビルドする必要はない
しかし、
Qt
OpenGL
OpenNI
TBB
OpenMP
CUDA
OpenCL
などを使用したい場合は、自分でCMakeのOptionを設定して、ビルドを行う必要がある
各モジュールの組み込み方は、tutorialドキュメントの P18以降の
Installation by Making Your Own Libraries from the Source Files
に記載されている
しかし、
Qt
OpenGL
OpenNI
TBB
OpenMP
CUDA
OpenCL
などを使用したい場合は、自分でCMakeのOptionを設定して、ビルドを行う必要がある
各モジュールの組み込み方は、tutorialドキュメントの P18以降の
Installation by Making Your Own Libraries from the Source Files
に記載されている
OpenCV 2.4.6の Build情報を表示させてみた
cv::getBuildInformation()を使用し、OpenCV2.4.6のビルド条件を表示させてみた。
VideoIOのインタフェースが追加されている
参考に2.4.5を
モジュールが追加されている
以前のはこちら
VideoIOのインタフェースが追加されている
参考に2.4.5を
モジュールが追加されている
以前のはこちら
2013年7月4日木曜日
OpenCVforAndroid 2.4.6を試してみた
サンプルのプロジェクトをimportしてビルドしてみたが、native-activityのndkでエラーが生じた
プロパティを見てみるとC++の${NDKROOT}/ndk-build に””がついており、削除することで解決した
また、OpenCV2.4.6のリリースにあわせてOpenCV Managerも2.4.6に更新されていたので、更新してみたが、サンプルプログラムが動作しない
デバッガで見たところ、onManagerConnectedのイベントが呼ばれていないので、サービスと接続できていないようだ
いろいろ試したところ、OpenCV Manager 2.4.6に問題があることがわかり、isw11scのOpenCV Managerは2.4.5に戻している
(通常一旦更新すると戻すことはできない。そのため携帯から一旦削除し、OpenCV-2.4.5-Android-sdkのapkのフォルダーに含まれている OpenCV_2.4.5_Manager_2.7_armv7a-neon.apk を USB 経由でinstallすることで戻している)
プロパティを見てみるとC++の${NDKROOT}/ndk-build に””がついており、削除することで解決した
また、OpenCV2.4.6のリリースにあわせてOpenCV Managerも2.4.6に更新されていたので、更新してみたが、サンプルプログラムが動作しない
デバッガで見たところ、onManagerConnectedのイベントが呼ばれていないので、サービスと接続できていないようだ
いろいろ試したところ、OpenCV Manager 2.4.6に問題があることがわかり、isw11scのOpenCV Managerは2.4.5に戻している
(通常一旦更新すると戻すことはできない。そのため携帯から一旦削除し、OpenCV-2.4.5-Android-sdkのapkのフォルダーに含まれている OpenCV_2.4.5_Manager_2.7_armv7a-neon.apk を USB 経由でinstallすることで戻している)
OpenCV 2.4.6のドキュメントを取得した
ようやく公式ページで2.4.6のリリースがアナウンスされた
OpenCV 2.4.6のDocフォルダーには、2.4.4同様にマニュアルなどのPDFがなかったので、http://docs.opencv.org/ から関連するPDFを取得した。
The OpenCV User Guide Release 2.4.6.0
P19 2013/7/1
2.4.5とページ数は変わらず
The OpenCV Tutorials Release 2.4.6.0
P421 2013/7/1
2.4.5から増加
The OpenCV Reference Manual Release 2.4.6.0
P813 2013/7/1
2.4.5から増加
以上
OpenCV 2.4.6のDocフォルダーには、2.4.4同様にマニュアルなどのPDFがなかったので、http://docs.opencv.org/ から関連するPDFを取得した。
The OpenCV User Guide Release 2.4.6.0
P19 2013/7/1
2.4.5とページ数は変わらず
The OpenCV Tutorials Release 2.4.6.0
P421 2013/7/1
2.4.5から増加
The OpenCV Reference Manual Release 2.4.6.0
P813 2013/7/1
2.4.5から増加
以上
2013年7月3日水曜日
OpenCVforAndroid 2.4.6
2.4.6をダウンロードしたついでに開発環境を構築しなおした
eclipseはAndoridのページから自分のOSに合うものをダウンロード
ダンロード後、展開してeclipseのフォルダーをhome直下に移動
terminalを起動して、eclipseのフォルダーに移動し、eclipseを起動する
2.4.5のプロジェクトがあるとややこしくなるので、すべて削除
最初に、importでOpenCV-2.4.6-android-sdk/sdk/javaを登録
その後に、
OpenCV-2.4.6-android-sdk/samples/tutorial-1-camerapreview
OpenCV-2.4.6-android-sdk/samples/tutorial-2-mixedprocessing
OpenCV-2.4.6-android-sdk/samples/tutorial-3-cameracontrol
を順番にimport
また、ndlのビルド用のバッチがwindowsになっているため、
プロジェクトのプロパティを開きC++buildの
ndk-build.cmdをndk-buildに直す
以上でサンプルアプリができている
eclipseはAndoridのページから自分のOSに合うものをダウンロード
ダンロード後、展開してeclipseのフォルダーをhome直下に移動
terminalを起動して、eclipseのフォルダーに移動し、eclipseを起動する
2.4.5のプロジェクトがあるとややこしくなるので、すべて削除
最初に、importでOpenCV-2.4.6-android-sdk/sdk/javaを登録
その後に、
OpenCV-2.4.6-android-sdk/samples/tutorial-1-camerapreview
OpenCV-2.4.6-android-sdk/samples/tutorial-2-mixedprocessing
OpenCV-2.4.6-android-sdk/samples/tutorial-3-cameracontrol
を順番にimport
また、ndlのビルド用のバッチがwindowsになっているため、
プロジェクトのプロパティを開きC++buildの
ndk-build.cmdをndk-buildに直す
以上でサンプルアプリができている
OpenCV for Android SDK 2.4.6
OpenCV2.4.6のリリースにあわせて、Android版のSDKも2.4.6がリリースされた
ここからダウンロードできる
zipのファイルサイズは、2.4.5の時の 97.6M から 97.2Mに減っている。
また展開後はサイズは、218Mとなりこちらは増えている
sampleのフォルダーのチュートリアルは、
tutorial-1-camerapreview
tutorial-2-mixedprocessing
tutorial-3-cameracontrol
と2.4.5の変わっていない
これからいろいろ見てみる
ここからダウンロードできる
zipのファイルサイズは、2.4.5の時の 97.6M から 97.2Mに減っている。
また展開後はサイズは、218Mとなりこちらは増えている
sampleのフォルダーのチュートリアルは、
tutorial-1-camerapreview
tutorial-2-mixedprocessing
tutorial-3-cameracontrol
と2.4.5の変わっていない
これからいろいろ見てみる
OpenCV 2.4.6のWindows版がリリースされた
Windows版だけリリースが遅れているがここからダウンロードできるようになっている
ダウンロード数が4なので、5番目である
(と思っていたら、リアルタイムの更新されるのではなく、日単位であることがわかったので少しがっかり)
うれしので、画面のスナップを
圧縮ファイルサイズは
2.4.5 278,901,549 バイト から
2.4.6 305,568,500 バイト
と1割増加している
ダウンロードには20分以上かかったが、環境依存である
ダウンロード数が4なので、5番目である
(と思っていたら、リアルタイムの更新されるのではなく、日単位であることがわかったので少しがっかり)
うれしので、画面のスナップを
圧縮ファイルサイズは
2.4.5 278,901,549 バイト から
2.4.6 305,568,500 バイト
と1割増加している
ダウンロードには20分以上かかったが、環境依存である
2013年7月2日火曜日
画像認識のセミナーを調べてみた 6
前回のものと重複もあるが、今後3ヶ月以内に開催される画像認識に関連するセミナーを調べてみた。
以下はすべて有料である。
デジタル画像の基礎、カラー画像の微分幾何モデル、偏微分方程式(PDE)に基づく画像処理技術と応用への留意点
2013年7月4日(木) 10:30-17:30
http://www.j-techno.co.jp/infos/view/6632/
歩容解析とその応用
2013年7月5日(金) 10:30-16:30
http://www.catnet.ne.jp/triceps/sem/s130705k.html
~TRECVID2012にみる~映像検索技術の最新動向
2013年7月5日(金)13:30-16:30
http://www.catnet.ne.jp/triceps/sem/s130419a.html
人物画像センシング技術の基礎と応用
2013年7月10日(水)10:00-17:00
http://www.catnet.ne.jp/triceps/sem/s130509a.html
進化的・知的画像処理 / 認識技術
2013年7月11日(木) 10時30分 ~ 16時30分
http://www.catnet.ne.jp/triceps/sem/s130415k.html
多様体学習(Manifold Learning)を用いた画像処理・画像認識
2013年7月12日(金)10:30-16:30
http://www.catnet.ne.jp/triceps/sem/s130527a.html
入門 サポートベクターマシン(SVM)
2013年7月17日(水)10:30-16:30
http://www.catnet.ne.jp/triceps/sem/s130717a.html
ステレオ画像・動画像の処理 ~3次元形状復元を中心に~
2013年7月19日(金)13:00-17:00
http://www.catnet.ne.jp/triceps/sem/s130719a.html
パターン識別・機械学習の基礎と画像処理への応用
2013年7月22日(月)10:30-17:30
http://www.j-techno.co.jp/infos/view/6714/
パターン認識・検索技術の基礎と応用
2013年7月23日(火) 10時00分 ~ 17時00分
http://www.catnet.ne.jp/triceps/sem/s130723a1.html
画像処理の基礎と産業応用への実践的活用講座
2013年8月23日(金)10:30-17:30
http://www.j-techno.co.jp/infos/view/6728/
超解像技術による画像・映像の高精細・高解像度化の基礎と応用
2013年9月6日(金)10:30-17:30
http://www.j-techno.co.jp/infos/view/6744/
画像処理の基礎と冗長変換・スパース表現
2013年9月12日(木) 10:30-17:30
http://www.j-techno.co.jp/infos/view/6607/
テンプレートマッチングの基礎と産業応用および最新技術
2013年9月17日(火) 10:30-17:30
http://www.j-techno.co.jp/infos/view/6560/
パターン認識の基礎とSVM(サポートベクトルマシン)の活用法
2013年9月30日(月)10:30-17:30
http://www.j-techno.co.jp/infos/view/6617/
以下はすべて有料である。
デジタル画像の基礎、カラー画像の微分幾何モデル、偏微分方程式(PDE)に基づく画像処理技術と応用への留意点
2013年7月4日(木) 10:30-17:30
http://www.j-techno.co.jp/infos/view/6632/
歩容解析とその応用
2013年7月5日(金) 10:30-16:30
http://www.catnet.ne.jp/triceps/sem/s130705k.html
~TRECVID2012にみる~映像検索技術の最新動向
2013年7月5日(金)13:30-16:30
http://www.catnet.ne.jp/triceps/sem/s130419a.html
人物画像センシング技術の基礎と応用
2013年7月10日(水)10:00-17:00
http://www.catnet.ne.jp/triceps/sem/s130509a.html
進化的・知的画像処理 / 認識技術
2013年7月11日(木) 10時30分 ~ 16時30分
http://www.catnet.ne.jp/triceps/sem/s130415k.html
多様体学習(Manifold Learning)を用いた画像処理・画像認識
2013年7月12日(金)10:30-16:30
http://www.catnet.ne.jp/triceps/sem/s130527a.html
入門 サポートベクターマシン(SVM)
2013年7月17日(水)10:30-16:30
http://www.catnet.ne.jp/triceps/sem/s130717a.html
ステレオ画像・動画像の処理 ~3次元形状復元を中心に~
2013年7月19日(金)13:00-17:00
http://www.catnet.ne.jp/triceps/sem/s130719a.html
パターン識別・機械学習の基礎と画像処理への応用
2013年7月22日(月)10:30-17:30
http://www.j-techno.co.jp/infos/view/6714/
パターン認識・検索技術の基礎と応用
2013年7月23日(火) 10時00分 ~ 17時00分
http://www.catnet.ne.jp/triceps/sem/s130723a1.html
画像処理の基礎と産業応用への実践的活用講座
2013年8月23日(金)10:30-17:30
http://www.j-techno.co.jp/infos/view/6728/
超解像技術による画像・映像の高精細・高解像度化の基礎と応用
2013年9月6日(金)10:30-17:30
http://www.j-techno.co.jp/infos/view/6744/
画像処理の基礎と冗長変換・スパース表現
2013年9月12日(木) 10:30-17:30
http://www.j-techno.co.jp/infos/view/6607/
テンプレートマッチングの基礎と産業応用および最新技術
2013年9月17日(火) 10:30-17:30
http://www.j-techno.co.jp/infos/view/6560/
パターン認識の基礎とSVM(サポートベクトルマシン)の活用法
2013年9月30日(月)10:30-17:30
http://www.j-techno.co.jp/infos/view/6617/
OpenCV 2.4.6がリリースされた
当初の予定から1月遅れて2.4.6がリリースされた。ただし、Windows版は、まだであるため限定的なリリースである
変更点を見てみると
WindowsRTのビデオIOの対応、カメラアプリのサンプル追加、TBBによる並列化など
CUDA ARMの対応
Qt5のサポート
OpenCLの対応機能追加
TBBのみから他の並列化技術への変更
iOS バグ修正
UIImage and cv::Matの変換機能の追加を喜ぶ人がおおいのでは
Android
SDK r22サポート
いくつかのバグ修正
カメラ周りの修正(しかしデバイス依存の問題が残っている)
上記変更点に興味がなければ急いで差し替える必要はないかと思われる。
変更点を見てみると
WindowsRTのビデオIOの対応、カメラアプリのサンプル追加、TBBによる並列化など
CUDA ARMの対応
Qt5のサポート
OpenCLの対応機能追加
TBBのみから他の並列化技術への変更
iOS バグ修正
UIImage and cv::Matの変換機能の追加を喜ぶ人がおおいのでは
Android
SDK r22サポート
いくつかのバグ修正
カメラ周りの修正(しかしデバイス依存の問題が残っている)
上記変更点に興味がなければ急いで差し替える必要はないかと思われる。
2013年7月1日月曜日
OpenCVを1ボードコンピュータで試してみた 2
1ボードコンピュータと呼ぶべきかはわからないが、BeagleBoardに始まり、多種多様なARM搭載の評価ボードが手ごろな値段で販売されている
2年前のボードであるが、Pandaboard ESにubunut12.04の環境を構築し、OpenCVをインストールしてみた
環境構築に3時間かかったため、OpenCVは出来合いの2.3.1のパッケージを
sudo apt-get install libopencv-dev
でインストールした。
V4Lはデフォルトで準備されているので、特に何もしていない
インストール後、raspberry pi用に作成したカメラ入力のfpsのプログラムをmakeし試してみた
VGA入力 VGA表示 約17fps 遅延 小
QVGA入力 QVGA表示 31fps 遅延なし
やはりCPUの能力の差は出ているが、期待したほどではなかった。
デュアルコアだが、システムモニターで確認すると、CPUの使用率双方90%を超えている。
また、システムモニターさえも負荷となり、2fpsくらい低下する。
2年前のボードであるが、Pandaboard ESにubunut12.04の環境を構築し、OpenCVをインストールしてみた
環境構築に3時間かかったため、OpenCVは出来合いの2.3.1のパッケージを
sudo apt-get install libopencv-dev
でインストールした。
V4Lはデフォルトで準備されているので、特に何もしていない
インストール後、raspberry pi用に作成したカメラ入力のfpsのプログラムをmakeし試してみた
VGA入力 VGA表示 約17fps 遅延 小
QVGA入力 QVGA表示 31fps 遅延なし
やはりCPUの能力の差は出ているが、期待したほどではなかった。
デュアルコアだが、システムモニターで確認すると、CPUの使用率双方90%を超えている。
また、システムモニターさえも負荷となり、2fpsくらい低下する。
2013年6月26日水曜日
2013年6月25日火曜日
OpenCVを1ボードコンピュータで試してみた
1ボードコンピュータと呼ぶべきかはわからないが、BeagleBoardに始まり、多種多様なARM搭載の評価ボードが手ごろな値段で販売されている
そのうちの1つであるpcDuinoにOpenCVをインストールしてみてOpenCVの動作を確認したが、カメラ入力に必要なV4Lをインストールしてもカメラを認識してくれない
google先生に聞いたところ、パッチを当てたファームが必要とのこと。
いまは、購入時に搭載されていたOS(種別?)をそのまま使用しているが、それなりの作業が必要となるので、ペンディング中である。
現時点ではraspberry piが、OpenCVとV4Lの動作が確認できている。
2013年6月21日金曜日
2013年6月20日木曜日
OpenCVをraspberry piにインストールして、カメラを試してみた 2
昨日の続き
MSのLifeCom HD300は、ubuntuで試した場合、室内で撮影対象を変えてもfpsは安定していたが、raspberry piの場合、fpsの値の変動が大きい
320x240の場合 場所により、22fpsから15fpsの範囲となった。
さてLifeCom HD300の解像度を176x144、あるいは、160x120に設定し、表示も入力と同じサイズで、試したところ、双方と30fpsを得ることができた。
LifeCom HD300もそうだが、他のカメラもホワイトバランスが崩れているため、何か対策をしないと、色情報の使用に支障をきたすだろう
手元に無いので確認できていないが、専用カメラだとVGAで30fpsの遅延なし表示ができるとのこと。また、専用のドライバーで、OpenCVにデータを取得することができるらしい
ただし、カメラの人気が高く入手に3ヶ月かかるらしい。
2013年6月18日火曜日
OpenCVをraspberry piにインストールして、カメラを試してみた
今度は、 raspberry piにOpenCVをインストールしてみて、手持ちで性能のよい、MSのLifeCom HD300でカメラ入力のfpsを測ってみた
ソースからビルドする元気はないので、ubuntuと同じようにお手軽に2.3.1を
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libopencv-dev
のコマンドでインストールを行う
インストール時間は、20分くらい
raspberry piは、pcDuinoと異なりraspberry piは最初からV4L2に対応しており、カメラをつなぐと使える状態となる
こちらもpcDuinoと同じようにパスが、/usr/include /usr/libなので、コンパイルのオプションを修正して、fpsを表示する実行ファイルを作成してみた
結果
VGA入力 VGA表示 9fps 遅延 1秒
QVGA入力 QVGA表示 15fps 遅延 微小
QVGA入力 VGA表示 7fps 遅延 2秒
非力なのは仕方がない
LifeCom HD300は、
176x144
160x120
のサイズもサポートしているので後で試してみる
2013年6月17日月曜日
OpenCVをpcDuinoで試したみた
世間では、OpenCVをrapsberry piにインストールして楽しんでいる人が多いので、マイナーなpcDuinoにインストールしてみた
ソースからビルドする元気はないので、ubuntuと同じようにお手軽に2.3.1を
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libopencv-dev
のコマンドでインストールを行う
(インストールだけでも1時間かかる)
ubuntuのテストプログラムをgccでコンパイルしてみたが、cv.hが見つからないためエラーとなる
インクルードを opencv.hppに変更し、gccで指定するパスを
/usr/local/includeから /usr/includeに変更し、
同様に、ライブラリの指定を
/usr/local/libから /usr/libに変更することで、無事にコンパイルすることができた。
実行すると、Gtkの警告が表示されるが、無事png画像を表示することができた。
2013年6月13日木曜日
OpenCVでWebカメラのfpsを測ってみた
カメラからのVGA入力を表示するプログラムを作成し、fpsを計測してみた。
室内での撮影のため、機種によっては光量不足でフレームレートが低下しているが、蛍光灯などの光源を撮影すれば、最大レートで表示できる
ハンファ DC-NCR13U
室内 13fps 光源 25fps ホワイトバランス かなり黄色より
ELECOM DLU130HSV
室内 12fps 光源 25fps ホワイトバランス 少し黄色より
ELECOM DLD200
室内 15fps 光源 30qfps ホワイトバランス 少し黄色より
ELECOM DLK130
室内 15fps 光源 30qfps ホワイトバランス ? 昨日カラーだったのに謎か白黒に
LifeCom HD300
室内 30fps 光源 30qfps ホワイトバランス 少し黄色より
室内の明かりが暖色系なので、いずれもホワイトバランスが若干ずれてしまい、特に肌色が赤みかかってしまっている
また、フリッカーの影響も受けており、民生品を無調整でそのまま画像認識にしよするのは、困難かと思う
フォーカスは、カメラの値段に比例している。
OpenCVでUSB カメラ情報を取得してみた 2
Ubuntuでwindowsと同じようにカメラ情報を取得してみた
Ubuntu(V4L2)のほうが、Windowsよりもサポートしている項目が多い
CV_CAP_PROP_FRAME_WIDTH = 640
CV_CAP_PROP_FRAME_HEIGHT = 480
CV_CAP_PROP_FPS = -1
CV_CAP_PROP_FORMAT = -1
CV_CAP_PROP_BRIGHTNESS = 0.501961
CV_CAP_PROP_CONTRAST = 0.348718
CV_CAP_PROP_SATURATION = 0.5
CV_CAP_PROP_HUE = 0.501961
CV_CAP_PROP_GAIN = -1
CV_CAP_PROP_EXPOSURE = -1
CV_CAP_PROP_CONVERT_RGB = -1
getできた項目は、setできるのではないかと思われる
2013年6月12日水曜日
UbntuでUSBカメラの情報を取得する
Ubuntuは、特別なソフトをインストールしなくても、usbデバイスの情報を得ることができる
terminalを起動して
lsusb コマンドを実行
usb IFに接続されているデバイスの一覧が表示される。
次に、対象とするカメラのバス番号とデバイス番号を調べる
彼にそれぞれ、002 002とすると
lsusb -s 002:002 -v > hoge.txt コマンドで
hoge.txtに、情報が書き込まれる
これにより、
製造会社、製品名、最大電流、解像度などの情報を得ることができる。
例 MSのLifeCam HD-3000
iManufacturer 1 Microsoft
iProduct 2 Microsoft® LifeCam HD-3000
MaxPower 500mA
wWidth 640
wHeight 480
補足
iManufacturerは、製造会社のことであり、販売会社ではない
例えば、エレコムが販売しているUCAM-DLD200でも
iManufacturer 1 Novatek
iProduct 2 UCAM-DLD200BA
のように製造会社は異なることがある
(安いカメラは、ほぼOEMと考えて間違いない)
2013年6月11日火曜日
OpenCVをUbuntuにインストールする
公式に公開されている情報は古く、また、Linux初心者には省略された情報が多すぎて、結局google先生に訪ねることになる
改善希望
1 必要なパッケージが列挙されているが、それらを準備する方法を書いてほしい。
gccの例のように書いてほしい
Synaptic Managerからインストールができると書いてあるが、Synaptic Managerに登録されているのが、古い場合がある。
2 makeのoptionの説明をつけてほしい
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local
は、記載されているが、他のOptionに関しては不明なので、google先生の結果を参考にする必要がある
もし、最新にこだわらないのであれば、コマンドラインで
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libopencv-dev
でOpenCV2.3.1をインストールすることができる。
pythonが必要な場合は、追加で、
sudo apt-get install python-opencv
を行う
2013年6月7日金曜日
OpenCVのビデオ教材が発売された
久しぶりに本家のニュースが更新されていた。
OpenCV Computer Vision Application Programmingというタイトルのビデオ教材が発売された
著者のSebastian Montaboneは、OpenCV with Practical Computer Vision Projectsの編集もしている有名なエンジニアであるので期待できそうである。
価格は、16ドルで時間は、2時間17分 もちろん英語である
5章のサンプルをここで見ることができる
OpenCV Computer Vision Application Programmingというタイトルのビデオ教材が発売された
著者のSebastian Montaboneは、OpenCV with Practical Computer Vision Projectsの編集もしている有名なエンジニアであるので期待できそうである。
価格は、16ドルで時間は、2時間17分 もちろん英語である
5章のサンプルをここで見ることができる
GPU Tech ConferenceでOpenCV CUDAのプレゼンが行われる
久しぶりに本家のニュースが更新されていた。
Free intro to GPU-accelerated Computer Vision with OpenCVというプレゼンテーションが、6/11の表題の会議で行われる
視聴は、無料だが登録が必要とのこと
Free intro to GPU-accelerated Computer Vision with OpenCVというプレゼンテーションが、6/11の表題の会議で行われる
視聴は、無料だが登録が必要とのこと
2013年6月5日水曜日
Instant OpenCV Starterのkindle版が451円で販売されている
初心者向け(C/C++の経験あり)の洋書がkindle版だが451円で販売されている
(6/5日9時の価格 上がる可能性あり)
ページ数が、56ページ(実質40ページ)なので期待はしないほうがよいかもしれない。
さすがにペーパバック版2108円は高い気がする
ペーパバック版では、中身を少し見ることができ、目次で内容が確認できる
(6/5日9時の価格 上がる可能性あり)
ページ数が、56ページ(実質40ページ)なので期待はしないほうがよいかもしれない。
さすがにペーパバック版2108円は高い気がする
ペーパバック版では、中身を少し見ることができ、目次で内容が確認できる
2013年6月4日火曜日
Tegra向けSDK TDAPが人知れず更新されている
nVidiaからアナウンスがされていないが、TDAPが更新されていた。
専用の記事ではなく、TEGRA DEVELOPER RESOURCESで触れられているため、消えてしまうかもしれない
現在は、5/23日にリリースされたTegra Android Developer Pack 2.0r4が、最新と思われる
あと、sampleも3月に人知れずリリースされている。
ダウンロードには、Tegra開発者の登録が必要である(無料
補足
Tegra4搭載のRegzaの発売がアナウンスされた。Excite Pure は300ドル前後らしい
TDAPもTegra4にあわせて更新されるのであろうか?
専用の記事ではなく、TEGRA DEVELOPER RESOURCESで触れられているため、消えてしまうかもしれない
現在は、5/23日にリリースされたTegra Android Developer Pack 2.0r4が、最新と思われる
あと、sampleも3月に人知れずリリースされている。
ダウンロードには、Tegra開発者の登録が必要である(無料
補足
Tegra4搭載のRegzaの発売がアナウンスされた。Excite Pure は300ドル前後らしい
TDAPもTegra4にあわせて更新されるのであろうか?
2013年6月3日月曜日
Embedded Vision AllianceでOpenCV関連の記事やビデオを見つけた
twitterで偶然見つけたが、Embedded Vision Allianceという団体がある
ここに会員登録すると、いくつかのComputer Vision関連のビデオを見たり、参加企業が寄稿した記事を読むことができる。
登録は、右上のregisterから行う。無料だが、個人情報の記入とメールでの確認が行われる。
Videoや記事にはOpenCV関連もあるので、参考になるかもしれない。もちろん、すべて英語である。
サイトには、検索機能が付いており、OpenCVで検索すると、3日17時で、162件該当している
(フォーラムトピック32件含まれてる)
twitterのつぶやきは、
April 2013 Embedded Vision Summit Technical Presentation: "Using OpenCV in Industrial Robotics," Gary Bradski, OpenCV Foundation
の案内であり、ここからアクセス
ここに会員登録すると、いくつかのComputer Vision関連のビデオを見たり、参加企業が寄稿した記事を読むことができる。
登録は、右上のregisterから行う。無料だが、個人情報の記入とメールでの確認が行われる。
Videoや記事にはOpenCV関連もあるので、参考になるかもしれない。もちろん、すべて英語である。
サイトには、検索機能が付いており、OpenCVで検索すると、3日17時で、162件該当している
(フォーラムトピック32件含まれてる)
twitterのつぶやきは、
April 2013 Embedded Vision Summit Technical Presentation: "Using OpenCV in Industrial Robotics," Gary Bradski, OpenCV Foundation
の案内であり、ここからアクセス
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用に集めた画像を管理するために、ファイル名に連番を付与したい場合がある。
以下は、専用ツールを使用せずに行う方法である。
例 testimage
すると、選択されている画像は、 testimage(1)というように連番つきのファイル名に変更される。
補足
50番から付与したい場合は、一旦番号を付与したあと、再度選択し、testimage(1)を testimage(50)に変更すれば50番からの連番になる
以下は、専用ツールを使用せずに行う方法である。
- エクスプローラで、対象のファイルが保存されているフォルダーを開く
- 連番を付与したいファイルを選択する
- 選択されている状態で、右クリックの名前の変更を指示する
- ファイルの名前の変更モードになるので、識別用の名前をつける
例 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の組み合わせで、比較した結果を示す。
以上
プログラムは、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" 指定する方法が掲載されており、こちらが推奨されているように思われる。
プログラム処理は、
SURFを使用して2枚の画像の、特徴点と特徴量を求め、
BFMatcher matcher(NORM_L2);
で対応する点を求め
drawMatches
で結果を描画している。
対応点の検出方法が、もっとも簡単なものなので間違った対応付けも多い
補足
2.4.5では、SurfFeatureDetectorがドキュメントには、掲載されていないが使用できる状態である。
ドキュメントでは、FeatureDetector::createで、detectorTypeに、"SURF" 指定する方法が掲載されており、こちらが推奨されているように思われる。
2013年5月27日月曜日
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による画像局所特徴抽出に関して
2013年4月30日火曜日
OpenCV: Computer Vision with Pythonのkindle版が安い
ペーパーだと3,088円が、kindle版だと、ここから1,238円で購入できる
ペーパーの方は、現在予約中であるので、いち早く入手したい人は、kindle版がよいだろう
なお、価格は、4/30日のものであり、今後価格が変更される可能性もある。
2013年4月26日金曜日
OpenCVのTips (windows)
std::coutでコンソール画面にメッセージを表示できるが、異常終了した場合など、メッセージを見ることができない
cv::imshowで画像を表示している場合には、cv::waitKey(0)で一旦プログラムを停止させることで、メッセージを見ることができるが、imshow以前に不具合が発生した場合は、メッセージを見ることができない
その場合は、
#include <conio.h>
int n = _getch();
で1文字キー入力待ちにすることで、動作をとめる事ができる
OpenCVのkmeansで白黒画像を減色してみた
sampleに入っているkmeansのデモでは、空間上の点を分類するものである
kmeansは、カラー画像の減色に使用されるが、今回は、白黒画像に試し256階調から8階調に変換した。
使用した画像は、samplenに含まれている left06.jpg である。
kmeansは、カラー画像の減色に使用されるが、今回は、白黒画像に試し256階調から8階調に変換した。
使用した画像は、samplenに含まれている left06.jpg である。
OpenCVのサンプルを試してみた記事をまとめてみた
過去にいくつかsampleを試してみたが、何を試したのか忘れているので、自分の記事をまとめてみた。もっと試しているのだが、文章として残していない
背景差分
bgfg_gmg
http://iwaki2009.blogspot.jp/2013/03/opencv-2.html
オプティカルフロー
tvl1_optical_flow
http://iwaki2009.blogspot.jp/2013/03/opencvoptical-flow.html
特徴点検出
freak_demo
http://iwaki2009.blogspot.jp/2013/03/opencv-freak.html
latentSVM
latentsvmdetect
http://iwaki2009.blogspot.jp/2013/03/opencv-latentsvm.html
Chessboardを使用したカメラキャリブレーション
calibration_artificial
http://iwaki2009.blogspot.jp/2013/02/opencvcalibrationartificial.html
特徴点の検出と斜影変換行列のパラメータの取得
brief_match_test
http://iwaki2009.blogspot.jp/2013/02/opencvbriefmatchtest.html
色の追跡
camshiftdemo
http://iwaki2009.blogspot.jp/2013/02/opencv_68.html
同色の検出
ffilldemo
http://iwaki2009.blogspot.jp/2013/01/opencvfloodfill.html
主成分分析
pca
http://iwaki2009.blogspot.jp/2012/11/opencv-243-pcacpp.html
オプティカルフロー
SimpleFlow
http://iwaki2009.blogspot.jp/2012/11/opencv-243simpleflow.html
背景差分
bgfg_segm
http://iwaki2009.blogspot.jp/2012/08/opencv.html
特徴点の比較
matching_to_many_images
http://iwaki2009.blogspot.jp/2012/07/opencv-242-matchingtomanyimages.html
2013年4月25日木曜日
OpenCV: Computer Vision with Pythonが発売された
Pythonを使用しないので個人的には興味がないのだが、Python経由でOpenCVを使うには参考になるかもしれない
特に、各OSでの環境構築や、NumPy, SciPyの環境構築も説明されているので、興味のある人には便利かもしれない。(ただし、英語なので、英語が苦手な人には、向いていないかも)
ここで、PDFファイルを買うことができるし、簡単な紹介もある
sampleも著者のサイトから取得できるとのこと
以上
OpenCV for Android SDK の2.4.5のチュートリアル3のソースを眺めてみた 2
前回の続き
mCameraがJavaCameraViewのprotectedのメンバーなので、JavaCameraViewを継承したクラスしかアクセスできない
そのため、解像度を変えるには、オリジナルのクラスを作成しないといけないので、チュートリアル3では、JavaCameraViewを拡張して、Tutorial3Viewを定義し、いくつかのメソッドを追加している
・現在の解像度の取得は、Size getResolution()であり、やっていることは
return mCamera.getParameters().getPreviewSize();
である
・解像度の変更は、void setResolution(Size resolution)であり、やっていることは
disconnectCamera();
mMaxHeight = resolution.height;
mMaxWidth = resolution.width;
connectCamera(getWidth(), getHeight());
である。
一旦カメラの取り込みを中止し、mMaxHeight、mMaxWidthに値を設定後、再度カメラを起動しているが、サイズの指定にgetWidth()という少し回りくどいことをしている
補足
JavaCameraViewは、ソースが
sdk\java\src\org\opencv\android\JavaCameraView.java
にあるので眺めてみると少し仕組みがわかる
ドキュメントはここ
2013年4月23日火曜日
std::string を wchar_t*に変換する
認識結果を232C経由で他の装置に送るとき、シリアル通信を扱うことになる
シリアル通信は、Windows7になっても抽象化されていなく、CreateFileを使用してhandleを取得してアクセスしなければならない
古い資料では、アクセス対象となるファイルの指定には、LPCTSTR lpFileNameを用いることになっているが、Windows7では、LPCWSTRを指定する必要がある。
要求を満たすのであれば、L"COM3"のようにソースに固定値を埋め込めばよい
しかし、OpenCVのファイルストレージを使用する場合、扱える型がstd::stringなので、LPCWSTR(wchar_t*)に変換する必要がある。
std::string portname("COM7");
WCHAR wString[16];
size_t wLen = 0;
errno_t err = 0;
//ロケール指定
setlocale(LC_ALL,"japanese");
err = mbstowcs_s(&wLen, wString, 10, portname.c_str(), _TRUNCATE);
以上
OpenCV for Android SDK の2.4.5のチュートリアル3のソースを眺めてみた
2.4.4の時点でチュートリアルが見直され、2.4.3.2のサンプル 5と2.4.5のチュートリアル 3が対応している。
の2.4.5のチュートリアル3の更点に関しては、チュートリアル 1, 2同様に CvCameraViewListenerから、CvCameraViewListener2に変わったところのみで、特にこのチュートリアル特有のものはなかった。
チュートリアル 3のポイント
チュートリアル3では、チュートリアル 1, 2と異なり、Viewに、org.opencv.android.JavaCameraViewを継承した Tutorial3View を定義している。
このJavaCameraViewを拡張することで、カメラの設定を行っており、基本のJavaCameraViewには、カメラのモードを切り替える機能が提供されていない点に注意。
つまり、チュートリアル1でカメラの入力をデフォルトから他のサイズに切り替えるためには、JavaCameraViewにVideoCapture::setにあたるようなメソッドは、存在していないので、そのままでは実現できない。
チュートリアル 3のように、JavaCameraViewを継承した、独自Viewを定義し、チュートリアル 3を参考に、自分で解像度を買えるメソッドを準備しないといけない
以上
の2.4.5のチュートリアル3の更点に関しては、チュートリアル 1, 2同様に CvCameraViewListenerから、CvCameraViewListener2に変わったところのみで、特にこのチュートリアル特有のものはなかった。
チュートリアル 3のポイント
チュートリアル3では、チュートリアル 1, 2と異なり、Viewに、org.opencv.android.JavaCameraViewを継承した Tutorial3View を定義している。
このJavaCameraViewを拡張することで、カメラの設定を行っており、基本のJavaCameraViewには、カメラのモードを切り替える機能が提供されていない点に注意。
つまり、チュートリアル1でカメラの入力をデフォルトから他のサイズに切り替えるためには、JavaCameraViewにVideoCapture::setにあたるようなメソッドは、存在していないので、そのままでは実現できない。
チュートリアル 3のように、JavaCameraViewを継承した、独自Viewを定義し、チュートリアル 3を参考に、自分で解像度を買えるメソッドを準備しないといけない
以上
2013年4月17日水曜日
OpenCV for Android SDK の2.4.3.2のsample4と2.4.5のチュートリアル2のソースを比較してみた
2.4.4の時点でチュートリアルが見直され、2.4.3.2のサンプル4と2.4.5のチュートリアルが対応している。 以下に変更点のポイントのみ記す
メインは、CvCameraViewListenerから、CvCameraViewListener2に変更されていることであり、この点に関しては、チュートリアル1と同じである
チュートリアル1との違いは、2.4.3.2では、メニューでモード変更にあわせて、カメラの入力フォーマットを変更していたが、2.4.5では、カメラのフォーマットを指定せず、onCameraFrameでの引数である、CvCameraViewFrame inputFrameから、データを取り出すときに、 メソッドrgba()か、gray()かを指定する方法に変更されている点である。
nativeのコードは、変更点はなし
補足
作業用のMatは、onCameraViewStartedで確保して、onCameraViewStoppedでリリースするのがAndroidの作法であるようだ
以上
メインは、CvCameraViewListenerから、CvCameraViewListener2に変更されていることであり、この点に関しては、チュートリアル1と同じである
チュートリアル1との違いは、2.4.3.2では、メニューでモード変更にあわせて、カメラの入力フォーマットを変更していたが、2.4.5では、カメラのフォーマットを指定せず、onCameraFrameでの引数である、CvCameraViewFrame inputFrameから、データを取り出すときに、 メソッドrgba()か、gray()かを指定する方法に変更されている点である。
nativeのコードは、変更点はなし
補足
作業用のMatは、onCameraViewStartedで確保して、onCameraViewStoppedでリリースするのがAndroidの作法であるようだ
以上
OpenCV (Windows版)のリリース日を調べてみた
Windows版の各バージョンのリリース日をここを参考に調べてみた
1.0 07/5/24
1.1 08/10/17
2.0 09/10/01
2.1 10/04/06
2.2 10/12/05
2.3 11/07/04
2.3.1 12/04/04
2.4.0 12/05/01
2.4.1 12/06/21
2.4.2 12/07/04
2.4.3 12/11/22
2.4.4 13/03/21
2.4.5 13/04/05
2.4.6 13/06/01 (予定)
3.0 13/09/02 (予定)
OpenCV 3.0のリリースが予定されている
ロードマップのページを見るといつのまにか変更されており、2.5がキャンセルされ変わりに3.0が予定されている
リリース予定日は、2013/9/2である
バグ修正、機能追加はあわせて90件の予定
Bug #2138: Memory Leak in imshow (on Windows)?
など気になるものもある
2013年4月16日火曜日
OpenCV for Android SDK 2.4.5のサンプルを動かしてみた 2
昨日に続き再度 OpenCV Tutorial 2 - Mixed Processing に挑戦
エラーを調べてみると、Nativeのライブラリをロードしているところで落ちているので、Nativeのビルドができていないと推測
実は、eclipseの調子がおかしく、プロジェクトのプロパティにC++ Buildの項目が出て来なかった
eclipseを削除し、junoをダウンロードして、各種設定を行うことで、C++ Buildの項目が表示されるようになった
Builder Settingの項目でBuild commandを確認してみると
${NDKROOT}/ndk-build.cmdとなっていたので
${NDKROOT}/ndk-build に修正
これで、Nativeコードがコンパイルされるようになり、無事 isw11scで動作することを確認できた。
注意
1 .cmdはWindowsの場合、必要であるがubuntuでは、削除すること
2 eclipseはterminalから起動すること
エラーを調べてみると、Nativeのライブラリをロードしているところで落ちているので、Nativeのビルドができていないと推測
実は、eclipseの調子がおかしく、プロジェクトのプロパティにC++ Buildの項目が出て来なかった
eclipseを削除し、junoをダウンロードして、各種設定を行うことで、C++ Buildの項目が表示されるようになった
Builder Settingの項目でBuild commandを確認してみると
${NDKROOT}/ndk-build.cmdとなっていたので
${NDKROOT}/ndk-build に修正
これで、Nativeコードがコンパイルされるようになり、無事 isw11scで動作することを確認できた。
注意
1 .cmdはWindowsの場合、必要であるがubuntuでは、削除すること
2 eclipseはterminalから起動すること
OpenCV for Android SDK の2.4.3.2のsample1と2.4.5のチュートリアル1のソースを比較してみた
変更点をソースの最初から列挙する
1
2.4.5に
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
を追加
2
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener;
から
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
に変更
CvCameraViewListener2についてはここに説明がある
3
メインクラスの基底クラスが、
CvCameraViewListener
から
CvCameraViewListener2
に変更
4
public void onPause()
内での
super.onPause();
の実行場所を最初に修正
5
onCameraFrameの引数の型が
Mat
から
CvCameraViewFrameに
戻り値がMatのため
CvCameraViewFrameのrgb()関数を使用
追加
2.4.5のサンプルで、サービスを呼び出す初期化のところで、バージョンが2.4.3になっているのはバグだろう
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3
以上
登録:
投稿 (Atom)