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

カメラを操作できなかった.

後記

最初から無理な話だったのだ.USB Video Class 対応モデルもあるっていうだけで,手元にあるカメラは非対応モデルなのだ.

標準付属品 標準ビューワー 専用ドライバ(UVCモデルは無し) 21P-21Pコネクタケーブル、取付金具・ネジ
NM33

「専用ドライバ」が付属しているため,手元のカメラは UVC モデルではない.デバイスマネージャをみると,COM6 という表示が見える.

接続に使っている USB ケーブルは,USB-RS232C 変換ケーブルだったわけだ.