OpenCV多摄像机单图像

OpenCV multiple cameras single image

本文关键字:图像 单图像 摄像机 OpenCV      更新时间:2023-10-16

我试图在MacOS 10.11中访问openCV中的多个usb摄像头。我的目标是通过USB四通道扩展将多达20个相机连接到pc并拍摄单个图像。我不需要直播。

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

问题是:opencv流直播视频从usb相机所有的时间,还是抓取()存储在相机上的图像,可以检索检索()?

我找不到信息,无论是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;
}

你能不能把话说清楚一点?你只需要提要中的帧,或者你希望流始终连接。

Opencv相机捕获总是处于运行模式,除非你释放捕获设备。如果你说你只想要一个设备的一帧,那么最好是在取回帧后释放这个设备。

另一点是,与其在多摄像头环境中使用抓取或检索,不如使用read(),它结合了上述两种方法,减少了解码流的开销。所以,如果你想要从每一个凸轮中获取@ 2秒位置的帧那么在时域中它们是非常接近的比如从cam1中获取@ 2秒位置的帧x然后从cam3中获取2.0001秒和2.00015秒的帧x。(时间复用-多线程-内部由ocv)

我希望我解释得很清楚。

谢谢