如何确定video中物体的距离?
我有一个移动车辆前方录制的video文件。 我打算使用OpenCV进行对象检测和识别,但是我坚持了一个方面。 我怎样才能确定一个识别的对象的距离。
我可以知道我目前的速度和真实世界的GPS位置,但仅此而已。 我不能对我跟踪的对象做任何假设。 我打算用这个来跟踪和跟踪物体而不与它们碰撞。 理想情况下,我想利用这些数据推导出物体的真实位置,如果我能确定从物体到物体的距离,我可以做到这一点。
当您移动video时,可以使用时间视差来确定对象的相对距离。 视差:( 定义 )。
效果与我们用眼睛得到的效果是一样的,通过从略微不同的angular度看相同的对象,可以获得深度感知。 由于您正在移动,您可以使用两个连续的video帧来获得稍微不同的angular度。
使用视差计算,您可以确定对象的相对大小和距离(相对于彼此)。 但是,如果你想要的绝对大小和距离,你将需要一个已知的参考点。
您还需要了解所行进的速度和方向(以及video帧速率)以便进行计算。 您可以使用视觉数据推导出车辆的速度,但这又增加了复杂性。
技术已经存在。 卫星通过比较在短时间内拍摄的多个图像来确定地形突出 (高度)。 我们利用视差来确定在太阳周围的地球轨道上的不同点拍摄夜空的距离。 我能够在短时间内拍摄两张照片,从飞机窗口中创build三维图像。
确切的技术和计算(即使我知道他们的头顶)是在这里讨论的范围之外的方式 。 如果我能find一个体面的参考,我会在这里发布。
你的问题在这个领域相当标准。
首先,
你需要校准你的相机。 这可以离线完成(使生活更简单)或通过自我校准在线 。
请在线离线校准 。
其次,
一旦获得了相机K的校准matrix,就可以确定相机在连续场景中的投影matrix(您需要使用其他人提到的视差)。 这在OpenCV教程中有很好的描述。
您将不得不使用GPS信息来查找连续场景中摄像机之间的相对方向(这可能是由于大多数GPS单元固有的噪声而造成的问题),即教程中提到的R和t或旋转和平移两台摄像机之间。
一旦你解决了这一切,你将有两个投影matrix—在这些连续的场景中的相机的表示。 使用这些所谓的相机matrix之一,可以将场景中的三维点M “投影”到相机的二维图像上,像素坐标为m (如教程中所示)。
我们将使用这个从video中find的2D点对三维点进行三angular测量。
第三,
使用兴趣点检测器来跟踪位于感兴趣对象上的video中的相同点。 有几个探测器可用,我推荐SURF,因为你有OpenCV,还有其他几个探测器,如Shi-Tomasiangular落 , 哈里斯 等 。
第四,
一旦你在整个序列中跟踪了你的物体的点并获得了相应的二维像素坐标,那么在给定投影matrix和二维点的情况下,你必须进行三angular测量以得到最合适的三维点。
上面的图像很好地捕捉了不确定性以及如何计算最佳拟合的3D点。 当然在你的情况下,相机可能在彼此前面!
最后,
一旦获得了物体上的三维点,就可以轻松计算相机中心(大多数情况下是原点)和点之间的欧几里德距离。
注意
这显然不是件容易的事情,但也不是那么难。 我推荐Hartley和Zisserman出色的书籍“ 多视图几何 ”( Multiple View Geometry) ,它已经用MATLAB代码详细描述了上面的所有内容。
玩得开心,不断提问!
您需要在距离相距已知的两个不同帧上识别同一对象中的相同点。 由于您知道每个帧中摄像机的位置,因此您有一个基线(两个摄像机位置之间的vector),从已知基线和与已识别点的angular度构造一个三angular形,三angular形给出了未知边的长度已知长度的基线和基线与未知侧之间的已知angular度的traingles。
您可以使用两台相机,或一台相机连续拍摄。 所以,如果你的车辆以每秒1米的速度移动,并且你每秒都会拍摄一些画面,那么后续的画面会让你感觉到一个1米的基线,这应该是很好的测量距离物体5米远的距离。 如果您需要远离物体的距离远远超出所使用的框架需要进一步分开 – 但是更远的物体将在更长的时间内查看。
在F1的观察者看到目标在T的angular度a1速度向量。 观察者将距离b移到F2。 以angular度a2看T的目标。
需要findr1,范围从目标在F1
余弦的三angular恒等式给出
Cos(90-a1)= x / r1 = c1
Cos(90-a2)= x / r2 = c2
Cos(a1)=(b + z)/ r1 = c3
Cos(a2)= z / r2 = c4
x是与观察者的速度vector正交的目标的距离
z是从F2到x的交点的距离
求解r1
r1 = b /(c3 – c1。c4 / c2)
两个摄像头,所以你可以检测视差。 这是人类做的。
编辑
请参阅ravenspoint的答案更详细。 另外,请记住,一台带分离器的摄像机可能就足够了。
使用立体声视差图。 大量的实现漂浮,这里有一些链接: http : //homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/OWENS/LECT11/node4.html
http://www.ece.ucsb.edu/~manj/ece181bS04/L14(morestereo).pdf
在你的情况下,你没有立体相机,但深度可以使用video评估http://www.springerlink.com/content/g0n11713444148l2/
我认为以上将是最能帮助你的。
目前的研究已经取得了进展,深度可以从一个单一的单眼图像评估(尽pipe不是令人满意的延伸) http://www.cs.cornell.edu/~asaxena/learningdepth/
有人请纠正我,如果我错了,但在我看来,如果你只是简单地使用一台相机,只是依靠一个软件解决scheme,你可能会做任何处理将容易出现误报。 我非常怀疑,有什么办法可以分辨真正处于感知距离的物体和那些只能在电影中出现的距离(如“强迫视angular”)的区别。
任何机会,你可以添加超声波传感器?
把已知大小的物体放在相机的视野里。 这样你可以有一个更客观的度量angular度距离。 没有第二个观点/相机,你将被限制在估计大小/距离,但至less它不会是一个完整的猜测。
首先你应该校准你的相机,这样你就可以得到相机scheme中的物体位置和它们在现实世界计划中的位置之间的关系,如果你使用的是一台相机,那么如果你正在使用“光stream技术”两个摄像头你只是用一个简单的triangulatio来find真正的位置(这将很容易find物体的距离),但与这第二个methose探头是匹配,这意味着如何find一个对象的位置'x'如果你已经知道camera1中的位置,那么你可以使用'SIFT'algorithm。 我只是给你一些关键字希望它可以帮助你。