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で取り込んだサンプル画像を載せておく。乱雑な室内を写さないために、手元のダンボールで覆いをしている。