2

我正在尝试通过同时读取两个 USB 网络摄像头来制作便宜的立体相机。我的代码:

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

我的相机都是罗技 c210,我在 Ubuntu 12.10 上。当我尝试仅从一台摄像机进行流式传输时,我能够看到来自每台摄像机的提要。一台摄像机是 cvCaptureFromCAM(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
4

1 回答 1

0

您可能会错过一些头文件。下面的代码在我的机器上完美运行。虽然我正在使用 Windows。我没有要测试的 UBUNTU 机器。无论如何尝试下面的代码。

Opencv 将“0”作为默认相机。所以将其设为 0 和 1。

#include "opencv2/objdetect/objdetect.hpp"
     #include "opencv2/highgui/highgui.hpp"
     #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/contrib/contrib.hpp"

    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <sstream>
    #include <stdlib.h>
    #include <time.h>
    int main(int argc, const char** argv)
    {
        const char * window1_name = "Cam 1";
        const char * window2_name = "Cam 2";
        CvCapture* capture1 = cvCaptureFromCAM( 0 );
        CvCapture* capture2 = cvCaptureFromCAM( 1 );
        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 );
    //      sleep(100000);
          cvShowImage( window1_name, cam1_frame );
          cvShowImage( window2_name, cam2_frame );                                                                                                                                                                                                      
          if ( (cvWaitKey(10) & 255) == 27 ) break;
        }                                                                                       
        cvReleaseCapture( &capture1 );
        cvReleaseCapture( &capture2 );
    }
于 2013-05-25T06:46:18.340 回答