- バックアップ一覧
- ソース を表示
- OpenCV/videoInput Libraryによるビデオキャプチャ は削除されています。
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版) †
|
#include <iostream>
#include <cstdlib>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include "videoInput.h"
using namespace std;
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")
#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 VI;
int numDevices = VI.listDevices();
if(numDevices == 0)
{
cerr << "[Error] Capture device not found!!" << endl;
exit(-1);
}
VI.setIdealFramerate(device1, CAPTURE_FRAMERATE);
VI.setupDevice(device1, CAPTURE_WIDTH, CAPTURE_HEIGHT);
while(key != 0x1b)
{
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 †
|
#include <iostream>
#include <cstdlib>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include "videoInput.h"
using namespace std;
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")
#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 VI;
int numDevices = VI.listDevices();
if(numDevices == 0)
{
cerr << "[Error] Capture device not found!!" << endl;
exit(-1);
}
VI.setIdealFramerate(device1, CAPTURE_FRAMERATE);
VI.setupDevice(device1, CAPTURE_WIDTH, CAPTURE_HEIGHT);
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より連絡ください.
補足 †
videoInput.h にサンプルプログラムやvideoInputクラスの
各種メンバ関数について説明が記述されており参考になります.