2 つの USB Web カメラから同時に読み取ることにより、安価なステレオ カメラを作成しようとしています。私のコード:
int main(int argc, char** argv)
{
char * window1_name = "Cam 1";
char * window2_name = "Cam 2";
CvCapture* capture1 = cvCaptureFromCAM( 1 );
CvCapture* capture2 = cvCaptureFromCAM( 2 );
namedWindow(window1_name, CV_WINDOW_AUTOSIZE );
namedWindow(window2_name, CV_WINDOW_AUTOSIZE );
while ( 1 ) {
// Get one frame
IplImage* cam1_frame = cvQueryFrame( capture1);
IplImage* cam2_frame = cvQueryFrame( capture2 );
usleep(100000);
cvShowImage( window1_name, cam1_frame );
cvShowImage( window2_name, cam2_frame );
if ( (cvWaitKey(10) & 255) == 27 ) break;
}
cvReleaseCapture( &capture1 );
cvReleaseCapture( &capture2 );
}
次の出力が得られます。
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
libv4l2: error setting pixformat: Device or resource busy
HIGHGUI ERROR: libv4l unable to ioctl S_FMT
libv4l2: error setting pixformat: Device or resource busy
libv4l1: error setting pixformat: Device or resource busy
HIGHGUI ERROR: libv4l unable to ioctl VIDIOCSPICT
私のカメラは両方とも Logitech c210 で、Ubuntu 12.10 を使用しています。1 台のカメラだけからストリーミングしようとすると、各カメラからのフィードを見ることができます。1 台のカメラは cvCaptureFromCAM(1) で、もう 1 台は cvCaptureFromCAM(2) ですが、同時には機能しません。カメラが使用していると思われる最新のv4lをコンパイルしてみました。まだ何もありません。
編集:
私の USB バスは 900 MB/s しかサポートしておらず、各カメラはデフォルトの解像度 640x480 で 480 MB/s を使用していました。プログラムを実行する前に v4l2-ctl プログラムを使用してデフォルトの解像度を変更したところ、より低い解像度で動作しました。
v4l2-ctl -d /dev/video1 --set-fmt-video=width=320,height=240,pixelformat=YUYV
v4l2-ctl -d /dev/video2 --set-fmt-video=width=320,height=240,pixelformat=YUYV
./my_program