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

我尝试使用以下代码,可以从所有摄像机拍摄单个图像(当前通过一个USB Controller 仅拍摄3张)。

问题是:opencv是否一直都在从USB摄像机流式传输实时视频,还是没有把handle()存储在摄像机上的图像,可以通过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;
}

最佳答案

您能否使声明更清楚。您只需要提要中的帧,或者一直想连接流。

除非您释放捕获设备,否则Opencv摄像机捕获始终处于运行模式。因此,如果您说只想从设备获取一帧,则最好在检索到该帧后释放该设备。

还有一点是,与其在多凸轮环境中使用抓取或检索,不如使用read()来更好地结合上述两种方法,并减少解码流的开销。因此,如果要从每个凸轮中说出帧在2秒的位置,那么在时域中就可以非常精确地捕获它们,比如说从cam1中捕获到的帧x在2秒位置,然后以2.00001sec捕获​​帧x,从cam3捕获到帧x在2.00015sec ..(时间复用-多线程-ocv内部)

我希望我能解释清楚。

谢谢

关于c++ - OpenCV多摄像机单张图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32911340/

10-12 23:08