OpenCV、機械学習、はやりのDeep learningの環境構築の方法、サンプルの動かし方、APIの使い方、Tipsなどをすぐに忘れてしまうので、備忘録として記録している。記憶がなくなるスピードが、早いのでメモしておかないと再現できなくなる確率が高まっている。 最近、再度HDDを飛ばしてしまい、過去の自分のページに再度助けられた。 また、DNNモジュールを触る機会が増えているので、C++からPyhonへと鞍替え中。 内容を気にいっていただければ、twitterで紹介願います。
2013年2月26日火曜日
第19回画像センシングシンポジウム(SSII2013)の覚書
プランA:チュ-トリアル+シンポジウム
(2013年6月12日(水)~14日(金))
一般:25,000円(30,000円)
学生:10,000円(13,000円)
チュートリアル講演会
実世界認識のための転移学習の基礎と応用
6月12日(水)9:30~11:00
Random Forestsの基礎と最新動向 ~大量データ時代に適した機械学習手法~
6月12日(水)11:45~12:45
多視点画像からの3次元復元 ~基本原理から大規模復元まで~
6月12日(水)14:00~15:30
テンプレートマッチングの魅力 ~物体検出・位置決めの定番技術~
6月12日(水)15:45~17:15
特別講演
3次元コンピュータビジョンの新展開
6月13日(木)
オーガナイズドセッション
画像と知識とをつなぐ機械学習技術 - その最先端 -
13日(木)11:15~12:45
確率分布間の距離に基づく機械学習
画像のスパース表現の理論と最適化アルゴリズム
ディープラーニングと画像認識への応用
センサ革命。次への挑戦
14日(金)11:15~12:45
CMOSイメージセンサの高性能化、高機能化に向けた取り組み
高速に運動・変形する対象のための3次元形状計測法
車載用イメージングレーザレーダ
画像処理・認識をビジネスに繋げる実践論
14日(金)15:30~17:00
セキュリティ画像処理のフィロソフィー
マーケティングビジネスにおける画像センシング技術の適用
画像認識技術のビジネス展開に向けた課題
以上
2013年2月25日月曜日
OpenCVのカメラ情報に関して調べてみた
以前 "OpenCVでカメラ情報を取得してみた" というエントリーの続き
どうしてもUSBカメラのパラメータを設定したいので、VideoCapture のソースを調べてみた。
VideoCaptureクラスは、
modules\highgui\src
の cap.cpp 内で定義されており、getの関数で、cvGetCapturePropertyが呼ばれている
cvGetCaptureProperty内では、capture->getProperty(id)を呼んでいるだけ
captureは、CvCaptureのポインタであり、cvCreateCameraCapture関数内のswitch (domains[i])
の処理で、システムが有するインタフェースに応じたクラスのインスタンスが生成されている。
各インタフェースに応じたクラスのソースは、同じmodules\highgui\srcのフォルダに格納されている
domainsは、
CV_IMPL CvCapture * cvCreateCameraCapture (int index)
{
int domains[] =
で定義されており、domainsの並びの順番で、どのインタフェースを優先して選ばれるかが決まる
実際は、ここで選ばれたインタフェースごとに、CvCaptureを継承する各インタフェースに対応したクラスのソースが準備されており、そのソース内で各カメラパラメータへのアクセスが実現されている
Windowsの場合、デフォルトでは、VFWが選ばれているような気がする
(自分でOpenCVをコンパイルをしていないため何が選ばれているか不明である)
内部には、
CV_IMPL int cvGetCaptureDomain( CvCapture* capture)
というどのdomainなのか調べる関数が準備されているが、VideoCaptureのクラスに呼び出す関数が無いため、外部からアクセスできなくなっている
画像認識用の書籍を調べてみた
最近発売されたか、今後発売予定の画像認識関連の書籍を調べてみた。
済み
実践 医用画像解析ハンドブック
2012/11 15,750円
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-21282-6
コンピュータビジョン最先端ガイド5
2012/12/5 1,500円
http://opluse.shop-pro.jp/?pid=51572600
実践OpenCV 2.4―映像処理&解析
2013/01 3,990円
http://www.cutt.co.jp/book/978-4-87783-184-4.html
予定
コンピュータビジョン―アルゴリズムと応用―
2013年03月09日 16,800円
http://www.kyoritsu-pub.co.jp/bookdetail/9784320123281
(2/26 追加)
機械学習によるパターン識別と画像認識への応用
2013年5月25日 47,250円
http://www.catnet.ne.jp/triceps/pub/ex046.html
HLAC特徴を用いた学習型汎用認識
2013年5月27日 52,290円
http://www.catnet.ne.jp/triceps/pub/ws269.html
以上
画像認識のセミナーを調べてみた 4
今後3ヶ月以内に開催される画像認識に関連するセミナーを調べてみた。
以下はすべて有料である。
パターン認識・検索技術の基礎と応用~映像・画像の認識や高速探索法
2013年2月26日(火)10:00-17:00
http://www.catnet.ne.jp/triceps/sem/s130226a.html
車載カメラの周辺環境認識・検知技術および今後の展望
2013年2月27日(水)13:30-16:30
http://www.nts-book.co.jp/seminar/2/a23.html
パターン認識の基礎と応用 ~1人1台PC実習付~
2013年2月28日(木) 10:30 - 17:30
http://www.j-techno.co.jp/infos/view/6178
距離画像センサ/カメラ技術の基礎とその応用
2013年3月22日(金) 10:30 - 17:30
http://www.j-techno.co.jp/infos/view/6238
パターン認識の基礎とベイズ推定による統計的識別法のMATLAB実習講座
2013年4月8日(月) 13:00-17:00 2013年4月9日(火) 9:30-16:30
http://www.j-techno.co.jp/infos/view/6318/
物体追跡(Object Tracking)技術の基礎と今後の動向
2013年4月11日(木)10:30-16:30
http://www.catnet.ne.jp/triceps/sem/s130412a.html
進化的・知的画像処理/認識技術
2013年4月15日(月) 10:30-16:30
http://www.catnet.ne.jp/triceps/sem/s130415k.html
デジタル画像処理・画像解析の基礎講座 ~デモ付~
2013年4月17日(水)10:30-17:30
http://www.j-techno.co.jp/infos/view/6520/
~TRECVID2012にみる~映像検索技術の最新動向
2013年4月19日(金) 13:30-16:30
http://www.catnet.ne.jp/triceps/sem/s130419a.html
画像認識のための局所不変特徴量の理解とGPUによる実装の基礎
2013年4月24日(水) 10:30-16:00
http://www.catnet.ne.jp/triceps/sem/s130424a.html
コンピューテーショナルカメラ技術とその応用・アプリケーション例
2013年5月13日(木) 10:30-17:30
http://www.j-techno.co.jp/infos/view/6302/
局所不変特徴量とGPU実装の基礎講座:物体認識の精度向上と高速化
2013年5月24日(金) 10:30-17:30
http://www.j-techno.co.jp/infos/view/6334/
以上
2013年2月22日金曜日
OpenCVの派生 MeeGo Harmattan 版をみつけた
OpenCVは、ソースが公開されているため、普及しているプラットフォーム以外へもいくつか移植が行われている。
別の目的でGoogle先生に質問していたところ、偶然OpenCV for Meego-Harmattan 1.2というマニアックなものを見つけた。
Meego-Harmattanに関しては、ここを参照、 MeeGo自体もオープンソースのプロジェクトであったが、もろもろの事情により今はTizenと名を代え継続している
Meego-Harmattanをサポートした携帯が、NokiaN9であり、この携帯を所持していれば、OpenCV for Meego-Harmattan 1.2で遊ぶことができるが、CPUがOMAP 3630 1GHzなので、たいしたことはできないと思われる
2013年2月21日木曜日
OpenCVのDocumentationのページがリニューアルされた2
ふとドキュメントのページを見ると2/12日に見たときと構成が少し変更されていた。
今回新たに、2.4.4 betaが別途設けられている。
また、2.4.4 beta 2.4.3 2.4.2 そろぞれに Java APIの項目も追加されている
NIGHT BUILDを見ると、2.4.4.0と以前と変わっていないようにも見えるが、細かいところで変更が生じていると思われる。
2013年2月20日水曜日
OpenCVでステレオ画像を扱う 1
一時期3Dが流行したころ、日本のスマフォも3D機能を有しており、3Dモードでのカメラ撮影や、3Dモード撮影した画像を3Dモードで見る機能を有しているものがいくつかリリースされた。
そのようなスマフォの1機種である HTC の ISW11HT を有しているので、撮影した3D画像をOpenCV で処理することを考えている。
ISW11HT は、回線契約をしていなくても WiFi でインターネットにアクセスでき、白ROMを安く入手することができる。
最新の機種と比較するとスペック的には、見劣りするがデュアルコアでメモリも1G有しているのでそれなりに遊べる。
さて、ISW11T では、本体に2D-3Dのモード切替えスイッチを有しており、これを3Dにすると、カメラの撮影が3Dモードとなる。
3Dモードで静止画を撮影すると、拡張子 .mpo のファイルが作成される。この拡張子のままでは、OpenCV で読み込むことができないので、有志が提供しているmpo2jpg.exe というプログラムを使用して左右2つの jpg ファイルに変換する必要がある。
一方、3Dモードで動画を撮影すると、拡張子 .mp4 のファイルが作成される。このファイルは、OpenCV で扱うことができるが、1枚のフレームに左右の画像が半分に圧縮され連結して格納されているため、読み込んだ画像を左右の画像に分割し、横方向に拡大する必要がある。
うまく、カメラパラメータの取得とステレオカメラのキャリブレーションができたら、depthマップがつくれるのではないかと考えている。
2013年2月15日金曜日
OpenCVでベクトルから長さと角度を計算する
Sobelなどでx方向、y方向のエッジ強度を求めたあと
cv::Matの形式のままだと
cv::cartToPolar(matX, matY, magnitude, angle, true);
を使用すれば一度に変換することができる。
補足:
cv::cartToPolarの入力データの形式は、短精度か倍精度の浮動小数点なので、sobelの出力の形式をあわせておく必要がある CV_32Fなど
各要素ごとに計算する場合は、
cv::norm(cv::Point(x , y));
cv::fastAtan2(y , x);
を使用することになる
注意
双方とも角度の結果は、0-360となり、精度は0.3である
cv::Point(0,0)の角度は、0になるので、ヒストグラムを計算する場合除外しなければいけない
2013年2月13日水曜日
OpenCV 2.4.4 betaがリリースされた
追加
3/1に正式版がリリースされた
昨日2.4.4のbeta版がリリースされました。ベータなしのリリースが3/1予定なので、試してみる予定はありません。
変更点は、ここに載っていますが、メインはdesktopのJava対応や、Androidのsampleの見直し、GPU対応、ocl モジュールの提供、100以上のバグ修正です
3/1に正式版がリリースされた
昨日2.4.4のbeta版がリリースされました。ベータなしのリリースが3/1予定なので、試してみる予定はありません。
変更点は、ここに載っていますが、メインはdesktopのJava対応や、Androidのsampleの見直し、GPU対応、ocl モジュールの提供、100以上のバグ修正です
2013年2月12日火曜日
OpenCVの2次元特徴のtutorialを試してみた
特徴点の検出、特徴量の取得、対応点の発見のtutorialを試してみた
samples\cpp\tutorial_code\features2D SURF_Homography.cppを最初に試したが、2次元特徴のtutrialの一番最後にあたるものであった。
順番に試してみるなら下記の順番がよい
SURF_detector.cpp SURFを用いた特徴点の検出
SURF_descriptor.cpp SURFを用いた特徴点の検出、見つけた点の特徴量を求め、BruteForceMatcherで対応する特徴点の発見と描画
SURF_FlannMatcher.cpp SURFを用いた特徴点の検出、見つけた点の特徴量を求め、FlannBasedMatcherで対応する特徴点の発見と描画
SURF_Homography.cpp SURFを用いた特徴点の検出、見つけた点の特徴量を求め、FlannBasedMatcherで対応する特徴点の発見と描画、2つの画像のHomographyを計算し、perspectiveTransformで、片方の画像での対応する面を描画
ためしに選んだ画像では、4つめのtutorialの結果がわかりづらいので、SURF_FlannMatcher.cppの結果の画像を示す。
左の画像は、ピントがすこしあまくボケているが、それでもいくつかの特徴点は、右の画像と正しく一致していることがわかる
なお、ソースでは、#include "opencv2/nonfree/features2d.cpp" となっているが
#include "opencv2/nonfree/nonfree.hpp" に変更している
また、読み込む専用のライブラリは、
#pragma comment(lib,"opencv_nonfree243d.lib")
#pragma comment(lib,"opencv_features2d243d.lib")
#pragma comment(lib,"opencv_flann243d.lib")
となる
samples\cpp\tutorial_code\features2D SURF_Homography.cppを最初に試したが、2次元特徴のtutrialの一番最後にあたるものであった。
順番に試してみるなら下記の順番がよい
SURF_detector.cpp SURFを用いた特徴点の検出
SURF_descriptor.cpp SURFを用いた特徴点の検出、見つけた点の特徴量を求め、BruteForceMatcherで対応する特徴点の発見と描画
SURF_FlannMatcher.cpp SURFを用いた特徴点の検出、見つけた点の特徴量を求め、FlannBasedMatcherで対応する特徴点の発見と描画
SURF_Homography.cpp SURFを用いた特徴点の検出、見つけた点の特徴量を求め、FlannBasedMatcherで対応する特徴点の発見と描画、2つの画像のHomographyを計算し、perspectiveTransformで、片方の画像での対応する面を描画
ためしに選んだ画像では、4つめのtutorialの結果がわかりづらいので、SURF_FlannMatcher.cppの結果の画像を示す。
左の画像は、ピントがすこしあまくボケているが、それでもいくつかの特徴点は、右の画像と正しく一致していることがわかる
なお、ソースでは、#include "opencv2/nonfree/features2d.cpp" となっているが
#include "opencv2/nonfree/nonfree.hpp" に変更している
また、読み込む専用のライブラリは、
#pragma comment(lib,"opencv_nonfree243d.lib")
#pragma comment(lib,"opencv_features2d243d.lib")
#pragma comment(lib,"opencv_flann243d.lib")
となる
OpenCVで平均2乗誤差を計算する
OpenCVで画像処理を行った結果、平均2乗誤差(Mean Square Error)を計算したい場合がある。
愚直に一画素ごとに計算していたが、OpenCV 2 プログラミングブック p194に簡単に計算するコードが記載さている
cv::Mat gray1 , gray2;
gray1.convertTo(gray16s1, CV_16S);
gray2.convertTo(gray16s2, CV_16S);
gray16s1 -= gray16s2;
cv::Scalar s = sum(gray16s1.mul(gray16s1));
double mse = s[0] / gray16s1.rows / gray16s1.cols;
蛇足
CV のMSE は Microsoft Security Essentials ではない
OpenCVのDocumentationのページがリニューアルされた
休み中、OpenCVのDocumentationのページにアクセスできなかったので更新中かと思っていたら、リニューアルされていた。
今回、バージョンごとのリファレンスやユーザーガイド、チュートリルのページのほかに、最新版(Night Build)のページも用意されている
Night Buildは、2/12の時点では、2.4.4.0ドキュメントのページとなる
2.4.3のリファレンス
以前の2.4.3のドキュメントのページ
今の2.4.3のドキュメントのページ
2013年2月10日日曜日
OpenCVのcalibration_artificialを試してみた
サンプルファイルは、samples\cpp\calibration_artificial.cppを使用
実行すると、20枚のチェスボード画像を作成し、cv::findChessboardCornersを使用してボードのコーナーを検出する。
検出したコーナーの座標を用いて、cv::calibrateCameraを使用してカメラパラメータを取得する。
最後に、チェスボード画像を作成したパラメータと計算したパラメータを表示して終了する。
実行すると、20枚のチェスボード画像を作成し、cv::findChessboardCornersを使用してボードのコーナーを検出する。
検出したコーナーの座標を用いて、cv::calibrateCameraを使用してカメラパラメータを取得する。
最後に、チェスボード画像を作成したパラメータと計算したパラメータを表示して終了する。
2013年2月9日土曜日
OpenCVでbrief_match_testを試してみた
sample\cpp\brief_match_test.cppを試したみた。
このサンプルでは、2枚の画像の特徴点を用いて、斜影変換行列のパラメータが取得できる
特徴点は、FastFeatureDetectorで検出し、各特長点の特徴量をBriefDescriptorExtractorを使用して得ている
BFMatcherをNORM_HAMMINGで(注意 NORM_HAMMING should be used with ORB and BRIEF)対応付けを行い、matches2pointsのモジュールで座標をリストとして得る
次に、得た座標をfindHomographyに与えて、cv::Mat Hに変換用のパラメータを取得する
ただし、サンプルでは
Mat H = findHomography(mpts_2, mpts_1, RANSAC, 1, outlier_mask);
のところで落ちてしまうので、
vector<char> outlier_mask;
を
Mat outlier_mask;
のように修正すると問題なく処理される
求めた、homographyを使用し、
warpPerspective(im2, warped, H, im1.size());
でwarpedに斜影変換した画像を得ることができる。
detectorのパラメータが50だと検出される点が多くなるので、
FastFeatureDetector detector(100);
値を大きくすることで、数を減らすことができるが、得られたhomographyの値がおかしくなるので、使用するパラメータは、試行錯誤が必要と思われる
このサンプルでは、2枚の画像の特徴点を用いて、斜影変換行列のパラメータが取得できる
特徴点は、FastFeatureDetectorで検出し、各特長点の特徴量をBriefDescriptorExtractorを使用して得ている
BFMatcherをNORM_HAMMINGで(注意 NORM_HAMMING should be used with ORB and BRIEF)対応付けを行い、matches2pointsのモジュールで座標をリストとして得る
次に、得た座標をfindHomographyに与えて、cv::Mat Hに変換用のパラメータを取得する
ただし、サンプルでは
Mat H = findHomography(mpts_2, mpts_1, RANSAC, 1, outlier_mask);
のところで落ちてしまうので、
vector<char> outlier_mask;
を
Mat outlier_mask;
のように修正すると問題なく処理される
求めた、homographyを使用し、
warpPerspective(im2, warped, H, im1.size());
でwarpedに斜影変換した画像を得ることができる。
detectorのパラメータが50だと検出される点が多くなるので、
FastFeatureDetector detector(100);
値を大きくすることで、数を減らすことができるが、得られたhomographyの値がおかしくなるので、使用するパラメータは、試行錯誤が必要と思われる
2013年2月8日金曜日
OpenCVのプログラム落ちる
OpenCVのAPIに対して、有効でないパラメータを渡すとプログラムが落ちてしまう。
今回は、std::vector<cv::Point>のデータを、cv::fitEllipseに渡すと時々落ちてしまう現象が生じた。
落ちる場所は、わかったのだがなぜ落ちるのかは、すぐにわからなかった。
cv::fitEllipseにも注意書きがない
そこで、まじめにtry {} catch (cv::Exception e) {} で問題箇所を囲ったところ
std::vector<cv::Point>のサイズが5必要というエラーであることがわかった。
教訓
原因が不明な場合は、落ちる場所で、try {} catch (cv::Exception e) {} で囲いましょう
OpenCVで値の保存と読み込みを行う
OpenCVに、XMLやYAML形式のファイルへの読み書きを行う cv::FileStorage が提供されているので、設定用の値を読み書きをためしてみた。
一部便利な機能もあるが、中途半端と思えるところもある
以下、YAMLで試した場合の話
便利な点
cv::Matの読み書きが オペレータ >> でできる
困った点
cv::Matと同じようにcv::Rectもオペレータが使えるかと期待したが、cv::Rectは、書き込みの場合は >> が利用できるが、読み込みの場合は、コンパイラにreadできないとはじかれる
cv::Rectを読み込みたい場合には、cv::FileNode と cv::FileNodeIterator で、自分でx, y, width, heightを読み込むことになる
これなら、書き込みのときに要素にばらして書き込み、要素ごとに読み込んだほうが簡単な気がした
2013年2月7日木曜日
OpenCVで傾いた画像をまっすぐにする
調べ物をしていて偶然見つけたブログのメモ
2つの点から傾きの角度を計算し、画像の中心点を与えてアフィン変換用のmatrixを求め、アフィン変換を行う
cv::Mat r = cv::getRotationMatrix2D(center, angle, 1.0);
cv::Mat dst;
cv::warpAffine(im0, dst, r, im0.size());
ほかにも役立ちそうな内容が掲載されている。
OpenCVで指定した色の物体を追跡するデモの補足
OpenCV 2 Computer Vision Application Programming CookbookのP108に meanShiftを使用した物体検出のデモが掲載されている
こちらでは、RGBからHSVへの変換後、cv::splitで std::vector<cv::Mat>に変換し、v[0]で、Hueデータにアクセスしている
OpenCVで指定した色の物体を追跡するデモを試してみた
指定した色を有する物体を追跡するデモが、samples\cpp\camshiftdemo.cppで提供されている
ビルドして、コマンドライン引数にカメラ番号を与えて起動すればよいが、めんどくさい場合は、ソースのcap.open()にカメラ番号を直接指定し、ビルドすればよい
大まかな処理の流れ
1 マウスで初期エリアを指定
2 マスク画像の作成
3 RGBからHSV変換し、H画像の取得
4 指定エリアのヒストグラムを計算、正規化、描画
5 ヒストグラムを元にBackProjectionを計算
6 計算結果にマスクをかける
7 CamShiftにより対象エリアの計算
8 次回探索枠の計算
9 結果の表示
であり、2-9を繰り返すことになる
2 マスク画像の作成
inRange(hsv, Scalar(0, smin, MIN(_vmin,_vmax)),Scalar(180, 256, MAX(_vmin, _vmax)), mask);
で H 0-180 (全部)
S smin - 256 再度の小さい画素は使用しない
V 明るさ vmin-vmax 黒つぶれ、白とび部は、色相がずれるので使用しない
を指定し、色ベースの追跡を行う画素の選別をしておく
あとで、calcBackProjectの結果とandをとっているが、backproj &= mask;
calcHistの計算時にmaskをかけてもよい気がする
7 CamShift
meanShift()の改良版 WindowのサイズとWindowの方向性も検出できる
CamShift(backproj, trackWindow, TermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ));
3番目のパラメータは、停止条件であり、CV_TERMCRIT_EPS(精度) 10 または、CV_TERMCRIT_ITER(繰り返し数) 1で停止する
デモでは、ゆるい条件設定になっており早く、終了する
その他
calcBackProjectのtutorialでは、backprojをMatNDで宣言していたが、このデモでは、Matで宣言しているので、あまり厳密に区別しなくてよいみたいだ
OpenCVのコマンドパーサーについて
OpenCV 2.3からコマンドラインの引数を解析するモジュール cv::CommandLineParser が提供されている
なぜか、OpenCV 2.4.3 documentationの検索では、説明を見つけることができなかったが、ドキュメントはここに準備されている
コマンドラインに与えられた引数を、get<T>("name")または、get<T>(index)で取得できる
2013年2月6日水曜日
OpenCVのBack Projection試してみた2
Back Projectionがよくわからないので、tutrialを試してみた。
ソースは、samples\cpp\tutorial_code\Histograms_MatchingのcalcBackProject_Demo2.cppを使用した
Demo2の説明は、残念ながら準備されていないようだが、ソースを追えば、処理内容は理解できる。
今度は、トラックバーがbinの数ではなく、Floodfillnの範囲を指示するために使用している。
また、ヒストグラムの計算と、calcBackProjectでは、Floodfillで作成したマスク画像を使用している。
Maskすることの効果は、何か理解できていない
参考にプログラムを実行した図を載せておく
OpenCVのBack Projection試してみた
Back Projectionがよくわからないので、tutorialを試してみた。
ソースは、samples\cpp\tutorial_code\Histograms_MatchingのcalcBackProject_Demo1.cppを使用した
コードの説明は、ここに記載されており、各処理に関しての説明が記載されているが、これを読んでも何ができるのかよく理解できなった。
いろいろ調べた結果、Back Projectionの役割に関しては、OpenCV 2 Computer Vision Application Programming CookbookのP103のほうがわかりやすい。
元のROIのヒストグラムを計算しヒストグラムを特徴量として、基準画像と比較対処の画像の類似度を求めるのが、calcBackProjectという理解をした
登録:
投稿 (Atom)