gpt4 book ai didi

c++ - OpenCV 多相机单图像

转载 作者:太空宇宙 更新时间:2023-11-03 22:54:46 25 4
gpt4 key购买 nike

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

我尝试使用以下代码,我可以从所有相机(目前只有 3 个,通过一个 usb Controller )拍摄一张图像。

问题是:opencv 是一直从 USB 摄像头流式传输实时视频,还是 grab() 将图像存储在摄像头上,可以使用 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 相机捕获始终处于运行模式。因此,如果您说您只想从设备获取一帧,那么最好在检索到该帧后释放该设备。

另一点是在多摄像头环境中不要使用 grab 或 retrieve,最好使用结合了上述两种方法的 read() 并减少解码流的开销。因此,如果你想说来自每个摄像头的帧 @ 2sec 位置,那么在时域中它们被非常接近地捕获,例如来自 cam1 的帧 x 在 2sec 位置捕获然后帧 x 在 2.00001sec 和来自 cam3 的帧 x 在 2.00015sec 捕获..(时间多路复用 - 多线程 - ocv 内部)

我希望我的解释清楚。

谢谢

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com