我试图使用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;
}
答案 0 :(得分:1)
请你说清楚。您只需要来自Feed的帧,或者您希望始终连接流。
除非您释放捕获设备,否则Opencv摄像头捕获始终处于运行模式。因此,如果您说您只需要一个设备中的一个帧,那么一旦您检索到该帧,最好释放此设备。
另一点不是在多凸轮环境中使用抓取或重新训练,最好使用read(),它结合了上述方法并减少了解码流的开销。因此,如果你想要从每个凸轮中说出帧@ 2秒位置,那么在时域中它们被非常紧密地捕获,就像从cam1捕获@ 2秒位置然后帧x在2.00001sec处的帧x和从x捕获的帧x在2.00015sec处帧x ..(时间多路复用 - 多线程 - 内部由ocv)
我希望我能解释清楚 感谢