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ライブラリ関数群に渡して使うことができます。