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以上のバグ修正です

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")

となる

OpenCVの今後


本日twitterのTL上にOpenCVの開発元であるWillow Garageが解散するのではというつぶやきが目立つようになった。

今のところ公式からのアナウンスは、ここに掲載されているが、OpenCVに関して何も触れられていないため、不安が増している。

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を使用してカメラパラメータを取得する。

最後に、チェスボード画像を作成したパラメータと計算したパラメータを表示して終了する。

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の値がおかしくなるので、使用するパラメータは、試行錯誤が必要と思われる

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でバーコードの読み取りがサポートされるかも


OpenCVの関係者の定例meetingの議題にバーコードが取り上げられており、zxingと協力を検討しているようだ

今後、zxingへのコンタクトが、アクションアイテムに含まれている

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という理解をした