OpenCV で UVC(USB video device class)対応のカメラを使う

と、電気屋さんで web カメラが安売り(投げ売り)されていたので、OpenCV のステレオ用に(というか、別の方向からも撮影したいし)ということで、2 個ほど買ってきました。

ELECOM 製の UCAM-DLG200H というやつです。

さて、これをパソコンに繋げて動かそうとしたのですが、動かない。
結論から言うと、UVC 対応の WEB カメラは、OpenCV 2.2 では動きません…ってな訳です。

opencv.jp からダウンロードできる安定版は、現時点で v2.2 (http://opencv.jp/download)なので、

OpenCV2.3rcからOpenCV2.3の変更点(ChangeLog) | OpenCV.jp
http://opencv.jp/misc/changelog_from_23rc

なところから、v2.3 をダウンロードして使います。

ちょっと古めの Web カメラだと、ドライバーをインストールしないと使えないので、それには OpenCV が対応しているのですが、最近よく使われている(というか安めの Web カメラは UVC 対応が普通らしい)カメラは DirectShow 経由でないとうまくいかないようです。

で、OpenCV v2.2 頃では、VideoInput として扱われていた DirectShow が、v2.3 では、標準のカメラとして取り込まれたという具合だそうです。

/* OpenCV 2.3 でビルドする */
#include <iostream>
#include "opencv/cv.h"
#include "opencv/highgui.h"
using namespace std;

#ifndef CV_WINDOW_FREERATIO
#define CV_WINDOW_FREERATIO 0
#endif

int main( int argc, char **argv )
{
	cv::VideoCapture cap1;
	cap1.open(0);
  	cv::namedWindow("camera1", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
	while ( 1 ) {
		cv::Mat img1;
		cap1 >> img1 ;
		cv::imshow("camera1", img1 );
		char ch = cv::waitKey(30);
		if ( ch == 27 ) break;
	}
	return 0;
}

で、サンプル用に作った makefile 。面倒なので、ライブラリん環境は全てインポートしています。
実行時には、OpenCV の DLL をカレントディレクトリにコピーすると楽です。

all: camera21.exe camera22.exe camera23.exe

CVINCPATH23=C:\OpenCV2.3\build\include
CVLIBPATH23=C:\OpenCV2.3\build\x86\vc10\lib

CVINCPATH22=C:\OpenCV2.2\include
CVLIBPATH22=C:\OpenCV2.2\lib

CVINCPATH21=C:\OpenCV2.1\include
CVLIBPATH21=C:\OpenCV2.1\lib

CVLIB21= \
	$(CVLIBPATH21)\cv210.lib \
	$(CVLIBPATH21)\cvaux210.lib \
	$(CVLIBPATH21)\cxcore210.lib \
	$(CVLIBPATH21)\cxts210.lib \
	$(CVLIBPATH21)\highgui210.lib \
	$(CVLIBPATH21)\ml210.lib

CVLIB22= \
	$(CVLIBPATH22)\opencv_calib3d220.lib \
	$(CVLIBPATH22)\opencv_contrib220.lib \
	$(CVLIBPATH22)\opencv_core220.lib \
	$(CVLIBPATH22)\opencv_features2d220.lib \
	$(CVLIBPATH22)\opencv_flann220.lib \
	$(CVLIBPATH22)\opencv_gpu220.lib \
	$(CVLIBPATH22)\opencv_highgui220.lib \
	$(CVLIBPATH22)\opencv_imgproc220.lib \
	$(CVLIBPATH22)\opencv_legacy220.lib \
	$(CVLIBPATH22)\opencv_ml220.lib \
	$(CVLIBPATH22)\opencv_objdetect220.lib \
	$(CVLIBPATH22)\opencv_video220.lib

CVLIB23= \
	$(CVLIBPATH23)\opencv_calib3d230.lib \
	$(CVLIBPATH23)\opencv_contrib230.lib \
	$(CVLIBPATH23)\opencv_core230.lib \
	$(CVLIBPATH23)\opencv_features2d230.lib \
	$(CVLIBPATH23)\opencv_flann230.lib \
	$(CVLIBPATH23)\opencv_gpu230.lib \
	$(CVLIBPATH23)\opencv_haartraining_engine.lib \
	$(CVLIBPATH23)\opencv_highgui230.lib \
	$(CVLIBPATH23)\opencv_imgproc230.lib \
	$(CVLIBPATH23)\opencv_legacy230.lib \
	$(CVLIBPATH23)\opencv_ml230.lib \
	$(CVLIBPATH23)\opencv_objdetect230.lib \
	$(CVLIBPATH23)\opencv_video230.lib

CVINCPATH=$(CVINCPATH23)
CVLIBPATH=$(CVLIBPATH23)
CVLIB=$(CVLIB23)

camera21.obj: camera01.cpp
	cl /EHsc /c /I$(CVINCPATH21) /Focamera21.obj camera01.cpp
camera21.exe: camera21.obj
	cl /Fecamera21.exe camera21.obj $(CVLIB21)

camera22.obj: camera01.cpp
	cl /EHsc /c /I$(CVINCPATH22) /Focamera22.obj  camera01.cpp
camera22.exe: camera22.obj
	cl /Fecamera22.exe camera22.obj $(CVLIB22)

camera23.obj: camera01.cpp
	cl /EHsc /c /I$(CVINCPATH23) /Focamera23.obj camera01.cpp
camera23.exe: camera23.obj
	cl /Fecamera23.exe camera23.obj $(CVLIB23)

UVC 対応カメラを接続した状態で、camera21.exe, camera22.exe を実行するとエラーになりますが、camera23.exe は実行できます、という訳でめでたしめでたし…と思いきや…続く。

カテゴリー: 開発, C++, OpenCV パーマリンク