来自2个网络摄像头的CVcapture

时间:2014-04-06 11:45:44

标签: c++ macos opencv video-capture

我正在从相机中获取输入。更清楚我添加了一张照片: 2个摄像头连接在同一个USB端口上 enter image description here

OpenCV如下:

#define CamLeft 2
#define CamRight 0
#define WIN_L "win_l"
#define WIN_R "win_r"

int main(int argc, const char * argv[])
{
   VideoCapture capLeft(CamLeft);
   bool opened = capLeft.isOpened();
   if(!opened /*|| !capRight.isOpened()*/)  // check if we succeeded
      return -1;

   Mat edges;
   namedWindow(WIN_L,1);
   for(;;)
   {
       Mat frameL;
       Mat frameR;
       capLeft >> frameL; // get a new frame from camera
       cvtColor(frameL, edges, CV_RGB2RGBA);
       imshow(WIN_L, edges);
         if(waitKey(30) >= 0) break;
   }
   return 0;
}

所以我创建一个名为“win_l”的窗口代表左侧窗口并处理视频捕获。它运作良好。现在我升级了我的代码以支持这样的另一个相机:

int main(int argc, const char * argv[])
{
    VideoCapture capLeft(CamLeft);
    VideoCapture capRight(CamRight);
    bool opened = capLeft.isOpened();
    if(!opened /*|| !capRight.isOpened()*/)  // check if we succeeded
        return -1;

    Mat edges;
    namedWindow(WIN_L,1);
    namedWindow(WIN_R,1);
    for(;;)
    {
        Mat frameL;
        Mat frameR;
        capLeft >> frameL; // get a new frame from camera
        cvtColor(frameL, edges, CV_RGB2RGBA);
        imshow(WIN_L, edges);
        imshow(WIN_R, edges);
        if(waitKey(30) >= 0) break;
    }
    return 0;
}

但是后来我没有看到调试器点击这一行:bool opened....它是从2个摄像头捕获的正确方法吗?

1 个答案:

答案 0 :(得分:0)

我怀疑USB带宽分配问题。不太确定这是否是原因,但通常情况下是2个单独的相机,每个单独的USB线。

但是,不过,请试一试。解决该问题的一些方法:1)在捕获线的行之间放置一个Sleep(ms)。 2)使用较低的分辨率会降低每个摄像头使用的带宽。 3)使用MJPEG格式(压缩帧)。

  

编辑:

我遇到过这个网站,WEBCAM AND USB DRIVERS,您可能会想要阅读它。

无论如何,我不确定两个摄像头是否只能通过一个USB端口同时运行,原因如上所述(我实际上已经忘记了它。我的不好):

USB:通用串行总线,顾名思义,它是一种串行数据传输,这意味着它只能从一台设备向/从计算机发送数据。

代码中发生的事情是死锁,导致程序无法进展,即使在一台摄像机上也是如此。

导致这种情况的两个原因:

1)我怀疑每个摄像头的驱动程序是否一直在相互覆盖,发送I / O请求包(IRP)和"管道"继续接收和处理每个请求,系统在分配后立即释放每个资源。这种情况一直在继续。

2)第二台相机有饥饿,如果没有分配资源,程序就无法进行。因此,系统停留在第二台摄像机不断请求资源的循环中。

然而,如果有人使用单个串行总线发明这个2网络摄像头,当每个摄像头需要它自己的通道/管道与系统通信时,这将是奇怪的。也许您想直接与制造商核实?也许他们想出了一个解决方法,因此他们发明了这款相机?

如果没有,本发明的唯一目的是非常多余的。我只能想到一个安全目的,一个配置为夜视,一个配置为日视图。