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である。


以上