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

use*_*650 6 camera opencv

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

}
Run Code Online (Sandbox Code Playgroud)

即使有人在摄像机前以中等速度移动,frame_1和frame_2之间的差异也是可见的.


这是因为延迟cvQueryFrame(capture)吗?

Fal*_*lko 5

长话短说

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


虽然我没有使用CvCaptureC VideoCapture++ 而是 Python,但我的解决方案可能仍然适用于您的问题。我还想用 OpenCV 捕捉同步立体图像。

一个天真的尝试可能是:

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

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

vidStreamL.release()
vidStreamR.release()
Run Code Online (Sandbox Code Playgroud)

问题1:第二个摄像头只有在第一张图像被捕获并从摄像头检索后才会被触发,这需要一些时间。

更好的方法是先抓取帧(告诉相机锁定当前帧),然后再检索它:

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

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

vidStreamL.release()
vidStreamR.release()
Run Code Online (Sandbox Code Playgroud)

问题2:我仍然测量到大约200毫秒的差异(用毫秒拍摄手表)。原因是内部捕获缓冲区,如下所述。不幸的是,它并不总是可以轻易停用(至少在我的 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()
Run Code Online (Sandbox Code Playgroud)

这个解决方案非常适合我的情况。我看不到任何可测量的差异(< 10 毫秒)。

(问题3:)从技术上来说,摄像机仍然不同步。普通 USB 网络摄像头无法做到这一点。但更专业的相机通常有一个外部触发器来实际控制何时开始捕捉帧。这超出了本文的范围。


san*_*iso 0

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

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