使用 OpenCV 来自 2 个摄像头(用于立体视觉)的视频,但其中一个摄像头滞后
Posted
技术标签:
【中文标题】使用 OpenCV 来自 2 个摄像头(用于立体视觉)的视频,但其中一个摄像头滞后【英文标题】:Video from 2 cameras (for Stereo Vision) using OpenCV, but one of them is lagging 【发布时间】:2014-02-06 01:39:14 【问题描述】:我正在尝试使用 2 个罗技 C310 网络摄像头创建立体视觉。 但结果还不够好。与另一个相比,其中一个视频滞后。
这是我使用 VC++ 2010 的 openCV 程序:
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <iostream>
using namespace cv;
using namespace std;
int main()
try
VideoCapture cap1;
VideoCapture cap2;
cap1.open(0);
cap1.set(CV_CAP_PROP_FRAME_WIDTH, 1040.0);
cap1.set(CV_CAP_PROP_FRAME_HEIGHT, 920.0);
cap2.open(1);
cap2.set(CV_CAP_PROP_FRAME_WIDTH, 1040.0);
cap2.set(CV_CAP_PROP_FRAME_HEIGHT, 920.0);
Mat frame,frame1;
for (;;)
Mat frame;
cap1 >> frame;
Mat frame1;
cap2 >> frame1;
transpose(frame, frame);
flip(frame, frame, 1);
transpose(frame1, frame1);
flip(frame1, frame1, 1);
imshow("Img1", frame);
imshow("Img2", frame1);
if (waitKey(1) == 'q')
break;
cap1.release();
return 0;
catch (cv::Exception & e)
cout << e.what() << endl;
如何避免滞后?
【问题讨论】:
【参考方案1】:您可能正在使 USB 总线饱和。
尝试在前面插一个,在后面插一个(希望能降落在不同的公交车上),
或减小帧大小/FPS 以减少流量。
【讨论】:
Thx berak,延迟在减少,但有一点延迟,尤其是在检测到移动物体时。【参考方案2】:恐怕你不能这样做。 opencv Videocapture 真的只是为了测试,它使用最简单的底层操作系统功能,并没有真正尝试做任何聪明的事情。
此外,即使您可以找到较低级别的 API 与它们对话,简单的网络摄像头也不是很容易同步控制。
如果您需要在项目中使用简单的 USB 网络摄像头,最简单的方法是让外部定时 LED 以几赫兹的频率闪烁,并检测每个摄像头中的光线并使用它来同步帧。
【讨论】:
谢谢,所以你建议改变每个相机的 fps 直到得到最小的滞后?【参考方案3】:我知道这篇文章已经很老了,但我最近不得不处理同样的问题,所以......
我认为您没有使 USB 总线饱和。如果你是,你应该在终端中有一个明确的消息。实际上,VideoCapture 对象的创建非常慢,我很确定这是您滞后的原因:您初始化第一个 VideoCapture 对象 cap1,cap1 开始抓取帧,您初始化第二个 VideoCapture cap2,cap2 开始抓取帧然后您开始从 cap1 和 cap2 获取帧,但 cap1 存储的第一帧比 cap2 存储的第一帧旧,所以......你有一个滞后。
如果你真的想使用 opencv,你应该做的是添加一些线程:一个处理左帧,另一个处理右帧,除了保存收到的最后一帧之外什么都不做(所以你总是会处理仅使用最新的帧)。如果你想得到你的框架,你只需要从这些线程中获取它们。
如果你需要here,我已经做了一些事情。
【讨论】:
以上是关于使用 OpenCV 来自 2 个摄像头(用于立体视觉)的视频,但其中一个摄像头滞后的主要内容,如果未能解决你的问题,请参考以下文章
通过单端口多头(立体声)usb 摄像头使用 Opencv 捕获视频,提供单输出