OpenCV 2.0 と EWCLIB 1.8 を使って NM33 というカメラの画像を取得できなかった
NM33 は USB Video Class に対応しているらしいが,OpenCV 2.0 でさくっと読み込めなかった.UVCのカメラ画像をOpenCVで操作(Windows Vista sp1) 涙目ブログ/ウェブリブログ に至り,EWCLIB との併用を知った.
環境
- VC++ 2008 EE SP1
- DirectX SDK (きっと.私の c:\program files には March 2008 と August 2007 があった)
- OpenCV 2.0
- EWCLIB 1.8(改造)
EWCLIB 1.8 の改造
コンパイルが通るように,ewclib.h の2箇所を編集した.qedit.h を include する直前に次のコードを挿入した.
#pragma include_alias( "dxtrans.h", "qedit.h" ) #define __IDxtCompositor_INTERFACE_DEFINED__ #define __IDxtAlphaSetter_INTERFACE_DEFINED__ #define __IDxtJpeg_INTERFACE_DEFINED__ #define __IDxtKey_INTERFACE_DEFINED__
void EWC_GetLastMessage( char *, int ) の AMGetErrorText() を次のように書き変えた.
AMGetErrorText(ewc_hr,reinterpret_cast<LPSTR>(w),256);
テストコード
#include <iostream> #include <opencv/cv.h> #include <opencv/highgui.h> #include "ewclib.h" #ifdef _DEBUG #pragma comment( lib, "cv200d.lib" ) #pragma comment( lib, "cxcore200d.lib" ) #pragma comment( lib, "highgui200d.lib" ) #else #pragma comment( lib, "cv200.lib" ) #pragma comment( lib, "cxcore200.lib" ) #pragma comment( lib, "highgui200.lib" ) #endif const int WIDTH = 640; const int HEIGHT = 480; const int FPS = 15; const std::string windowname("preview"); int main( int argc, char *argv[] ) { // 使用前に必須.カメラ(最大8台)を初期化する EWC_Open(WIDTH, HEIGHT, FPS); // カメラの数を確認する int cameras = EWC_GetCamera(); std::cout << "カメラ台数: " << cameras << std::endl; if ( cameras > 0 ) { // カメラがある場合,読み込みを試行する cv::Mat frame(cv::Size(WIDTH, HEIGHT), CV_8UC3); if ( EWC_GetImage(0, frame.data) == 0 ) // 正常終了は 0 を返す { // 読み込み画像を表示する cv::namedWindow( windowname, CV_WINDOW_AUTOSIZE); cv::imshow( windowname, frame); cv::waitKey(); } } // 使用後に必須 EWC_Close(); return 0; }
実行結果
カメラ台数: 0
カメラを操作できなかった.