【问题标题】:Capturing a frame from multiple usb cameras - OpenCV, C++从多个 USB 摄像头捕获帧 - OpenCV、C++
【发布时间】:2014-09-07 17:02:25
【问题描述】:

我正在尝试从连接到 USB 集线器的多个 USB 摄像头捕获单个帧。我写了一些我认为应该有效的东西,但它没有:(。最终结果会根据参数产生正确数量的图像,但除了最终结果之外的所有图像都是“空白”。

#include <opencv2/highgui/highgui.hpp>

#include <stdio.h>
#include <iostream>
using namespace cv;


int main(int argc, char** argv){

  int numberOfCameras = atoi(argv[1]);
  std::vector<Mat> frames (numberOfCameras-1);

  for(int i=0; i<numberOfCameras; i++){
    VideoCapture cap(i);
    cap.set(CV_CAP_PROP_FRAME_WIDTH,320);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT,240);
    Mat frame; cap >> frame;

    frames.push_back(frame);
  }

  for(int i=0; i<numberOfCameras; i++){
    string fileName = std::to_string(i) + ".jpg";
    std::cout << fileName << std::endl;
    imwrite(fileName, frames[i]);
  }
}

这里发生了什么?我对 C++ 和一般类型的语言有点陌生。我误解了向量的使用吗?以上是完成我的任务的最佳方法吗?

我将连接更多的相机(总共 50 个),我很好奇在内存中存储 50 帧的影响。我什至可以在这么多摄像头上打开通话捕捉吗?

【问题讨论】:

    标签: c++ opencv vector camera usb


    【解决方案1】:

    来自网络摄像头的帧是特殊的,因为它们指向视频捕获/驱动程序内的(静态)内存。

    由于您在循环中创建和销毁 VideoCapture,因此存储在矢量中的帧将无效(它们指向的内存已消失)

    为了使您的计划有效,您需要在存储帧之前 clone() 帧(因此它保留自己的像素副本)

    frames.push_back(frame.clone()); 
    

    【讨论】:

    • 这似乎不起作用,我仍然收到相同的结果。还有其他建议吗?
    【解决方案2】:

    很可能是您受到硬件的限制。 USB 摄像头倾向于从 USB 总线获取尽可能多的带宽,因此使用 USB 集线器连接多个摄像头可能不是一个好主意。

    先尝试仅连接两个摄像头,暂时不要设置集线器。如果你很幸运,你的系统有两个独立的 USB 总线,你可以通过尝试以所有可能的方式连接相机电缆来找到它们。检查您的主板/笔记本电脑手册,看看它是否有单独的总线。您还可以找到适用于您的操作系统的教程,了解如何确定它们是否存在于系统中。

    如果您有两条总线,但仍无法从两个摄像头获取图像,则问题可能出在您的代码中。你可以在SO post阅读更多内容

    【讨论】:

    • 我不太明白一个(或四个)摄像头如何在 480p60 时使 USB 3.0 甚至 3.1 的带宽饱和!
    • 这篇文章是关于 USB 2.0
    【解决方案3】:

    在我做的一个项目中,我曾尝试同时使用四个 USB 摄像头,但没有成功。

    我只能同时连接两个摄像头。

    你基本上有两种选择:

    1- 调整相机,即捕捉一个相机,读取一帧,然后释放它并移动到下一个相机....

    2- 始终捕获一台摄像机(对您来说最重要的一台),并按照 (1) 中的说明处理其余摄像机。

    虽然,您可以尝试将外部电源连接到您的 USB 集线器,这可能会帮助您同时捕获三个摄像头,但我非常怀疑您是否能够使用 OpenCV 捕获超过四个摄像头,无论如何.

    我尝试使用不同的相机、不同的(单独的)USB 端口和不同的 USB 集线器来做到这一点。我最多可以得到四个不同的相机,每个相机都连接到不同的 USB 端口,但它并不总是有效。

    注意事项:功率、带宽和 OpenCV 自身的限制。

    顺便说一句:我在配备 4GB RAM 的 Intel i5 笔记本电脑上使用 OpenCV 2.4.8 和 Windows 7 64 位。

    【讨论】:

      猜你喜欢
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 2019-11-20
      • 2012-05-02
      相关资源
      最近更新 更多