如何同步两个USB摄像头将其用作立体摄像头?

时间:2014-02-10 07:17:54

标签: opencv camera

我正在尝试使用OPENCV中的Stereo Vision实现对象检测。我正在使用两台Logitech-C310相机。但我没有使用两个摄像头同步帧。两个相机帧捕获之间的时差也不相同。

  • 如何同步?

  • 在Bumblebee,Minoru等立体相机中我们需要同步吗?


感谢您的回复。

我正在尝试使用移动的机器人平台实现人员跟踪。我正在使用cvQueryFrame(capture)从两个摄像头中逐个捕获每个帧。 以下是我正在使用的代码部分:

CvCapture* capture_1 = cvCreateCameraCapture(0);
Cvcapture* capture_2 = cvCreateCameraCapture(1);
for(i=1;i<=20;i++)
{
 frame_1= cvQueryFrame(capture_1);
 frame_2= cvQueryFrame(Capture_2);

//processing of frames//

}

即使有人在相机前以中等速度移动,也可以看到frame_1和frame_2之间的差异。

由于cvQueryFrame(capture)

,这是延迟吗?

2 个答案:

答案 0 :(得分:1)

TL; DR

请参阅我的最后一个代码片段“一个简单的解决方法”。我就是这样做的。


尽管我不是使用CvCapture而是使用VideoCapture而不是C ++而不是Python,但是我的解决方案仍然可以解决您的问题。我还想用OpenCV捕获同步的立体声图像。

天真的尝试可能是:

vidStreamL = cv2.VideoCapture(0)
vidStreamR = cv2.VideoCapture(2)

_, imgL = vidStreamL.read()
_, imgR = vidStreamR.read()

vidStreamL.release()
vidStreamR.release()

问题1::仅在捕获第一张图像并从其中检索第一张图像后,才会触发第二台相机。

一种更好的方法是先抓取帧(告诉摄像机固定当前帧),然后再进行检索:

vidStreamL = cv2.VideoCapture(0)
vidStreamR = cv2.VideoCapture(2)

vidStreamL.grab()
vidStreamR.grab()
_, imgL = vidStreamL.retrieve()
_, imgR = vidStreamR.retrieve()

vidStreamL.release()
vidStreamR.release()

问题2:我仍然测量了大约200毫秒的差异(以毫秒为单位拍摄手表)。原因是内部捕获缓冲区,描述here。不幸的是,它并不总是很容易被停用(至少在我的OpenCV版本中如此)。

一种简单的解决方法是在获取实际图像之前多次捕获帧,直到捕获缓冲区为空:

vidStreamL = cv2.VideoCapture(0)
vidStreamR = cv2.VideoCapture(2)

for i in range(10):
    vidStreamL.grab()
    vidStreamR.grab()
_, imgL = vidStreamL.retrieve()
_, imgR = vidStreamR.retrieve()

vidStreamL.release()
vidStreamR.release()

此解决方案适用于我的情况。我看不到任何可测量的差异(<10毫秒)。

(问题3:)从技术上讲,摄像机仍未同步。普通的USB网络摄像头将无法执行此操作。但是,更多的专业相机通常具有外部触发器来实际控制何时开始捕获帧。这超出了本文的范围。

答案 1 :(得分:0)

据我记忆所知,Minoru的两个相机不同步。您需要实现的确切通信模式将取决于用于访问摄像头的驱动程序,因此将取决于平台,您需要提供更多信息以获得准确的答案。

现在,另一个问题是:你真的需要同步吗?据我所知,当凸轮完全同步时,立体视觉显然更简单,但在30 fps(甚至15)的情况下,物体需要在发生一些失真之前快速移动。