如何确定视频中对象的距离?

时间:2010-01-25 19:48:59

标签: c++ opencv computer-vision photogrammetry

我有一个从移动车辆前面录制的视频文件。我将使用OpenCV进行对象检测和识别,但我坚持一个方面。如何确定与识别对象的距离。

我可以知道我目前的速度和现实世界的GPS位置,但就是这样。我无法对我正在跟踪的对象做出任何假设。我打算使用它来跟踪和跟踪对象而不会与它们发生碰撞。理想情况下,我想使用这些数据来推导物体的真实世界位置,如果我可以确定从相机到物体的距离,我就能做到这一点。

8 个答案:

答案 0 :(得分:55)

您的问题在该领域非常标准。

首先,

您需要校准相机。这可以通过自我校准offline(使生活更多更简单)或online完成。

Calibrate it offline - 请。

其次,

获得相机的校准矩阵 K 后,确定连续场景中相机的投影矩阵(您需要使用其他人提到的视差)。这在OpenCV tutorial中有详细描述。

您必须使用GPS信息来查找连续场景中相机之间的相对方向(由于大多数GPS装置固有的噪音可能会出现问题),即 R 和教程中提到的 t 或两个摄像机之间的旋转和平移。

一旦你解决了所有这些问题,你就会有两个投影矩阵 - 这些连续场景中摄像机的表示。使用这些所谓的相机矩阵之一,您可以将场景中的3D点 M “投影”到相机的2D图像上,以像素坐标 m (如在教程中。)

我们将使用它来对视频中的2D点进行三角测量。

第三,

使用兴趣点探测器跟踪视频中位于感兴趣对象上的同一点。有几个探测器可用,我推荐SURF,因为你有OpenCV,还有其他几个探测器,如Shi-Tomasi cornersHarrisetc

第四,

在整个序列中跟踪对象的点并获得相应的2D像素坐标后,在给定投影矩阵和2D点的情况下,您必须triangulate获得最佳拟合3D点。 Triangulation

上面的图像很好地捕捉了不确定性以及如何计算最佳拟合3D点。当然在你的情况下,相机可能在彼此的前面!

最后,

在物体上获得3D点后,您可以轻松计算相机中心(在大多数情况下是原点)与点之间的欧几里德距离。

注意

这显然不容易,但也不是那么难。我推荐Hartley和Zisserman出色的书籍Multiple View Geometry,它用MATLAB代码详细描述了上面的所有内容。

玩得开心,不断提问!

答案 1 :(得分:35)

当您有移动视频时,您可以使用时间视差来确定对象的相对距离。视差:(definition)。

我们用眼睛看到的效果是相同的,通过从略微不同的角度观察相同的物体可以获得深度感知。由于您正在移动,您可以使用两个连续的视频帧来获得略微不同的角度。

使用视差计算,您可以确定相对大小和对象的距离(相对于彼此)。但是,如果你想要绝对大小和距离,你需要一个已知的参考点。

您还需要知道行进的速度和方向(以及视频帧速率)才能进行计算。您可能能够使用可视化数据推导出车辆的速度,但这又增加了复杂性。

该技术已经存在。卫星通过比较在短时间内拍摄的多个图像来确定topographic prominence(高度)。我们使用视差来通过在太阳周围地球轨道的不同点拍摄夜空来确定恒星的距离。我能够通过短时间拍摄两张照片从飞机窗口创建三维图像。

确切的技术和计算(即使我知道它们在我的头脑中)是方式超出了此处讨论的范围。如果我能找到一个不错的参考,我会在这里发布。

答案 2 :(得分:5)

您需要在相距已知距离的两个不同帧上识别同一对象中的相同点。由于您知道每个帧中摄像机的位置,因此您有一个基线(两个摄像机位置之间的矢量。从已知基线和角度到已识别点构造一个三角形。三角函数为您提供未知边的长度。已知基线长度的基线和基线与未知边之间的已知角度。

您可以使用两台相机或一台连续拍摄的相机。因此,如果您的车辆以1米/秒的速度移动并且您每秒钟取得一次飞行,那么后续框架将为您提供1米的基线,这应该可以很好地测量物体距离,例如距离5米。如果您需要将物体的距离远远超过所使用的框架需要更远的距离 - 那么更远的物体将会在更长时间内被观察到。

F1的观察者在T处看到目标,角度为a1到速度矢量。观察者将距离b移动到F2。在角度为a2的T处看到目标。

需要找到r1,范围来自F1的目标

余弦的三角恒等式给出

Cos(90 - a1)= x / r1 = c1

Cos(90 - a2)= x / r2 = c2

Cos(a1)=(b + z)/ r1 = c3

Cos(a2)= z / r2 = c4

x是与观察者的速度矢量正交的目标距离

z是从F2到x的交点的距离

解决r1

r1 = b /(c3-c1.c4 / c2)

答案 3 :(得分:4)

两个摄像头,因此您可以检测视差。这就是人类所做的事情。

修改

有关详细信息,请参阅ravenspoint的答案。另外,请记住,带分离器的单个相机可能就足够了。

答案 4 :(得分:3)

使用立体视差图。许多实现都在运行,这里有一些链接: http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/OWENS/LECT11/node4.html

http://www.ece.ucsb.edu/~manj/ece181bS04/L14(morestereo).pdf

在您的情况下,您没有立体相机,但可以使用视频评估深度 http://www.springerlink.com/content/g0n11713444148l2/

我认为以上内容可能对您有所帮助。

到目前为止,研究已取得进展,可以从单个单眼图像评估深度(尽管不能令人满意地延伸) http://www.cs.cornell.edu/~asaxena/learningdepth/

答案 5 :(得分:2)

如果我错了,请有人纠正我,但在我看来,如果你只是简单地使用一台摄像机并依赖软件解决方案,那么你可能会做的任何处理都会容易出现误报。我非常怀疑是否有任何处理可以分辨出真正处于感知距离的物体与仅在电影中看起来像那个距离的物体(如“强制透视”)之间的区别。

你有可能添加超声波传感器吗?

答案 6 :(得分:0)

在相机视野中放置已知尺寸的物体。这样,您可以使用更客观的度量来测量角距离。如果没有第二个视点/摄像头,您将仅限于估算尺寸/距离,但至少不会完全猜测。

答案 7 :(得分:0)

首先你应该校准你的相机,这样你就可以得到相机计划中物体位置与它们在真实世界计划中的位置之间的关系,如果你使用的是一台相机,那么你可以使用“光流技术” 如果你使用两个摄像头,你只需使用一个简单的三角形来找到真实的位置(很容易找到物体的距离)但是第二个探测器的探测是匹配的,这意味着你如何找到一个位置。如果你已经在相机1中找到它的位置,那么你可以使用'SIFT'算法在camera2中对象'x'。 我刚刚给了你一些希望它可以帮到你的关键词。