2012年12月31日月曜日

Mastering OpenCVの第8章の顔認識のメモ step2 後半

Mastering OpenCV with Practical Computer Vision Projectの第8章の顔認識は、4つのStepで構成されている。
今回は、Step2の、顔認識の精度を高めるための前処理に関しての続き

顔と両目の検出ができた場合、両目の位置をそろえることにより検出精度を高める。

・warpAffin()を使用することで、以下の項目を実現できる。

 ・両目が水平なるように回転させる。
 ・両目の間隔を一定にそろえる
 ・目の高さを顔の中心にすることで、顔の高さを所望のものにする。
 ・髪の毛、額、あご、耳の部分が含まれないように領域を切り取る

 あらかじめ決めた理想の座標と、検出した両目の座標を用いてアフィン行列を作る。

 はじめに、目の中心座標を求め、アフィン変換を行う
 詳細な方法は、コードに記載されている。

・ヒストグラムの平滑
 現実世界では、左右の照明環境が異なる場合があり、認識精度に影響を与える。
 右半分と、左半分でヒストグラムの平滑化を別々に行う
 ただし、そのまま合成すると境目ではっきりとしたエッジが生じてしまう。

 これを回避するために、左右別々のヒストグラムの平滑化と、全体で平滑化したものを
 合成する。

 左から 0-25% 左半分の平滑化画像
 25-50%   左半分の平滑化画像と全体平滑化画像を距離に応じて加算
 50-75%   全体平滑化画像と右半分の平滑化画像とを距離に応じて加算
  75-100% 右半分の平滑化画像

・スームージング
 平滑化を行うとノイズが目立ってしまう
 これを回避するためにbilateralFilterを使用する

・楕円マスク
 首は影の影響を受けやすいので、黒画像の楕円マスクを作成、上記画像と合成する

以上により認識用の前処理画終了

第8章を数日前に読み終えていたのだが、なかなか書く気力がなかったが何とか年内に纏め上げることができた。

2012年12月28日金曜日

Mastering OpenCVの第8章の顔認識のメモ step2 前半


Mastering OpenCV with Practical Computer Vision Projectの第8章の顔認識は、4つのStepで構成されている。
今回は、Step2の、顔認識の精度を高めるための前処理に関して

両目を検出する
 ・OpenCV 2.4の目の辞書は、目が開いていても閉じていても検出できる

 ・目を閉じている場合を検出するには、左右異なる辞書を使用する
  haarcascade_mcs_lefteye、haarcascade_lefteye_2splits(右も同様)

 ・lefteyeが意味するのは、実際の体の左側を示している。カメライメージでは右側になる。

 ・検出精度は、下記の順番である。

 (1) haarcascade_mcs_lefteye.xml
     haarcascade_mcs_righteye.xml

 (2) haarcascade_lefteye_2splits.xml
     haarcascade_righteye_2splits.xml

 (3) haarcascade_eye.xml

 (4) haarcascade_eye_tree_eyeglasses.xml

 ・haarcascade_eye_tree_eyeglassesは、めがねをかけていても検出できるが、かけていないと検出できない

 ・目の検出には、目の近傍の画像を使用しなければいけない。顔全体で検出すると信頼性が下がる
 
 ・haarcascade_mcs_lefteye、haarcascade_lefteye_2splitsは、目の近傍の少し大きめの範囲に対応できる。一方、haarcascade_eyeは、目の近傍の狭い範囲しか対応できない

 ・近傍のエリア割合の表が、掲載されているが、LBPで検出された顔領域に対するものである。

 ・各辞書に対する検出率の表が掲載
  両目を検出するため、検出率は2乗になる

 ・目の画像は小さくなるためなるべく大きな画像を使用したほうがよい

 ・最初にhaarcascade_mcs_lefteyeを試して、失敗したらhaarcascade_lefteye_2splitsを試すとよい
 
 ・顔認識の場合、目を閉じていると信頼性が下がるため、haarcascade_eyeを試し、失敗したらhaarcascade_eye_tree_eyeglassesを試すとよい

 後半に続く

2012年12月27日木曜日

画像認識のセミナーを調べてみた 3


今後3ヶ月以内に開催される画像認識に関連するセミナーを調べてみた。
以下はすべて有料である。

画像処理アルゴリズムとFPGA選定 ~1人1台PC実習付~
2013/1/24 (木) 10:30-17:30
http://www.j-techno.co.jp/infos/view/6168

画像局所特徴量と統計的学習手法の組み合わせによる物体認識
2013年1月29日(火) 10時00分 ~ 17時00分
http://www.catnet.ne.jp/triceps/sem/s130129a.html

スパース信号表現のポイント解説と音声・画像処理への応用
2013年1月30日(水)10:30-16:30
http://www.catnet.ne.jp/triceps/sem/s121022a.html

移動物体認識のための特徴抽出法と判定アルゴリズムの基礎と事例
2013/02/13 10:30 - 17:30
http://www.j-techno.co.jp/infos/view/2899

パーティクルフィルタの基礎と追跡・検出・認識・推定への応用  ~デモ付~
2013年2月14日(木) 10:30 - 17:30
http://www.j-techno.co.jp/infos/view/1052

パターン認識・検索技術の基礎と応用
2013年2月26日(火) 10時00分 ~ 17時00分
http://www.catnet.ne.jp/triceps/sem/s130226a.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

以上

2012年12月26日水曜日

Mastering OpenCVの第8章の顔認識のメモ step1 後半


Mastering OpenCV with Practical Computer Vision Projectの第8章の顔認識は、4つのStepで構成されている。
今回は、step1の後半

検出前の処理

・白黒変換
・画像の縮小
 計算時間短縮のため画像を縮小する
  検出したい顔の領域が20x20ピクセルになるようにする
  左右のアスペクト比は変更しない
・ヒストグラムの均等化

検出
 顔の検出は、detectMultiScaleを使用する

 パラメータの説明
  ・minFeatureSize : 検出した顔の最小サイズ 20x20が一般
  ・searchScaleFactor : 異なるサイズの顔を検出する場合の拡大率 1.1が一般的 1.2にすると処理時間が短いが検出しないことがある
  ・minNeighbors : 3が一般的 大きくすると信頼性が上がるが検出されない場合がある
  ・flags : デフォルトは複数の顔を検出するが、CASCADE_BIGGEST_OBJECTにすると最大の領域のみ検出する
       他のパラメータを付加すると数%はやくなる CASCADE_DO_ROUGH_SEARCG, CASCADE_SCALE_IMAGE

 step2に続く

OpenCV 2.4.4がリリースされるようだ


公式のロードマップを見ていたら、2.4.4のリリースが2013/2/1に予定されていた。
以前見たときには、次のバージョンは、2.5の気がしたが追加されたのだろう

2.4.4の特徴は、多くは細かいバグの修正だが、個人的には、

Feature #2645: Patch cvHaarDetectObjects for parallel_for_ 2.4.3

が気になる。

また、Android向けには。2.4.3.2がリリースされている。

2012年12月23日日曜日

OpenCVのプロジェクト向けのgcc と CMakeの使い方


ubuntuで自作のOpenCVアプリをgccでmakeするやり方
オリジナルはここ

1 適当なディレクトリにソースを作成
  例: DisplayImage.cpp

2 CMake用のファイル CMakeLists.txt を作成
    ファイルの中身
    project( DisplayImage )
    find_package( OpenCV REQUIRED )
    add_executable( DisplayImage DisplayImage )
    target_link_libraries( DisplayImage ${OpenCV_LIBS} )

3 OpenCVのディレクトリの設定
export OpenCV_DIR="/usr/local"

4 makeファイルの作成
cmake .

5 make
make

顔検出、認識の資料のメモ



今さらであるが、HaarLikeの顔検出の過程を視覚化した映像

・顔認識の原理説明
  筑波大学システム情報工学研究科の講義資料
  深く知りたい場合は、ここからたどれる

固有顔 wiki

Mastering OpenCVの第8章の顔認識のメモ step1 前半


Mastering OpenCV with Practical Computer Vision Projectの第8章の顔認識は、4つのStepで構成されている。

個人的には、Step2, Step3が、他では詳しく書かれていない内容が記載されており価値が高いと思う。

まずは、step1の顔検出から

・ポイント
 ・Mastering OpenCVは、特許の関係から、Haar-baseではなくLBP-baseを使用して顔を検出している。(しかし、目の検出は、Haar-baseを使用している。)
LBPの方が検出時間が短い。
   
・辞書は、positive 1000 negative 10000は必要
・辞書作成時間 LBP 数時間 Haar 1週間

・OpenCV 2.xのLBPの辞書は、調整されていなく、Haarの辞書の方が性能がよい
 性能が必要な場合、自分でLBPの辞書を作るか、Haarを使用するか
 (OpenCV2.xの辞書の話であり、方式の話ではない)
 
 辞書の概略
デフォルト : haarcascade_frontalface_default.xml
高速haar : haarcascade_frontalface_alt2.xml
高速LBP : lbpcascade_frontalface.xml
横顔 : haarcascade_profileface.xml
全身 : haarcascade_fullbody.xml

・CascadeClassifierクラスは、抽象化されており、辞書で、HaarとLBPを自動で判定されている。
・辞書のパス間違いによりエラーでよく落ちるので、try catchを使用したほうがよい。

 後半に続く

OpenCVで顔認識を試してみた


Mastering OpenCV with Practical Computer Vision Projectの第8章の顔認識を試してみた。

Ubuntu12.04を使用している。Terminalでソースを展開したディレクトリのChapter8に移動し、

export OpenCV_DIR="/usr/local"
cmake .
make

のコマンドを入力すると、同じディレクトリに実行ファイル WebcamFaceRec が出来上がる。

WebcamFaceRecをそのまま実行すると、
Could not load Face Detection cascade classifier [lbpcascade_frontalface.xml]
Could not load 1st Eye Detection cascade classifier [haarcascade_eye.xml]
とエラーになるので、OpenCVのdataディレクトリーから必要なファイルをChapter8のフォルダーにコピーする。

アプリを実行するとWebCamより画像の取り込みを始める。
顔が検出されると、黄色の枠が描画され、目の検出が成功すると水色で丸が描画される。
また、画面中央上部に補正された認識用の顔が描画される。

AddPerson領域をクリックするとデータの収集を始める。
(アプリの使い方が理解できていないので、step4を読み直す必要がある)

Escで終了するが、固有値ファイルが保存されていないので、ファイルが必要な場合は、自分で改造しなければいけない。

本には、処理の概要が記載されており、非常に役に立つ。全部を記載するのは、問題がありそうなので、今後ポイントのみ忘れないように記載する。

2012年12月18日火曜日

OpenCVでナンバープレートの認識を試してみた


Mastering OpenCV のサンプルが公開されていてので、早速ダウンロードしてみてビルドしてみた。

とりあえず、本を眺めてみて事前の準備がいらなさそうな第5章の車のナンバープレート認識を試してみた。

ナンバープレート認識の前提条件としては、コンディションのよい照明環境で、車の正面から撮影した画像であり、ナンバープレートは、少し傾きがあってもよいが、スペインのナンバーに限定されている

というのは、内部のアルゴリズムで使用する数値、プレートを切り出す時の比率や、内部の文字の間隔など、スペインのプレートに合わせた設定になっているためである。

プログラムのビルドは、いったんCMakeでIDE用のプロジェクトファイルを作成しなければいけなく、WindowsにCMakeをインストールする気がなかったのでUbuntuで試してみた。

サンプルには、テスト画像が12枚付属しておりすぐに試してみることができる。下記画像は、その中の1つで試したものである。


認識結果が重ねて表示される

2012年12月14日金曜日

Mastering OpenCV のKindle版が、60%offで販売されている


先週注文したときには、紙版しか扱われていなかったが、Kindle版がいつの間にか発売されており、かつ60%引きとなっており、ダメージが大きい

Kindle版は、ここから注文できる。60%offは、特別セールなのかもしれないので、気になる人は購入したほうがよいだろう。

Mastering OpenCV のサンプルが公開されている


書名が長いので、単純にMastering OpenCV と縮めている。

どんな内容か気になるのであれば、第4章がサンプルとしてまるまる1章公開されているので読んでみると雰囲気がわかる。

ここのページにアクセスし、Sample Chaptersにアクセスすればよい。

Mastering OpenCV with Practical Computer Vision Projectのソースコードをダウンロードしてみた


Mastering OpenCV with Practical Computer Vision Projectが予想以上によい本なので、しばらくネタが続いてしまう。

早速ソースをgithubからダウンロードしてみた。gitは使わず、zipファイルをダウンロードした。

ダウンロードサイズは、71Mであり、展開後は203Mとなる

早速3章のプロジェクトの注釈を読むと

1 IDE用のプロジェクトファイルをCMakeで最初に作成する必要がある
2 デモを動かすには、OpenGL対応のOpenCVを自分でビルドする必要がある

と書かれており、すぐにデモで遊べそうではない。

2012年12月13日木曜日

Mastering OpenCV with Practical Computer Vision Projectのソースコードを比べてみた


9章がないのでひょっとしてとおもって、githubのソースコードと本文のコードを比べてみた。


昨日2章を見ていたのだが、MarkerDetectorのprivateの宣言が何もないので不思議に思っていたら、githubのソースには、変数が宣言されている。


紹介のページでは、full source-code と書かれているが、実際は一部省かれているので本文を参考にする人は注意したほうがよい

内容を理解したいのであれば、githubのソースをみながらのほうがよいだろう。

Mastering OpenCV with Practical Computer Vision Projectのソースコードが提供されていた


本文にソース記載されており、便利なのだが、ものぐさなのでソースを探していたら、githubに公開されていることがわかった。
また、カラーのサンプル画像も見ることができる。

不思議なことに紹介では、9章が存在しているが、購入した本には8章までしか掲載されていない

ちなみに9章はKinectを使用したFluid Wall である。

2012年12月10日月曜日

Mastering OpenCV with Practical Computer Vision Projectを購入してみた


日本アマゾンで最新版が販売されていたので購入してみた。

いままでOpenCVを触ってみても、ちょっとしたツールは作れるが、何らかのアプリを作ろうとするととたんにハードルが高くなってしまったが、この本をみれば、性能は別としてちょっとしたアプリを作れそうな気になる。

1章
 アニメフィルターと肌色の変更
2章
  マーカーを使用したAR
3章
 マーカーなしAR
4章
 動きから3次元再構成
5章
 ナンバープレート認識
6章
 顔の特徴点追跡
7章
 3次元顔の向き推定
8章
 顔認識

英語を除けば、勉強会にはよい気がする。

2012年12月6日木曜日

OpenCVでOpticalFlowを試してみた 後半


結果の表示
  特徴点の数だけループをまわし、指定した特徴点が次フレームで移動したのかを判定する。

 判定方法は、獲得頂点に対応するstatusの値を調べ、その値が1ならば、newpointsに移動先と推定された座標が格納されることになる
 あと、対応するerrorの値をしらべ、想定した値以上の場合は、破棄するほうが結果はよいと思われるが、今回は調べていない

 有効であれば、pointsの位置に、サークルを表示し、pointsの位置から、newpointsの位置まで直線を描画する。


calcOpticalFlowPyrLKのパラメータに関して
 cv::Size(21,21)は、移動先の判定に使用すウィンドウサイズの大きさであり、大きくすると性能は上がるが計算量が増える
 21はデフォルトの値である。

 その後の3は、ピラミッドの階層数であり、大きいほど大きな移動に対応できるが、計算量が多くなる。
 0から指定するので、値が3の場合(デフォルト)は、元の大きさの画像に加えて、縮小サイズの画像を3枚作成し、それぞれ調べることになる。


 その後のパラメータは、変更してもそれほど結果に差異はないように思われる。

高速化
 OpenCV 2 Computer Vision Application Programming CookBookのサンプルでは、上記の有効と判定した移動先の座標が、想定した数以上であれば、その座標を次のフレームの特徴点として使用することで、次フレームでの特徴点の処理を省いている。

 今回は、有効な移動先座標に次フレームで検出した特徴点を加えて、calcOpticalFlowPyrLKを計算している。

OpenCV 2 Computer Vision Application Programming Cookbookは、kindle版が、安いのだが、残念ながら日本から買うと3800円でお買い得感はない


感想
 ・こちらがほしいと思われる場所のベクトルをほとんどら得ることはできない
 ・人物の場合、頭、手の先、足の先が特徴点として検出されやすいが、人の移動方向と、得られたベクトルの方向とを比較すると、頭 手 足 の順で相関がなくなっていく。結果、人の追跡はむつかしい
 

 サンプル画像だけでも、ほかにも多くの問題が見つかり、他の手法と組みあわせないと、役に立たないと思われる

2012年12月4日火曜日

OpenCVでOpticalFlowを試してみた


OpenCV2.4.3でLucas-Kanade法がサポートされているので試してみた

calcOpticalFlowPyrLKは、指定した特徴点集合に対してのみオプティカルフローを計算する仕様なので、事前に GoodFeaturesToTrackDetectorを用いて、特徴点集合を求めておく

特徴点集合は、以前は、GoodFeaturesToTrackで直接特徴点の座標を求められたが、2.4.3からは、Detectorオブジェクトを作成し、detect メソッドでkeypointを計算し、そこから特徴点の座標を取得する必要がある

std::vector<cv::KeyPoint>  keypoints;
std::vector<cv::Point2f>   points;

cv::GoodFeaturesToTrackDetector detector(100, 0.05, 3);
detector.detect(gray_prev, keypoints);

for( std::vector<cv::KeyPoint>::iterator itk = keypoints.begin(); itk != keypoints.end(); ++itk)
{
points.push_back(itk->pt);
}

注意
ひとつ前のフレーム画像の特徴点を求めておく


calcOpticalFlowPyrLKは、以下のように使用する

std::vector<cv::Point2f>   newpoints
std::vector<unsigned char>  status;
std::vector<float>              errors;

cv::calcOpticalFlowPyrLK(gray_prev, gray, points, newpoints, status, errors, cv::Size(21,21), 3, cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.05), 0);

newpointsには、前のフレームでの特徴点に対応する今のフレームでの座標が格納されている。

statusには、検出の成否が格納されている。statusが1の場合は、検出に成功

ただし、対応する移動先が見つからない場合もあり、座標点ごとに検出が成功したかどうかは、格納される。

errorsには、計算した時の誤差にあたる数値が格納されている



以前から提供されているAPIだが、2.4.3から入力に自分で作成したピラミッド画像を使用することができるらしいが、関数自身がピラミッド画像を作成する機能を有しているようなので、今回は、グレースケールの画像を入力とした。

後半に続く

2012年12月3日月曜日

OpenCVで特徴点を検出してみた


画像の特徴点を検出をためしてみた。まずは、GoodFeaturesToTrackDetectorを使用し、GPUサンプルの歩行者画像を試してみる。

方式の内容を理解していないので、関数をそのまま使用している。

引数に関して
 maxCornersは、検出される特徴点の最大数
 qualityLevelは、特徴量を計算した時の何らかの閾値と思われ、小さいと検出される特徴点が増える
  minDistanceは、特徴点間の最小距離をおもわれ、この値により結果がまびかれる。
 blockSizeは、不明


qualityLevel = 0.2


qualityLevel = 0.05


以上

2012年11月29日木曜日

OpenCV 2.4.3のHoughCirclesにバグがある

OpenCV 2.4.3 Windows版のHoughCirclesをデバッグモードで動かすと落ちる。
リリースモードでは、問題なく動くことを確認した。

2012年11月28日水曜日

OpenCV 2.4.3の新サンプル pca.cppを試してみた


新しいサンプルのpca(主成分分析)を試してみた。

テンプレートのプロジェクトに、元のソースをコピーして、ビルドすれば問題なくビルドできる。

説明文には、ATTの顔画像のデータを使用して試してみてねと書いてあるので、ATTのzip形式のデータをダウンロードして適当なフォルダーに展開する。

15の顔画像を使用してねとの記載に従い、15の顔データへのパスを書いたファイルを作成して、保存する。

Visual Studio のプロジェクトの、構成プロパティ、デバッグ、コマンド引数に上記ファイルのパスを設定して実行。

サンプルの初期値では、Retained Varianceが95%となっており、最初のデータの画像が再現される。



Varianceを小さくすると、平均顔となっていく。


注意:Varianceを0にするとプログラムが落ちるので、onTrackbarでpos = 0をはねたほうがよい

以上

2012年11月27日火曜日

OpenCV 2.4.3の新サンプル bgfg_gmg.cppを試してみた。


ソースをサンプルを動かす雛形にペーストしてビルドしてみたが、

    initModule_video();
  の関数がないことや、

    Ptr<BackgroundSubtractorGMG> fgbg = Algorithm::create<BackgroundSubtractorGMG>("BackgroundSubtractor.GMG");
  でオブジェクトを生成しても

    if (fgbg.empty())

    のところで引っかかり実行できない。

  opencv documentationでも、"BackgroundSubtractor.GMG"が見つからないので、サンプルプログラムは、残念ながらコードが不足していると思われる

2012年11月26日月曜日

OpenCV 2.4.3の新サンプル SimpleFlow.cppを試してみた


OpenCV 2.4.3のサンプルにsimleflowが存在していたので、ソースの中身を除いてみた。

Lucas Kanadeが1チャンネル(通常輝度信号)のみで処理をしているところ、3チャンネル使用している。

ファイルから画像を読み込み、フローを計算して入力画像に重ねて表示するプログラムを作成してみた。画像には、2.4.3のsamples\gpu\768x576.aviを使用している(人が道路を歩いている画像であるが、それほど品質はよくない)

第一印象は、計算が重い。最初PCがフリーズしたのかと思うくらい時間がかかった。

結果の画像を示す。




この画像輝度信号のみでoptical flowを求めると、動いていない場所に大量のベクトルが検出されるが、simple flowでは、動きのない部分にはベクトルは検出されない。

それでも、サンプルの結果には、道路の部分にもベクトルが生じている(これは元の画像に問題があるのではと思う)

APIの説明は、ここ。 元の論文へのリンクも掲載されており、2012年に発表された最新のものである。

以上

2012年11月22日木曜日

OpenCV 2.4.2と2.4.3のサンプルコードを比較してみた


インストールしてついでにC++のサンプルコードを比較してみた。
Winmergeでフォルダーの比較をしたところ、ほとんどのソースに差分が生じている

何かと思って確かめてみるとほとんどは、改行コードの違い
 2.4.2 windows
 2.4.3 Unix
と、不要なスペースの違いであるが、いくつかのソースは一部修正されている


また、2.4.3で増えたものは以下のものである

  bgfg_gmg.cpp
 fabmap_smple.cpp
  muluticascadeclassifire.cpp
  pca.cpp
  simpleflow_demo.cpp

である。どういうものかは後で覗いてみる。

tutorial_codeのフォルダー数は同じだが、中身まで確認していない。

サンプルの画像は、templ.pngが増えている。

以上

2012年11月21日水曜日

Windows7 64bit版にOpenCV 2.4.3の開発環境を構築した

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

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

 11/3にリリースされた2.4.3の環境を今頃構築した

1 ここからWindows版をダウンロードする

2 OpenCV-2.4.3.exeを実行しインストールディレクトリc:\を指定する

3 展開後、ディレクトリ名をopencvからopencv243に変更する

4 opencv2431フォルダーに binフォルダーの作成とlibフォルダーの作成

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

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

7 OSの環境変数の設定(要管理者権限)
  コントロールパネル、システムとセキュリティ、システムを開き
  システムの詳細設定の環境変数ボタンを押し
  システム環境変数のPathの編集
  末尾に";c:\opencv243\bin"を追加

8 Visual C++ 2010 Expressのパスの設定を行う
 この記事の242を243に置き換える

以上の作業は30分もかからない。また、今回からTBBのライブラリは不要となった。

2012年11月20日火曜日

OpenCVでIP Cameraの画像を表示してみた


IP Cameraとして、TENVIS JPT3815が安く入手できるので購入してみた。

最初にカメラの設定が必要であるが、サイトから専用アプリをダウンロードし、有線イーサで接続し
パスワードや無線LANの設定を行った。


OpenCVでは、VideoCaptureのopenにURLを指定すれば、ストリームを再生できるはずである。

JPT3815のマニュアルでは、ストリーム出力がmjpegであったが、OpenCV 2.4.2のVideoCaptureでは、mjpegを解釈できないようで落ちてしまう。

mjepgのURLは、以下のようになる。

http://IPADDRESS/videostream.cgi?user=[USERNAME]&pwd=[PASSWORD]&resolution=32&rate=0


そこでだめもとでH264を指定したところ、表示することができた。

http://IPADDRESS/videostream.asf?user=[USERNAME]&pwd=[PASSWORD]&resolution=32&rate=0


ユーザ名と、パスワードが平文なのがあれだが、以下のコードでVGAサイズで表示できる。

std::string fname = std::string("http://192.168.1.100/videostream.asf?user=hoge&pwd=hoge&resolution=32&rate=0");

mCap.open(fname);

while(true) {

 mCap >> mat;

 cv::imshow("Capture", mat);

  cv::waitKey(15);
}

今後IRモードで遊んでみる。

2012年11月9日金曜日

OpenCV2.4.3のチュートリアルが提供されていた


11/3の2.4.3のリリースにあわせて、チュートリアルのpdfがリリースされていた
403ページと非常に読み応えのあるものとなっている。

各章のタイトルを紹介しておく

1 OpenCVの紹介
2 core module
3 Image Processing
4 GUI
5 カメラのキャリブレーションと3D再構成
6 2D Feture
7 動画解析
8 物体検出
9 機械学習
10 GPU の利用
11 コントリビューション
12 iOS上での開発

Kinddle whiteがとどいたら入れてみる予定


追加
1章をざっと眺めてみた 
各種環境構築に97ページも割いている。
あと、1章の最後にチュートリアルを書いてコミュニティに貢献しようとの記述が


2012年11月8日木曜日

Tegra向けSDKにOpenCV2.4.2が含まれている


試す時間がないが、忘れないようにメモ

10/31に TADP(Tegra Android Development Pack)2.0がリリースされた
中のOpenCVは、OpenCV.orgが提供しているものと同じと推測されるが、開発環境一式が準備されており、またドキュメントなどもあるようだ

ダウンロードには、Tegra開発者の登録が必要である(無料

2012年10月30日火曜日

OpenCVのVideoWriterに関してのメモ


Windows版 OpenCVのVideoWriterに関してのメモ

フォーマットに関して
 CV_FOURCC('X','V','I','D') XVID  MPEG-4 ASP (Advanced Simple Profile)に準拠
 CV_FOURCC('M','J','P','G') モーションJPG
 CV_FOURCC('D','I','B',' ') 無圧縮


白黒での保存(Windowsのみ)
 VideoWriter::VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true)
 isColor をfalseに

 これに気づかず、以前白黒画像を一旦3chに変換して保存していた。

仕様orBug
 frameSizeより保存するMatのサイズが大きい場合、自動でスケーリングされる

2012年10月26日金曜日

OpenCV 2.4.3 RCがリリースされた


2.4.3のリリース予定が11/1日だったが、RC版が昨日リリースされた。
概略を以下に訳してみた。詳細は、ここで確認して

・従来の並列化のアルゴリズムが、新しいものに置き換わったとのこと
 TBBをインストールすることなく、パフォーマンスが向上するとのこと

・別エントリーにも書いたが、Android向けのフレームワークを改良
 カメラのサポートも増やした。 詳細は、OpenCV4Android Release Notesを

・iOS6向けのフレームワーク
  face detection, bilateral filter等のいくつかの重要なアルゴリズムは、スレッディングのおかげでA5以降のチップで高速化された
  バグも修正し、-O3の最適化がきくようになった。
  OpenCV iOSのチュートリアルもできた

・pythonのサンプル
  ASIFT, hand-written digit recognition, motion debluringなどのサンプルを追加

・2つの新規cascade辞書
 silverware and profile facesの辞書を追加

・"simple flow" optical flow algorithmの追加
 calcOpticalFlowSF が追加されているようだ

・CUDA対応

・OpenCL
 Technology-preview version

・バグ対応
 2.4.2から約130の修正

・github
  最新版は、ここからpullして

Android向けOpenCVアプリが更新された


2.4.3リリースに合わせての動きかもしれないが、Android向けOpenCV Managerが更新された。
機能追加を期待していたが、変更点はUIのバグ修正となっている。

あわせて、OpenCV Face DetectionのデモアプリとTegra 3 devices用デモアプリがリリースされている。

2012年10月24日水曜日

OpenCVのチュートリアルに関して調べてみた


本家のページにチュートリアルが掲載されている。
残念ながら代表的なすべての機能に関して、チュートリアルは、準備されてはいない。

以下に各章の概要を記す。
  量が多いので、古典的な画像処理まで

Introduction to OpenCV (概要)

  •  OpenCVの開発環境に関して
  •   Linux, Windows, Android, Mac


core module. The Core Functionality (基本関数)

  •  Matに関して
  •  画素へのアクセス
  •  フィルタ計算
  •  合成
  •  コントラスト
  •  グラフィックス
  •  文字描画
  •  離散フーリエ変換
  •  XMLファイル入出力
  •  互換性


imgproc module. Image Processing (イメージ処理)

  •  ぼかし
  •  膨張と収縮
  •  Morphological変換
  •  拡大と縮小
  •  閾値処理
  •  線形フィルター処理
  •  境界処理
  •  ソーベルフィルター
  •  ラプラシアンフィルター、
  •  キャニーエッジ
  •  ハフ直線検出
  •  ハフ円検出
  •  反転
  •  アフィン変換
  •  ヒストグラムの均等化
  •  ヒストグラム計算
  •  ヒストグラム比較
  •  バックプロジェクション
  •  テンプレートマッチング
  •  輪郭検出
  •  外接多角形
  •  外接四角形と外接円
  •  最小領域と最小楕円
  •  モーメント
  •  点と輪郭の関係


highgui module. High Level GUI and Media (GUIとメディア)

  •  トラックバー
  •  ビデオファイル(カメラ)からの読み出し(+画像の類似性の話)
  •  videoWriteHighGuiは、エントリーのみで文章がない(10/24)


to be continued

2012年10月23日火曜日

OpenCVの計算結果をファイルに書き込む

画像処理した結果や中間の値をファイルに保存するには、下記のようにする


2012年10月18日木曜日

OpenCVでcv::Matの平均を求める


画像の輝度値の平均を求める場合、各要素にアクセスし、輝度値の合計を求め、画素数でわれば輝度値の平均を求めることができる。
この場合、列と行でループをまわして、各要素へのアクセスをおこうなことになる。

OpenCVでは、平均を求める便利な関数cv::reduceが準備されている

C++: void reduce(InputArray src, OutputArray dst, int dim, int rtype, int dtype=-1 )

この関数では、1次元の方向しか処理を行わない
dim = 0 の場合、行方向に処理が行われ、列のみとなる
dim = 1 の場合、列方向に処理が行われ、行のみとなる

  rtypeは、処理の種類で下記のパラメータを指定する
CV_REDUCE_SUM 合計
CV_REDUCE_AVG 平均
CV_REDUCE_MAX 最大値
CV_REDUCE_MIN 最小値


画面全体の平均値を求めには、2回処理を繰り返せばよい。


ただし、縮退後のmatのタイプも自動的に入力のタイプに合せられるため、ucharのデータを使用すると結果もucharとなる

画像認識のセミナーを調べてみた 2


今後3ヶ月以内に開催される画像認識に関連するセミナーを調べてみた
10月11月は、前回メモがメインで、下記はその後に見つけたものである。
原則有料であるが、一部無料のものもある。


“Lytro”で理解するライト・フィールド・カメラの全貌
http://techon.nikkeibp.co.jp/article/SEMINAR/20120904/237726/
2012年10月26日(金)

FPGA画像処理を自ら構築する(受講無料)
http://www.avaldata.co.jp/support/seminar/54/201207/seminar_201211.html
2012年11月16日(金)

国際画像セミナー(聴講無料)
http://www.adcom-media.co.jp/ite/seminar/
2012年12月5日-8日

入門 動画像認識/解析/処理~特徴抽出と判定アルゴリズム
http://www.catnet.ne.jp/triceps/sem/s121211a1.html
2012年12月11日(火)

デジタル画像処理の基礎とノイズ除去・符号化・抽出法 ~PC演習付~
http://www.j-techno.co.jp/test/eisei_P.cgi?mode=sem&unit=2012121301
2012年12月13日 (木)

GPGPUプログラミングの基礎と画像処理の高速化実践講座 ~1人1台PC実習付~
http://www.j-techno.co.jp/test/eisei_P.cgi?mode=sem&unit=2012121900
2012年12月19日 (水)

画像局所特徴量と統計的学習手法の組み合わせによる物体認識
http://www.catnet.ne.jp/triceps/sem/s130129a.html
2013年1月29日(火)

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


Visual C++ 2010 Expressは、64bitのプロジェクトを作成できないので、OpenCVの32bit版を使用し、32bitのプロジェクトを作成するのであれば、以前のWindows7 32bit版の構築方法と同じ手順でできる
Visual C++ 2010 Express へのパスの設定含めて1時間もかからない

2012年10月16日火曜日

OpenCVでオリジナルと処理結果をあわせて保存する



OpenCVの処理がどのようなものであるかわかりやすくするために、オリジナルの画像と処理画像を水平方向に連結してファイルに出力する

 連結は、
cv::hconcat(matOrg, matRes, matOut);

 で水平方向画像を作成し、横サイズ2倍でopenしたVideoWriteに出力すればよい

 ただし、matOrgとmatResのフォーマットは同じにしないとOpenCVが落ちる

2012年10月15日月曜日

OpenCV NativeViewerのインストールを試みた


NativeViewerは、OpenCVのMat変数の中身をデバッグ中に画像として表示できる拡張機能であるということを知ったので早速インストールを試みたが残念ながら

Visual Studio 2010のみしかサポートされていない。

ExpressEditionの拡張機能マネージャからオンラインでインストールできるのではないかと、考えたが残念ながら検索には引っかからなかった。(右上の検索窓を使用)




NativeViewer_v0.12.vsixをダウンロードしても、サポートされていないとのメッセージが表示されだめである。

今後サポートされることを期待しよう。

11/22 追記
11月10日にVer1.0がリリースされている。ここからダウンロード

2012年10月10日水曜日

OpenCV用にコモンコントロールのTextBoxに入力された文字列を数字として取得する


OpenCVでGUIから閾値を指定した場合がある。
その場合、GUIのTextBoxの文字列をfloat等に変換する必要がある。

TextBoxの型は、system::stringであり、これをstd::stringに変換する場合は、若干手間が必要であった。

一方、floatへの変換は、下記の方法でできる。

float f = float::Parse(this->textBox1->Text);

本来は、数字以外の入力がエラーになるためtry catchなどのエラー処理が必要であるが、自分用なので手を抜いている。


2012年10月2日火曜日

PlayStation Eyeのドライバーがエラーメッセージを表示した

PlayStation Eyeのカメラ画像を記録しようと自作アプリを起動したところ、下記の画面が表示され一瞬壊れたのかとあせった。



原因は、USBケーブルをPCにつないでいないだけだった。ケーブルをさしてアプリを立ち上げたところ無事カメラ画像が表示された。

しかし、USBケーブルをさしていないのにドライバーが動いているようで不気味である。

2012 CEATECでの画像認識関連をまとめてみた


本日から6日まで幕張でCEATECが開催されている

数は少ないが、インターネットのニュースから画像認識関連をまとめてみた


トヨタが「CEATEC」に初出展、超小型EV「Smart INSECT」を披露
http://monoist.atmarkit.co.jp/mn/articles/1209/28/news024.html

ドコモ 視線で操作できるタブレット「ibeam」に注目
http://news.mynavi.jp/articles/2012/10/01/ceatec01/

富士通 小型カメラとLEDを用いたPCに内蔵可能な視線検出技術
http://pr.fujitsu.com/jp/news/2012/10/2-1.html

STANLEYでジェスチャーコントロールを体験してきた
http://www.gizmodo.jp/2012/10/_ceatec_stanley.html

2012年10月1日月曜日

OpenCVでVGAサイズの画像を30fpsで2枚リアルタイムに表示する


カメラからの入力画像と処理結果の画像の2枚を、VGAサイズでリアルタイム(30fps)に表示しようと試みたが、なぜか片方の表示がたまにつまった状態になった

オリジナルプログラムの抜粋

while(true) {
  cap >> mat;
  cv::imshow("org,mat);

  cv::Mat res = hoge(mat);
  cv::imshow("hoge",res);

  cv::waitKey(10);
}

CPUの負荷は25%ぐらいで余裕のはずである。


いくつか要因を考え試行錯誤を試みた結果、

  cv::waitKey(30);

に変更することで表示されるようになったと思われる。
30は、暫定値であり、下記に示すように本来まじめに考える必要がある。


どうやらwaitKeyの時間で、フレームバッファに書き込みをしており、この時間が短いためつまった状態(こま落ちした)になったと推測される。


30fpsを確保するには、1フレームの処理時間(while内の処理)を33msec内にする必要がある。

理想は、画像処理の時間+waitKey = 33msecであるが、この値が小さくても、OpenCVのカメラ入力処理で30fpsに調整されるため表示がおかしくなることはなさそうである

一方大きい場合は、たとえば、waitKey(500)で試してみると、極端なこま落ち状態になった。

以上

2012年9月28日金曜日

OpenCV向けのhand検出用のhaarcascade xmlファイル


以下の人が親切にも公開してくれている

Mr. Markou ここから取得できる。

 無地の背景で、グー、指1本、2本(ちょき)、3本、4本、5本(パー)を検出できる
 当たり前だが、5本の本が検出率はよい
 (形状により辞書を分けずに1つにまとめている)


Haarlikeに手自体が向いていないと思われるため、性能に関しては期待しないほうがよいだろう

2012年9月27日木曜日

OpenCVでコマンドラインの引数を取得する


Visual C++ 2010 Expressでデフォルトのコマンドラインプロジェクトを作成するとメイン関数の引数がUNICODE(設定に依存)となっておりメイン関数での引数の受け取りがややこしくなる。

int _tmain(int argc, _TCHAR* argv[])


そこで、反則的であるが簡単に済ませるのであれば、自分で
int _main(int argc, char* argv[])
に書き換えると処理が簡単になる


ファイル名など文字列の取得
std::string path;

if (argc > 2) {
  path = std::string(argv[2]);

閾値などのintの取得
int th;

if (argc > 2) {
  std::stringstream ss;
  ss << argv[2];
  ss >> offAngle;

と簡単になる。

ただし、上記の例でargv[2]と書いているが、引数の順番は、argv[]のindexと対応するため注意が必要である。

以上

2012年9月21日金曜日

OpenCVでビデオファイルの情報を取得する


VideoCapture::getに以下の引数を与えることで情報を取得できる

  •  CV_CAP_PROP_POS_MSEC ビデオの経過時間 msec
  •  CV_CAP_PROP_POS_FRAMES 0ベースのフレーム番号
  •  CV_CAP_PROP_POS_AVI_RATIO 相対位置 0 開始 1 終了
  •  CV_CAP_PROP_FPS フレームレート
  •  CV_CAP_PROP_FOURCC  コーデックを示す4文字識別子
  •  CV_CAP_PROP_FRAME_COUNT 総フレーム数
  •  CV_CAP_PROP_FORMAT retrieve() で得られるMatのフォーマット
  •  CV_CAP_PROP_MODE ?

2012年9月15日土曜日

OpenCVのアプリをVisual Studio Express 2012 for Windows Desktopで作成してみた


Visual Studio Express 2012 for Windows Desktopがリリースされたのでここからダウンロードしてインストールした。
登録はしなくても30日は利用できるが、早速登録した。

今回は、VB,C#,C++のプロジェクトを扱うことができる。

画面の印象が、大きく変わり、個人的にはチープな印象をうける。


2010

2012



プロジェクトを、新規に作成し、includeのpathだけ設定し、2010のソースをそのまま貼り付け、ビルドしたらあっさり動いた。
どうやらライブラリのパスの設定を引き継いでいるようだ。

カメラのFPSを表示するプログラムを試したがあっさり動いた。

2012年9月10日月曜日

コマンドラインの引数をファイル名として取得する


インテリセンスが使えないので、フォーム形式の開発は効率が悪い。
そこでファイル名の選択のみGUIで行い、コマンドラインのアプリを呼び出す方式を試してみる。

まずは、引数の扱いに関してメモしておく。



セキュリティの警告が出るが気にしないでおく

2012年9月4日火曜日

Visual Studio 2010 ExpressのC++/CLIではIntelliSenseが効かない


OpenCVをForm形式のプロジェクトで作成する場合の一番の問題はこれ。

Intellisenseとは、入力支援機能の1つであり、クラスがどのようなメソッドが持つのか、メソッドの引数は何なのかを表示してくれるなくてはならない機能であるが、Visual Studio 2010 ExpressのC++/CLIでは、使えなくなってしまった

いまさら2008をインストールするのもWindowsが正しく動作するのかの不安もある

Google先生で調べてみると、多くの人が困っている様子。

いろいろな対策がかかれているが、筆者は、OpenCVに関連するところは、コマンドラインのプロジェクトで作成し動作確認を行い、GUIの部分だけ、模索しながら作成し、後で組み合わせることで対処している。

OpenCVにファイルダイアログを使用してファイル名を与える


OpenCVとC++/CLIを組み合わせることで、OpenCVに渡すファイル名や、パラメータなどGUIで設定できるようになる反面、.netオブジェクトを扱うため、いろいろ複雑になる場合もある。

本エントリーでは、ファイルダイアログにより、ファイル名の選択を行う。

プロジェクトの作成は、このエントリーを参照

1 オブジェクトの作成

 コモンコントロールは、.netオブジェクトのため、newではなくgcnewでインスタンスを作ることになる
説明によると、戻り値はポインタではなくハンドルとのこと。

またオブジェクトは、*ではなく、^で宣言する必要がある

  ファイルオープン用のダイアログは、以下のように作成

System::Windows::Forms::OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;

2 ファイル名の取得

 newと同じ -> でアクセスする。ついでにSystem::Stringからstd::stringへの変換をしているが、日本語の確認はしていないので注意。

宣言部に

using namespace System::Runtime::InteropServices;

を追加することを忘れずに

OpenCVでカメラ画像を60fpsでファイルに書き出す


Playstation Eyeの60fpsで入力した画像を、60fpsでファイルに記録するには、VideoWriteをOpenする場合に、fpsに60を設定し、whileのループ内でキャプチャした画像をwriterに書き出せばよい

また、カメラのfpsと記録のfpsを異なる値にすると、プレーヤで再生される速度を、変化させることができる

2012年8月31日金曜日

WindowsのOpenCVでは、65fpsが取り込み限界である (2)


65fpsに上限があるのは、OS依存の問題と推測している。

1つの仮説だが、windowsのタイマーの精度が、15.625msなので、この間隔で画像が取り込まれるとすると1 / 0.015625 = 64となり、計測値の65に非常に近くなる。

120fps等で取り込みを行いたい場合は、さらにクロックの精度を確保できるDirectXで自分で取り込みルーチンを書く必要があると思われる。

2012年8月28日火曜日

std::stringをchar*に変換する


文字列の扱いは、std::stringのほうが簡単であるが、時折char*への変換が必要な場合がある。

本エントリーには、std::stringの文字列を、cのchar* に変換する方法を記す

std::string file = "c:\\hoge.jpg";
int len = file.length();
char* fname = new char[len+1];
memcpy(fname, file.c_str(), len+1);

以上

OpenCV用にコモンコントロールのTextBoxに入力された文字列を取得する

WindowsのForm形式では、GUIでパラメータを設定できるようになるメリットがある一方、Windowsのオブジェクトと、標準C++のオブジェクトやCの型の変換など、余分な処理が発生する

本エントリーには、TextBoxに入力された文字列をcのwchar_t に変換する方法を記す

Form1.h
namespaceの宣言の後に
using namespace System::Runtime::InteropServices;
を追加

コモンコントロールのボタンの押下イベントで
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {

System::String ^p = this->textBox1->Text;
wchar_t *wt = (wchar_t*)Marshal::StringToBSTR(p).ToPointer();

でTextBoxに入力された文字をwchar_tとして取得できる

OpenCV用にGUI付き(フォーム形式)のプロジェクトを作成する

通常Windowsでは、コマンドライン形式でプロジェクトを作成する。

一方、WindowsのForm形式では、ラジオボタンやファイル選択のダイアログを使用できるというメリットがあるが手順が少し複雑となるので、以下に手順をまとめてみた

1プロジェクトの作成
 ファイル-新規作成-プロジェクト
 CLR-Windows formアプリを選択して、プロジェクト名を入力しOKボタンを押す

2プロジェクトの設定
 プロジェクト名を選択し、右クリックでプロパティを指示

 左上の構成メニューで、すべての構成を選択

 構成プロパティの共通言語ランタイムサポートを /clrに
 C/C++の追加インクルードフォルダーにOpenCVのincludeファイルのpathを追加

3フォームの設定
 フォームをダブルクリックすると、FormLoad eventが作成されコードが表示される

 フォームデザインを選択しプロパティで、
  FormBorderStyleをFixedStyleに
  MaxsizeBoxを Falseに
  好みでTextをアプリ名に修正

4自分のクラスを追加する場合
 プロジェクト名を選択し、右クリックで、追加-クラスを指示
 クラスを選択し、追加ボタンを押す
 クラス名(例 myOpenCV)を入力し、マネージのチェックをはずし、完了ボタンを押す

 myOpenCV.hファイルが開くので、先頭に
#include <opencv2/opencv.hpp>を追加

 次にmyOpenCV.cppファイルを開き先頭にライブラリ追加

#ifdef _DEBUG
//Debugモードの場合
#pragma comment(lib,"opencv_core231d.lib")
#pragma comment(lib,"opencv_imgproc231d.lib")
#pragma comment(lib,"opencv_highgui231d.lib")
#pragma comment(lib,"opencv_video231d.lib")
#else
//Releaseモードの場合
#pragma comment(lib,"opencv_core231.lib")
#pragma comment(lib,"opencv_imgproc231.lib")
#pragma comment(lib,"opencv_highgui231.lib")
#pragma comment(lib,"opencv_video231.lib")
#endif

5フォームに自分のクラスを追加
 Form1.hに自分のクラスのmyOpenCV.hを#includeで追加

 Form1.hの必要なデザイナー変数の前に、自分のクラスのオブジェクトを追加

 protected:
myOpenCV* openCV;

6 自分のクラスを実体化
 FormLoadイベント内に
openCV = new OpenCV();
 を追加
 デストラクタは不要のようである

7 以下自分のクラスにOpenCVでしたいことを追加

以上

2012年8月22日水曜日

WindowsのOpenCVでは、65fpsが取り込み限界である


PlayStation Eyeの取り込み速度は、公証

  • VGA 60fps
  • QVGA 120fps

であるが、netで調べてみると、

  • VGA 75fps
  • QVGA 125fps

とのこと

mCap.set(CV_CAP_PROP_FPS, 125);
mCap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
mCap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);


で試したところ、こちらもVGA同様に65fpsとなった。

サンプル画像を載せておく。


PlayStation Eyeの画像を75fpsで取り込みを試みた。


とあるブログにPlayStation EyeでVGAサイズで75fpsで取り込めるとの記載があったので、
mCap.set(CV_CAP_PROP_FPS, 75);
で試してみたが、残念ながら65fpsしか取り込みができなかった。

75fpsの設定で撮影した画像を載せておく。



このサンプルでは問題ないが、照明を暗くすると、カメラ固有のパターンノイズが現れていまう。
同じ照明条件でも60fpsの設定では、パターンノイズは現れない。

2012年8月20日月曜日

PlayStation Eyeの画像を60fpsで取り込んでみた。


PlayStation Eyeで、mCap.get(CV_CAP_PROP_FPS)の戻り値が0のためフレームレート変更機能をサポートしていないように思えたので、60fpsにフレームレートが変更できるか試してみた。

前の記事に書いたように、初期設定で
mCap.set(CV_CAP_PROP_FPS, 60);
を行うことで60fpsで取り込めることを確認できた。

ただし、カメラ内臓のノートPCで試したところ、カメラのデバイス番号が0でなく、2だった。
デバイス番号の件は、Windowsの認識している順番に依存しているように思われる。

22日追加
60fpsで取り込んだサンプル画像を載せておく。乱雑な室内を写さないために、手元のダンボールで覆いをしている。


OpenCVで、fpsのレートを画面に表示させた


PS3のEyeCameraが60fpsで画像を取り込めるか調べるために、画面にfpsの値を表示させるコードを作成した。

以下にソースを示す。表示するコードの量を減らすために。ヘッダーやライブラリの宣言を省き、エラー処理も省いている

int _tmain(int argc, _TCHAR* argv[])
{
 cv::VideoCapture mCap;     // camera device
 cv::Mat mat;

 int cnt = 0;    // frame数
 int oldcnt = 0;    // 前フレーム数
 int64 nowTime = 0;   // 現時刻
 int64 diffTime = 0;   // 経過時間

 int fps = 0;    // 1秒のフレーム数
 const double f = (1000 /cv::getTickFrequency());

 mCap.open(0);
 mCap.set(CV_CAP_PROP_FPS, 60);
 mCap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
 mCap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);

 cv::Point point(2,28);

 int64 startTime = cv::getTickCount();
 while(1) {
  mCap >> mat;

  nowTime = cv::getTickCount();  
  diffTime = (int)((nowTime- startTime)*f);

  if (diffTime >= 1000) {
   startTime = nowTime;
   fps = cnt - oldcnt;
   oldcnt = cnt;
  }

  std::ostringstream os;
  os << fps;
  std::string number = os.str();

  cv::putText(mat, number, point, cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0,0,200), 2, CV_AA);

  cv::imshow("image", mat);

  int key = cv::waitKey(10);

  if (key == 'q') {
   break;
  }
  cnt++;
 }

 return 0;
}

手持ちのカメラで調べてみたら、26fpsしかでないものもいた。
あとで、EyeCameraも試してみる

Syntax Highlighterとの相性が悪いので、乗り換えを考える。

22日補足
時間の条件式に等号が抜けていたので修正

2012年8月12日日曜日

OpenCV上での、PlayStation Eyeの仕様を調べてみた


カメラが使えるようになったので、前回作成したカメラの仕様を調べるテストツールで仕様をみてみた。



FPSの設定をサポートしていないようだが、60FPSの取り込み方法を今後継続調査する。

PlayStation Eyeのドライバーをインストールした


60FPSのカメラを探していたらPlayStation Eyeを見つけたので、早速Amazonで購入し、OpenCVで使用できるか試してみた。


注意:ドライバーをインストールするまでは、本体をPCに接続しないこと

ドライバーは、ここからdownloadすればよい(右でも左でも同じCL-Eye-Driver-5.1.1.0177.exeとなる 8/11時点)

あとは、画面に従いドライバーをインストールすればよい。インストールが終わると、デスクトップにCL-Eye Testのショートカットができる

次に本体を、PCに接続し、PCがPlayStation Eyeを認識したら、CL-Eye Testを起動し、画像が表示できるか確認すればよい

ただし、他にカメラを接続していると、そのカメラを使用する可能性があるので、メニューのDevicesでPS3 Eye Cameraが選択されたいうことを確認すること。

2012年8月10日金曜日

画像認識のセミナーを調べてみた


今後3ヶ月以内に開催される画像認識に関連するセミナーを調べてみた
いずれも有料である。

画像処理の基礎を固め,SIFT等の抽出アルゴリズムとその実装を理解しよう!
http://www.catnet.ne.jp/triceps/sem/s120824a.html
2012年8月24日(金)

入門 TOF距離画像処理技術
http://www.catnet.ne.jp/triceps/sem/s120828a.html
2012年8月28日(火)

画像処理の基礎と劣化画像復元・画像の鮮明化 ~1人1台PC実習付~
http://www.j-techno.co.jp/test/eisei_P.cgi?mode=sem&unit=2012082801
2012年 8月28日 (火)

パターン認識・検索技術の基礎と応用~映像・画像の認識や高速探索法
http://www.catnet.ne.jp/triceps/sem/s120907a.html
2012年 9月7日(金)

OpenCV活用・画像処理アルゴリズムの基礎と応用技術 ~1人1台PC実習付~
http://www.j-techno.co.jp/test/eisei_P.cgi?mode=sem&unit=2012091001
2012年 9月10日 (月) 9月11日 (火)

物体認識技術の基礎とアプリケーション展開へのテクニック
http://techon.nikkeibp.co.jp/article/SEMINAR/20120719/229176/
2012年 09月18日(火)

パターン認識の基礎とサポートベクトルマシン(SVM)の活用 ~1人1台PC実習付~
http://www.j-techno.co.jp/test/index.cgi?mode=sem&unit=2012092801
2012年 9月28日

画像認識の新技術:HLAC(高次局所自己相関)とその応用
http://www.catnet.ne.jp/triceps/sem/s121003a.html
2012年10月3日(水)

画像処理による自動化システム構築技術
http://www.chubu-center.ac.jp/semi/semi2012/guide_html/E706.html
2012年 10/10,11,12

画像処理におけるノイズ除去の基礎とMATLABを用いた実践的活用~1人1台PC実習付~
http://www.j-techno.co.jp/test/eisei_P.cgi?mode=sem&unit=2012101100
2012年 10月11日 (木)

人物画像センシング技術の基礎と応用
http://www.catnet.ne.jp/triceps/sem/s121012a.html
2012年10月12日(金)

画像認識のための機械学習入門
http://www.catnet.ne.jp/triceps/sem/s121017a.html
2012年 10月17日(水)

オープンソースによる画像処理・認識プログラム開発
http://www.chubu-center.ac.jp/semi/semi2012/guide_html/E409.html
2012年 11/ 7, 8, 9

物体追跡(Object Tracking)技術の基礎と今後の動向
http://www.catnet.ne.jp/triceps/sem/s121113a.html
2012年11月13日(火)

ステレオカメラにおける画像認識技術とその応用 ~デモ付~
http://www.j-techno.co.jp/test/eisei_P.cgi?mode=sem&unit=2012112903
2012年 11月29日(木)

OpenCVでカメラ情報を取得してみた

OpenCVでカメラ情報が取れるということなので試してみたが、残念ながら手元のカメラは、幅と高さの情報しか値を返さなかった。
サポートしていない場合は、戻り値は0となる。

コードは、以下のものであるが、インクルードやライブラリの部分は省いている。
また、Windowsで実行すると結果をみることができないので、最後の行(return 0)にブレークポイントを設定する必要がある。

2012年8月8日水曜日

OpenCVでカラー画像から白黒3chの画像を作成する


わけあって白黒3chの画像が必要にあったので、OpenCVで作成してみた。

単純に白黒に変換するだけなら

 cv::Mat gray = cv::imread("c:\\data\\hoge.jpg", CV_LOAD_IMAGE_GRAYSCALE);

あるいは、

 cv::cvtColor(color, gray, CV_BGR2GRAY);

でできるが、この場合は1chとなる。

3ch白黒画像の作成は、以下のようにする。
マニアックなので、ほかに必要がある人はいないだろう

2012年8月7日火曜日

ソースコードの表示のテストをしてみた

ソースコードを表示させるテストをしてみる。

Syntax Highlighterのウィジェットを使用するのがよいので採用を試みるが、Bloggerとの相性が非常に悪いとのこと。このページを参考に導入を試みてみた。

以下のソースは、あるプログラムの一部分なので、このままでは動作しない。


int _tmain(int argc, _TCHAR* argv[])
{
 cv::Mat mat = cv::imread("c:\\opencv231\\samples\\cpp\\image\\lena.jpg");

 cv::namedWindow("image");
 cv::setMouseCallback("image", onMouse);

 while (true) {
  matDisp = mat.clone();

  if( rectState == IN_PROCESS || rectState == SET ) {
   rectangle( matDisp, cv::Point( rect.x, rect.y ), cv::Point(rect.x + rect.width, rect.y + rect.height ), GREEN, 2);
  }

  cv::imshow("image", matDisp);

  int key = cv::waitKey(10);

  if (key == 'q') {
   return 0;
  }
 }

 return 0;
}
行の表示がうまくいかず、無駄なスペースが表示される。どうやら解決できない問題のようだ。

2012年8月6日月曜日

Visual C++ 2010 ExpressにOpenCVのディレクトリを設定した

設定方法の修正版


毎回プロジェクトにincludeパスを設定したり、ソースのパスを修正するのも手間がかかるのでVisual C++ 2010 ExpressにOpenCVのディレクトリを設定した。

本説明では、設定に示した構成を例にしているので、自分の環境にあわせて読み替えてほしい。

設定用のファイルは、Windows7の場合、
C:\Users\ユーザ名\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props
である。

通常デフォルトでは、
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
</Project>
となっているので、

以下のようにディレクトリを追加する

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <PropertyGroup>
 <IncludePath>$(IncludePath);C:\opencv242\build\include</IncludePath>
 </PropertyGroup>
 <PropertyGroup>
 <LibraryPath>$(LibraryPath);C:\opencv242\lib</LibraryPath>
 </PropertyGroup>
</Project>


保存した後、Visual C++ 2010 Expressを起動して、コンソールプロジェクトを作成し

#include "stdafx.h"
#include <opencv2/opencv.hpp>

#ifdef _DEBUG
//Debugモードの場合
#pragma comment(lib,"opencv_core242d.lib")
#pragma comment(lib,"opencv_imgproc242 d.lib")
#pragma comment(lib,"opencv_highgui242 d.lib")
#pragma comment(lib,"opencv_video242 d.lib")
#else
//Releaseモードの場合
#pragma comment(lib,"opencv_core242 1.lib")
#pragma comment(lib,"opencv_imgproc242 1.lib")
#pragma comment(lib,"opencv_highgui242 .lib")
#pragma comment(lib,"opencv_video242 .lib")
#endif

int _tmain(int argc, _TCHAR* argv[])
{
cv::Mat mat = cv::imread("画像データ");
cv::imshow("k", mat);

cv::waitKey(0);
return 0;
}
など打ち込んでみてビルドができるか確認する。

2012年8月2日木曜日

OpenCV 背景差分のサンプルを動かしてみた


samples/cpp/bgfg_segm.cppを前の記事に従い動かしてみる

実験用の画像は、http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.3.1/から
OpenCV-2.3.2-GPU-demos-pack.exeをダウンロードし、展開する。

展開したフォルダー OpenCV-2.3.2-GPU-demos-pack\data\pedestrian_detect
のmitsubishi.aviを使用した。


検出結果は、以下のようになる。




sampleで使用しているクラスは、BackgroundSubtractorMOG2である。


以上

2012年7月30日月曜日

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


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

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

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

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

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

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

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

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

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


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

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

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

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


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


追加されたサンプル

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


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

  • rgbdodometry


追加されたマテリアル

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


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

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

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


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



231 sample



242 smple

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

2012年7月27日金曜日

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


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

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

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


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


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

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

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

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

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

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

 比較し、一致情報を取得

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



以上

OpenCV 2.4.2でSURFを使うために


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


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

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

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




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

SurfFeatureDetector detector(50);
SurfDescriptorExtractor extractor;

以上

2012年7月10日火曜日

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


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

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

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

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


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


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


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


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

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

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

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


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

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

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

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

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

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

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


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

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


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

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

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

以上

2012年7月6日金曜日

LibSVMを使用してみた


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

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

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

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


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


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

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

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

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

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

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


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

out:
res.txt 判定結果