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にも、レンダラ部分のコードが書きあがり次第、バンドルする予定です。