OpenCV多个摄像头单个图像

时间:2015-10-02 16:06:38

标签: c++ opencv camera

我试图使用MacOS 10.11在openCV中访问多个USB摄像头。 我的目标是通过USB四通道扩展将最多20台摄像机连接到电脑并拍摄单张图像。我不需要直播。

我尝试使用以下代码,我可以从所有摄像机拍摄单个图像(目前只有3个,通过一个USB控制器)。

问题是:opencv是否始终从usb摄像头流式传输实时视频,或者抓取()将图像存储在摄像头上,可以使用retrieve()进行检索?

我无法找到这些信息,opencv在其内部视频缓冲区或相机上使用了grab()命令。

int main(int argument_number, char* argument[])
{
    std::vector<int> cameraIDs{0,1,2};
    std::vector<cv::VideoCapture> cameraCaptures;
    std::vector<std::string> nameCaptures{"a","b","c"};

    //Load all cameras
    for (int i = 0;i<cameraIDs.size();i++)
    {
        cv::VideoCapture camera(cameraIDs[i]);
        if(!camera.isOpened()) return 1;

        camera.set(CV_CAP_PROP_FRAME_WIDTH, 640);
        camera.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
        cameraCaptures.push_back(camera);
    }

    cv::namedWindow("a");
    while(true) {
        int c = cvWaitKey(2);
        if(27 == char(c)){ //if esc pressed. grab new image and display it.
            for (std::vector<cv::VideoCapture>::iterator it=cameraCaptures.begin();it!=cameraCaptures.end();it++)
            {
                (*it).grab();
            }

            int i=0;
            for (std::vector<cv::VideoCapture>::iterator it=cameraCaptures.begin();it!=cameraCaptures.end();it++)
            {
                cv::Mat3b frame;
                (*it).retrieve(frame);
                cv::imshow(nameCaptures[i++], frame);
            }
        }
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

请你说清楚。您只需要来自Feed的帧,或者您希望始终连接流。

除非您释放捕获设备,否则Opencv摄像头捕获始终处于运行模式。因此,如果您说您只需要一个设备中的一个帧,那么一旦您检索到该帧,最好释放此设备。

另一点不是在多凸轮环境中使用抓取或重新训练,最好使用read(),它结合了上述方法并减少了解码流的开销。因此,如果你想要从每个凸轮中说出帧@ 2秒位置,那么在时域中它们被非常紧密地捕获,就像从cam1捕获@ 2秒位置然后帧x在2.00001sec处的帧x和从x捕获的帧x在2.00015sec处帧x ..(时间多路复用 - 多线程 - 内部由ocv)

我希望我能解释清楚 感谢