Windows Vista SP1でOpenCVを使おうとしても、cvQueryFrame()で有効なデータが取れなかったというのは、以前のエントリでokzkさんが書いた通り。原因がわからなかったので、こちらのページで公開されているewclib.hを使ってcvQueryFrame()の代替コードを書きました。
カメラのデバイスやDirectShowを制御する部分はewclib.hで用意されているので、単純にキャプチャした画像を表示するだけならこんな感じ。
#include <cv.h>
#include <highgui.h>
#define EWC_TYPE MEDIASUBTYPE_RGB24
#include <ewclib.h>
#define SIZE_X 640
#define SIZE_Y 480
#define FPS 30
#define WINDOW_NAME "Capture"
#define CAM_NUM 0
int main() {
EWC_Open(SIZE_X, SIZE_Y, FPS);
IplImage* img = cvCreateImage(cvSize(SIZE_X, SIZE_Y), 8, 3);
cvNamedWindow(WINDOW_NAME);
while (1) {
EWC_GetImage(CAM_NUM, img->imageData);
cvShowImage(WINDOW_NAME, img);
uchar key = cvWaitKey(10);
if (key == 'q') {
break;
}
}
cvDestroyWindow(WINDOW_NAME);
cvReleaseImage(&img);
EWC_Close();
return 0;
}
ewclib.hではMEDIASUBTYPE_RGB32がデフォルトなので、ewclib.hをincludeする前に”#define EWC_TYPE MEDIASUBTYPE_RGB24″として、画像の形式をOpenCV側に合わせます。
あとは、EWC_Open()でデバイスとewclibを初期化し、EWC_GetImage()でIplImage構造体のimageData領域に画像を書き込めばOK。キャプチャしたIplImageは、そのままOpenCVライブラリ関数群に渡して使うことができます。
