NyWin32Capture/1.0.0リリース

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

NyWin32Capture

NyARToolkitCPPにはキャプチャ用のコードが無い→じゃあ作るか。

ということで、Win32のDirectShow用のカメラキャプチャライブラリ作りました。

APIはNyARToolkit for JavaのJMF Captureとよく似ていて、複数のキャプチャデバイスを扱えるようになってます。
時間ができたらNyWMCaptureとも統合しようかな。

ライセンスはMITなので、単体で使う分には強い制約はありません。

パッケージはまだないので、NyARToolkitのSubversionからチェックアウトしてください。

http://sourceforge.jp/projects/nyartoolkit/svn/view/NyWin32Capture/trunk/?root=nyartoolkit

なお、コンパイルにはWindowsSDK 7.0と6.1Aが必要です。qedit.hにバグがあったりして割と大変なので、がんばってください・・・。

 

2010/05/23追記

NyWin32Capture/1.0.0のパッケージ版をリリースしました。対応SDKをWindows PSDk 7.1にして、qedit.hに依存せずにコンパイルできるようにしました。