読者です 読者をやめる 読者になる 読者になる

元派遣プログラマの自称技術系ブログです。雑記とか自作のオープンソースプロジェクトの話とか。
Javaとか組込とかできます。お仕事ください。

NyWin32Capture/1.0.0リリース

Windows向けのキャプチャライブラリNyWin32Capture/1.0.0をリリースします。

http://nyatla.jp/nyartoolkit/wiki/index.php?Tools%2FNyWin32Capture

この手のライブラリは他にもありますが、妙に複雑だったり、コンパイルが難しかったり、何かのおまけだったりするので、シンプルなのをコンセプトに作りました。


特徴は、以下の通りです。

  1. C++インタフェイス。
  2. 使い方が簡単
  3. 同期/非同期キャプチャ両方OK
  4. Windows PSDK 7.1対応 ←new
同梱サンプル

サンプルプログラムは2つ入っています。GUI制御にMFCを使ったので、ちょっとややこしい。

  1. NyWin32CaptureTest - 1個のカメラから画像を取得して、ビットマップにしてウインドウに描画するプログラム。
  2. 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にも、レンダラ部分のコードが書きあがり次第、バンドルする予定です。