Windows向けのキャプチャライブラリNyWin32Capture/1.0.0をリリースします。
http://nyatla.jp/nyartoolkit/wp/?page_id=361
この手のライブラリは他にもありますが、妙に複雑だったり、コンパイルが難しかったり、何かのおまけだったりするので、シンプルなのをコンセプトに作りました。
特徴は、以下の通りです。
- C++インタフェイス。
- 使い方が簡単
- 同期/非同期キャプチャ両方OK
- Windows PSDK 7.1対応 ←new
同梱サンプル
サンプルプログラムは2つ入っています。GUI制御にMFCを使ったので、ちょっとややこしい。
- NyWin32CaptureTest – 1個のカメラから画像を取得して、ビットマップにしてウインドウに描画するプログラム。
- NyWin32CaptureTest – 複数のカメラから画像を取得して、ビットマップにしてウインドウに描画するプログラム。(何台でも接続できるはずだけど、2台までしかテストしてない。)
サンプル
同梱サンプルはMFCの辺りがややこしいので、純粋にキャプチャするだけのコードを用意しました。
同期取得(任意タイミングで画像を取得する)
#include "NyWin32Capture.h" using namespace NyWin32Capture; void main(void) { CoInitialize(NULL); { CaptureDeviceList cap_list; //キャプチャデバイスのリストから0番目のカメラを得る。 int nod=cap_list.getNumberOfDevice(); if(nod<1){ throw std::exception( "This computer has not Capture device."); } //0番目のカメラをあける。 CaptureDevice* d=cap_list.getDevice(0); d->openDevice(); //インテリジェント接続を使ってキャプチャフォーマットを設定 // QVGAの24BIT RGB if(!d->setVideoFormat(320,240,MEDIASUBTYPE_RGB24,30.0)){ throw std::exception( "This computer dose not support the format."); } unsigned char buf[320*240*3]; d->startCapture(); //同期キャプチャはデバイスの準備ができるまで失敗する。 while(!d->captureImage(buf)){ Sleep(100); } //bufにキャプチャイメージが取れる。 d->captureImage(buf); //キャプチャ停止 d->stopCapture(); //デバイスクローズ d->closeDevice(); } CoUninitialize(); }
非同期取得(カメラからのコールバック関数でキャプチャする)
#include "NyWin32Capture.h" #include "conio.h" using namespace NyWin32Capture; void MyOnCaptureImage( const CaptureDevice* i_sender,BYTE *pBuffer, long BufferLen) { printf("OnCaptureImage! Image\n"); } void main(void) { CoInitialize(NULL); { CaptureDeviceList cap_list; //キャプチャデバイスのリストから0番目のカメラを得る。 int nod=cap_list.getNumberOfDevice(); if(nod<1){ throw std::exception( "This computer has not Capture device."); } //0番目のカメラをあける。 CaptureDevice* d=cap_list.getDevice(0); d->openDevice(); //インテリジェント接続を使ってキャプチャフォーマットを設定 // QVGAの24BIT RGB if(!d->setVideoFormat(320,240,MEDIASUBTYPE_RGB24,30.0)){ throw std::exception( "This computer dose not support the format."); } //コールバックを使ったキャプチャを開始 d->startCaptureCallback(MyOnCaptureImage); //何か押すまで待つ getch(); //キャプチャ停止 d->stopCapture(); //デバイスクローズ d->closeDevice(); } CoUninitialize(); }
2つの違いは、キャプチャの開始に使うAPIだけです。
NyARToolkitCPPにも、レンダラ部分のコードが書きあがり次第、バンドルする予定です。