Rya*_* R. 54 c++ opencv computer-vision photogrammetry
我有一个从移动车辆前面记录的视频文件.我将使用OpenCV进行对象检测和识别,但我坚持一个方面.如何确定与识别对象的距离.
我可以知道我目前的速度和现实世界的GPS位置,但就是这样.我无法对我正在跟踪的对象做出任何假设.我打算使用它来跟踪和跟踪对象而不会与它们发生碰撞.理想情况下,我想使用这些数据来推导物体的真实世界位置,如果我能确定从相机到物体的距离,我就能做到这一点.
Jac*_*cob 55
您的问题在该领域非常标准.
你需要校准你的相机.这可以离线完成(使生活更简单)或通过自我校准在线完成.
请离线校准 - 请.
获得摄像机K的校准矩阵后,在连续场景中确定摄像机的投影矩阵(您需要使用其他人提到的视差).这在OpenCV教程中有很好的描述.
您将不得不使用GPS信息来查找连续场景中摄像机之间的相对方向(由于大多数GPS单元固有的噪声可能会出现问题),即教程中提到的R和t或旋转和平移两台相机之间.
一旦你解决了所有这些,你就会有两个投影矩阵 - 在这些连续场景中对摄像机的表示.使用这些所谓的相机矩阵之一,您可以将场景中的3D点M "投影" 到相机的2D图像上,直到像素坐标m(如教程中所示).
我们将使用它来从视频中的2D点对三维点进行三角测量.
使用兴趣点检测器来跟踪视频中位于感兴趣对象上的同一点.有几个可用的探测器,我建议SURF,因为你有OpenCV的其中也有其他几个探测器像世托马西角落,哈里斯,等等.
在序列中跟踪对象的点并获得相应的2D像素坐标后,必须根据投影矩阵和2D点对三维点进行三角测量.
![]()
上面的图像很好地捕捉了不确定性以及如何计算最佳拟合3D点.当然在你的情况下,相机可能在彼此的前面!
一旦获得了物体上的3D点,就可以轻松计算相机中心(在大多数情况下是原点)与点之间的欧几里德距离.
这显然不容易,但也不是那么难.我推荐Hartley和Zisserman的优秀书籍Multiple View Geometry,它用MATLAB代码详细描述了上面的所有内容.
玩得开心,不断提问!
Rob*_*ino 36
移动视频时,可以使用时间视差来确定对象的相对距离.视差:( 定义).
我们用眼睛看到的效果是相同的,通过从略微不同的角度观察相同的物体可以获得深度感知.由于您正在移动,您可以使用两个连续的视频帧来获得略微不同的角度.
使用视差计算,您可以确定对象的相对大小和距离(相对于彼此).但是,如果您想要绝对尺寸和距离,则需要一个已知的参考点.
您还需要知道所行进的速度和方向(以及视频帧速率)才能进行计算.您可以使用可视化数据推导出车辆的速度,但这又增加了复杂性的另一个方面.
该技术已经存在.卫星通过比较在短时间内拍摄的多个图像来确定地形突出(高度).我们使用视差来通过在太阳周围地球轨道的不同点拍摄夜空来确定恒星的距离.我能够通过短时间拍摄两张照片从飞机窗口创建三维图像.
确切的技术和计算(即使我知道他们把我的头顶部)的方式之外在这里讨论的范围.如果我能找到一个不错的参考,我会在这里发布.
您需要在相距已知距离的两个不同帧上识别同一对象中的相同点.由于您知道每个帧中摄像机的位置,因此您有一个基线(两个摄像机位置之间的矢量.从已知基线和角度到已识别点构建三角形.三角函数为您提供未知边的长度已知基线长度的基线和基线与未知侧之间的已知角度.
您可以使用两台摄像机,或一台摄像机连续拍摄.因此,如果您的车辆以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)