我正在尝试使用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/