作ったプログラムは 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 ボードを差してそこにカメラを片方接続した。結果、うまく両方とも写った。