gpt4 book ai didi

opencv - 如何同步两个 USB 摄像头以将它们用作立体摄像头?

转载 作者:太空宇宙 更新时间:2023-11-03 20:50:04 27 4
gpt4 key购买 nike

我正在尝试在 OPENCV 中使用立体视觉实现对象检测。为此,我使用了两台 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)吗?

最佳答案

长话短说

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


虽然我没有使用 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 毫秒的差异(用毫秒拍摄 watch )。原因是内部捕获缓冲区,描述为 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 网络摄像头无法做到这一点。但更专业的相机通常有一个外部触发器来实际控制何时开始捕捉帧。这超出了本文的范围。

关于opencv - 如何同步两个 USB 摄像头以将它们用作立体摄像头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21671139/

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