2014-07-17 93 views
0

我试图从连接到USB集线器的几个USB摄像头捕获单帧。我已经写了一些东西,我相信应该工作,但它不会:(。最终的结果产生基于参数图像的正确数目,但所有除最后是“空白”。从多个USB摄像头捕获帧 - OpenCV,C++

#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帧的影响感到好奇,我可以打开很多相机上的通话捕获吗?

回答

4

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

,因为你创建和销毁VideoCapture在循环,存储在您的载体框架将是无效的(他们指向内存中消失了)

,使你的计划工作,你需要克隆( )将其存储(因此它保留自己的像素的复印件)之前的帧

frames.push_back(frame.clone()); 
+0

这似乎没有工作,我仍然收到相同的结果。还有其他建议吗? –

2

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

尝试仅连接两台摄像机,并立即将集线器从您的设置中取出。如果幸运的话,您的系统有两条独立的USB总线,您可以通过尝试以各种方式连接相机电缆来找到它们。检查您的主板/笔记本电脑手册,看它是否有单独的总线。您还可以找到适用于您的操作系统的教程,以了解如何查看它们是否存在于系统中。

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

+0

我不太明白相机(或四个)如何在480p60上饱和usb 3.0甚至3.1的带宽! –

+0

这篇文章是关于USB 2.0的 –

2

在我正在做的一个项目中,我试图同时使用四个USB摄像头,但没有奏效。

我只设法同时连接两台摄像机。

你基本上有两种选择:

1至玩弄相机,即抓住一个摄像头,读一帧,然后释放并移动到下一个摄像机....

2-按照(1)中的规定,随时抓住一台摄像机(最重要的一台摄像机)并调整其余的摄像机。

尽管您可以尝试将外部电源连接到USB集线器,这可能会帮助您同时捕获三个摄像头,但是我非常怀疑,无论使用OpenCV,您都可以捕获四个以上的摄像头什么。

我试图用不同的相机,不同的(独立)USB端口和不同的USB集线器。我能得到的最大数量是四个不同的摄像头,每个摄像头都连接到不同的USB端口,并且它并不总是工作。

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

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