と、電気屋さんで 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 では、標準のカメラとして取り込まれたという具合だそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /* 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 をカレントディレクトリにコピーすると楽です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | 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 は実行できます、という訳でめでたしめでたし…と思いきや…続く。