OpenCV/videoInput Libraryによるビデオキャプチャ

ここでは,DirectShow?によるビデオキャプチャを簡単に行うことができるライブラリ videoInput Library
OpenCVを組み合わせたサンプルプログラムを紹介します.

[注意1]
OpenCV 1.1pre1からvideoInput LibraryがOpenCVに組み込まれるになったため,
OpenCVのcvSetCaptureProperty?関数にてキャプチャサイズ(幅,高さ)の設定が有効が有効になります.

一方,videoInput0.1995から設定が可能となっているフレームレートについては
OpenCV 1.1pre1のcvSetCaptureProperty?関数から設定できないようです.

そのため,現状,フレームレートを制御したい場合にはvideoInputを
直接扱う方が簡単かもしれません.以降のソースコードはvideoInputにより
キャプチャサイズ,フレームレートを設定してキャプチャを行う例となっています.

前準備

まず,Windows SDK,もしくはPlatform SDKをインストールしましょう(※OpenCV/VS 2005でCVCAMを使う参照).
OpenCVのインストールはOpenCV@Chihara-Lab.を参照.

videoInput Libraryのセットアップ

videoInput Library開発サイトより,(2009/8/29時点)最新のvideoInput0.1995.zipをダウンロードし,展開します.
今回のサンプルでは以下のファイルをプロジェクトに追加しました.

[ライブラリ]

videoInput0.1995\compiledLib\compiledByVS2005\

にあるvideoInput.lib

[ヘッダ]

videoInput0.1995\compiledLib\compiledByVS2005\include

にあるvideoInput.h

ビルド時にatlthunk.lib リンカエラーが出たら

プロジェクト-プロパティ-構成プロパティ-リンカ-コマンドライン-追加のオプション に

/NODEFAULTLIB:"atlthunk"

と記述します.

サンプルプログラム

videoInput Libraryを使ったサンプルプログラムを 以下に示します.
サンプルプログラム1,サンプルプログラム2 ともに見た目の結果は同じです.

サンプルプログラム1(memcpy版)

fileCapureVI_memcpy.cpp
//----------------------------------------------------------------------
// 概要      : videoInputライブラリを用いたキャプチャサンプル
// File Name : Main.cpp
// Library   :	OpenCV for MS-Windows 1.1
//				http://sourceforge.net/projects/opencvlibrary/
//				videoInput Library 0.1995
//				http://muonics.net/school/spring05/videoInput/
// Author    : dandelion
// Date      : Aug 29, 2009; 22:10
//----------------------------------------------------------------------

#include <iostream>
#include <cstdlib>

//ヘッダインクルード(OpenCV関連)
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

//ヘッダインクルード(videoInput Library関連)
#include "videoInput.h"

using namespace std;

//ライブラリ読み込み(OpenCV関連)
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")

//ライブラリ読み込み(videoInput Library関連)
#pragma comment(lib,"videoInput.lib")

//定数
#define CAPTURE_WIDTH        320    //キャプチャサイズ(幅)
#define CAPTURE_HEIGHT        240    //キャプチャサイズ(高さ)
#define CAPTURE_FRAMERATE    30    //フレームレート

int main(void)
{
    int device1 = 0;
    int key = 0;

    //キャプチャ画像
    IplImage *image = cvCreateImage(cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 3);

    //ウィンドウ
    char* window_name = "Capture using videoInput Library";
    cvNamedWindow(window_name,  CV_WINDOW_AUTOSIZE);

    //videoInputオブジェクト
    videoInput VI;

    //利用可能なキャプチャデバイス数を取得
    int numDevices = VI.listDevices();

    //キャプチャデバイスが見つからなかったら終了
    if(numDevices == 0)
    {
        cerr << "[Error] Capture device not found!!" << endl;
        exit(-1);
    }

    //フレームレート設定
    VI.setIdealFramerate(device1, CAPTURE_FRAMERATE);

    //デバイス初期化(ここではデバイスID = 0,CAPTURE_WIDTH x CAPTURE_HEIGHTでキャプチャ)
    VI.setupDevice(device1, CAPTURE_WIDTH, CAPTURE_HEIGHT);

    //ESCキーが押されるまでキャプチャを続ける
    while(key != 0x1b)
    {
        //キャプチャ画像をimageDataにコピー
        memcpy(image->imageData, VI.getPixels(device1, false), image->imageSize);

        //画像表示
        cvShowImage(window_name, image);

        //キー入力
        key = cvWaitKey(1);
    }

    //後処理
    VI.stopDevice(device1);
    cvDestroyWindow(window_name);
    cvReleaseImage(&image);

    return 0;
}

VI.getPixels関数で取得した情報をmemcpy関数でImageData?にコピー.

サンプルプログラム2

fileCaptureVI.cpp
//----------------------------------------------------------------------
// 概要      : videoInputライブラリを用いたキャプチャサンプル
// File Name : Main.cpp
// Library   :	OpenCV for MS-Windows 1.1
//				http://sourceforge.net/projects/opencvlibrary/
//				videoInput Library 0.1995
//				http://muonics.net/school/spring05/videoInput/
// Author    : dandelion
// Date      : Aug 29, 2009; 22:10
//----------------------------------------------------------------------

#include <iostream>
#include <cstdlib>

//ヘッダインクルード(OpenCV関連)
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

//ヘッダインクルード(videoInput Library関連)
#include "videoInput.h"

using namespace std;

//ライブラリ読み込み(OpenCV関連)
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")

//ライブラリ読み込み(videoInput Library関連)
#pragma comment(lib,"videoInput.lib")

//定数
#define CAPTURE_WIDTH        320    //キャプチャサイズ(幅)
#define CAPTURE_HEIGHT        240    //キャプチャサイズ(高さ)
#define CAPTURE_FRAMERATE    30    //フレームレート

int main(void)
{
    int device1 = 0;
    int key = 0;

    //キャプチャ画像
    IplImage *image = cvCreateImage(cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 3);

    //ウィンドウ
    char* window_name = "Capture using videoInput Library";
    cvNamedWindow(window_name,  CV_WINDOW_AUTOSIZE);

    //videoInputオブジェクト
    videoInput VI;

    //利用可能なキャプチャデバイス数を取得
    int numDevices = VI.listDevices();

    //キャプチャデバイスが見つからなかったら終了
    if(numDevices == 0)
    {
        cerr << "[Error] Capture device not found!!" << endl;
        exit(-1);
    }

    //フレームレート設定
    VI.setIdealFramerate(device1, CAPTURE_FRAMERATE);

    //デバイス初期化(ここではデバイスID = 0,CAPTURE_WIDTH x CAPTURE_HEIGHTでキャプチャ)
    VI.setupDevice(device1, CAPTURE_WIDTH, CAPTURE_HEIGHT);

    //ESCキーが押されるまでキャプチャを続ける
    while(key != 0x1b)
    {
        image->imageData = (char *)VI.getPixels(device1, false, true);

        //画像表示
        cvShowImage(window_name, image);

        //キー入力
        key = cvWaitKey(1);
    }

    //後処理
    VI.stopDevice(device1);
    cvDestroyWindow(window_name);
    cvReleaseImage(&image);

    return 0;
}

この方法だと一見,ImageData?のアドレスを上書きしていてcvReleaseImage?で正しく解放できなくなるように見えますが,実は大丈夫です.
詳細が知りたい方はdandelion's log » cvReleaseImageの挙動についてに 説明を書いたので参照ください.

Visual Studio2005プロジェクトファイル

キャプチャ画像をウィンドウに表示するプログラムです.
※間違い・御指摘等ありましたら,Contactより連絡ください.

fileCaptureVI.zip

補足

videoInput.h にサンプルプログラムやvideoInputクラスの
各種メンバ関数について説明が記述されており参考になります.


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS