作ったプログラムは OpenCV の highgui を使うプログラムなんだけども、これは V4L2 を通して USB カメラの動画を表示させます。つかほんと楽だよ OpenCV。
#include "highgui.h" int main( int args, char** argv ) { cvNamedWindow( "Example2-0", CV_WINDOW_AUTOSIZE ); cvNamedWindow( "Example2-1", CV_WINDOW_AUTOSIZE ); CvCapture* capture = cvCreateCameraCapture(1); CvCapture* capture1 = cvCreateCameraCapture(0); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 320); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 240); cvSetCaptureProperty(capture1, CV_CAP_PROP_FRAME_WIDTH, 320); cvSetCaptureProperty(capture1, CV_CAP_PROP_FRAME_HEIGHT, 240); IplImage* frame; IplImage* frame1; while(1) { frame = cvQueryFrame( capture ); frame1 = cvQueryFrame( capture1 ); if ( !frame ) break; if ( !frame1 ) break; cvShowImage( "Example2-0", frame ); cvShowImage( "Example2-1", frame1 ); char c = cvWaitKey(33); //if ( c == 27 ) break; } cvReleaseCapture( &capture ); cvReleaseCapture( &capture1 ); cvDestroyWindow( "Example2-0" ); cvDestroyWindow( "Example2-1" ); return 0; }
これで二つのカメラの動画を同時に表示できる。...はずだったんだけど、実際に動かそうとすると、二つ目のカメラの Initialize 時に、以下のようなエラーが発生する。おかげで一枚目だけ表示されて、もう一枚は真っ黒。
HIGHGUI ERROR: V4L: Could not SYNC to video stream. no space left on device
最初はどこでエラーを起こしているのかわからなかったけど、v4l のレベルでエラーが起こっていて、調べてみると gentoo wiki で「USB の帯域を使いきっている場合に発生するので、繋ぐ先を変えればうまくいくかも」と書かれていた。
というわけでつなぎ場所をコロコロ変えても変わらず、最終的に余っていた USB2.0 の PCI ボードを差してそこにカメラを片方接続した。結果、うまく両方とも写った。