我有一个从移动车辆前面录制的视频文件。我将使用 OpenCV 进行对象检测和识别,但我被困在一个方面。如何确定与已识别物体的距离。
我可以知道我当前的速度和真实世界的 GPS 位置,但仅此而已。我无法对我正在跟踪的对象做出任何假设。我打算用它来跟踪和跟踪对象而不与它们发生碰撞。理想情况下,我想使用这些数据来导出对象的真实位置,如果我可以确定相机到对象的距离,我就可以做到这一点。
我有一个从移动车辆前面录制的视频文件。我将使用 OpenCV 进行对象检测和识别,但我被困在一个方面。如何确定与已识别物体的距离。
我可以知道我当前的速度和真实世界的 GPS 位置,但仅此而已。我无法对我正在跟踪的对象做出任何假设。我打算用它来跟踪和跟踪对象而不与它们发生碰撞。理想情况下,我想使用这些数据来导出对象的真实位置,如果我可以确定相机到对象的距离,我就可以做到这一点。
您的问题在该领域非常标准。
你需要校准你的相机。这可以离线完成(让生活更简单)或通过自我校准在线完成。
获得相机K的校准矩阵后,确定相机在连续场景中的投影矩阵(您需要使用其他人提到的视差)。这在这个OpenCV 教程中有很好的描述。
您必须使用 GPS 信息来查找连续场景中摄像机之间的相对方向(由于大多数 GPS 单元固有的噪声,这可能会出现问题),即教程中提到的R和t或旋转和平移两个摄像头之间。
一旦你解决了所有这些问题,你将拥有两个投影矩阵——在这些连续场景中的摄像机表示。使用这些所谓的相机矩阵之一,您可以将场景上的 3D 点M “投影”到相机的 2D 图像到像素坐标m上(如教程中所示)。
我们将使用它从视频中找到的 2D 点对真实的 3D 点进行三角测量。
使用兴趣点检测器跟踪视频中位于感兴趣对象上的同一点。有几个可用的检测器,我推荐SURF ,因为你有 OpenCV,它还有几个其他的检测器,比如Shi- Tomasi corners、Harris等。
一旦您在序列中跟踪了对象的点并获得了相应的 2D 像素坐标,您必须对给定投影矩阵和 2D 点的最佳拟合 3D 点进行
三角测量。
上图很好地捕捉了不确定性以及如何计算最佳拟合 3D 点。当然,在您的情况下,相机可能在彼此前面!
获得对象上的 3D 点后,您可以轻松计算相机中心(在大多数情况下为原点)与该点之间的欧几里得距离。
这显然不是一件容易的事情,但也不是那么难。我推荐 Hartley 和 Zisserman 的优秀书籍Multiple View Geometry,其中详细描述了上述所有内容,并使用 MATLAB 代码启动。
玩得开心,继续提问!
当您有移动视频时,您可以使用时间视差来确定对象的相对距离。视差:(定义)。
效果与我们用眼睛得到的效果相同,眼睛可以通过从稍微不同的角度看同一个物体来获得深度感知。由于您正在移动,您可以使用两个连续的视频帧来获得稍微不同的角度。
使用视差计算,您可以确定对象的相对大小和距离(相对于彼此)。但是,如果您想要绝对大小和距离,则需要一个已知的参考点。
您还需要知道行进的速度和方向(以及视频帧速率)才能进行计算。您也许可以使用视觉数据推导出车辆的速度,但这增加了另一个维度的复杂性。
该技术已经存在。卫星通过比较在短时间内拍摄的多张图像来确定地形突出(高度)。我们使用视差来确定恒星的距离,方法是在地球绕太阳运行的轨道上的不同点拍摄夜空照片。通过在短时间内连续拍摄两张照片,我能够在飞机窗外创建 3D 图像。
确切的技术和计算(即使我完全不知道它们)远远超出了这里讨论的范围。如果我能找到一个像样的参考,我会在这里发布。
您需要在相距已知距离的两个不同帧上识别同一对象中的相同点。由于您知道相机在每一帧中的位置,因此您有一个基线(两个相机位置之间的向量。从已知基线和与已识别点的角度构造一个三角形。三角函数为您提供未知边的长度已知长度的基线以及基线和未知边之间的已知角度的三角形。
您可以使用两台相机,或一台相机连续拍摄。因此,如果您的车辆以 1 m/s 的速度移动并且您每秒都成名,那么后继帧将为您提供 1m 的基线,这应该可以很好地测量物体之间的距离,例如 5m 远。如果您需要将对象的范围设置得比所使用的框架更远,则需要更远的距离 - 但是更远的对象将在更长的时间内出现。
F1 处的观察者在 T 处看到与速度矢量成角度 a1 的目标。观察者将距离 b 移动到 F2。在 T 处看到目标,角度为 a2。
需要找到 r1,范围从 F1 的目标
余弦的三角恒等式给出
Cos(90 – a1) = x / r1 = c1
余弦 (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 )
两个摄像头,因此您可以检测视差。这是人类所做的。
编辑
有关更多详细信息,请参阅 ravenpoint 的答案。另外,请记住,带有分离器的单个相机可能就足够了。
使用立体视差图。很多实现都在进行中,这里有一些链接: 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/
如果我错了,请有人纠正我,但在我看来,如果您只想使用单个相机并简单地依赖软件解决方案,那么您可能进行的任何处理都容易出现误报。我非常怀疑是否有任何处理可以区分真正处于感知距离的物体和那些仅在电影中看起来处于该距离的物体(如“强制透视”)。
你有机会加一个超声波传感器吗?
首先,您应该校准您的相机,以便您可以获得相机计划中的对象位置与其在现实世界计划中的位置之间的关系,如果您使用的是单个相机,您可以使用“光流技术”如果您正在使用两个相机你可以用三角法找到真实的位置(这会很容易找到物体的距离)但是用第二种方法的probem是匹配的,这意味着你怎么能找到一个物体的位置'x ' 如果您已经知道它在相机 1 中的位置,则在相机 2 中,在这里您可以使用 'SIFT' 算法。我只是给了你一些关键字希望它可以帮助你。
将已知大小的物体放在相机视野中。这样你就可以有一个更客观的度量来测量角距离。如果没有第二个视点/相机,您将仅限于估计尺寸/距离,但至少它不会是一个完整的猜测。