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 では、標準のカメラとして取り込まれたという具合だそうです。

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 は実行できます、という訳でめでたしめでたし…と思いきや…続く。

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