2

我想测量两点之间的实际距离,比如路上有辆车在我前面,我和车辆之间的距离是多少?

我是这样进行的:

1)找到透视变换以获得顶视图。

2)然后试图找到距离。

问题是我无法获得正确的顶视图。

如果有任何替代方式,请告诉。

4

2 回答 2

5

要测量两个 3D 点之间的距离,您需要找到两个点的 3D 坐标。然后很容易计算欧几里得距离:

d(p1,p2)= sqrt{(p1_x - p2_x)^2+(p1_y - p2_y)^2+(p1_z - p2_z)^2}

这里的问题是在场景中找到对象的 3D 点(因为你知道你在哪里,在相机,参考坐标)。

要找到 3D 位置,您需要找到单应性或相机姿势。为此,您需要在场景中检测至少 4 个点,这些点与您先验知道的已知模型或图像的 4 个点相匹配。例如,如果您有汽车的 3D 模型,并且您能够检测场景中与您的 3D 模型相对应的真实汽车的点,您将能够计算单应变换,从而计算出车辆的 3D 位置。那些点。

无论如何这个问题很复杂,你需要使用很多算法来进行检测、匹配、校准,并且你需要知道你想要检测哪个对象。

于 2012-08-22T07:27:04.243 回答
2

问题比你想象的要难。即使在某些假设下:

  1. 整条路平坦(高度没有变化)。
  2. 车辆的像素位置是在其车轮接触地面(不是车顶)的点上测量的。如果你测量屋顶,距离可能是无穷大。
  3. 您的相机是固定不变的。

如果其中一个假设不成立,那么测量距离将非常困难。但如果他们确实持有,您需要执行以下操作:

  1. 将透视转换为顶视图对您没有帮助(因为根据定义透视会扭曲距离)。即使在俯视图中,光线也以透视方式移动。您需要的是“正交”投影。它模拟了相机处于无限高度+无限大变焦时的顶视图。就像您在卫星图像或地图中看到的一样。
  2. 你问为什么需要这么奇怪的转变?正交变换和透视变换之间的区别在于,在透视中,对象之间的距离取决于 tan(a),而在正交变换中则取决于 sin(a)。a - 是距离线(两点之间的线)占据的相机视野角度。当 'a' 是一个比 tan('a') = sin('a') 非常小的角度时,您可以使用保护变换。但是由于您的网络摄像头具有约 50 - 70 度的广角,您将能够通过仅在图像中心进行保护变换来准确计算距离。
  3. 此外,您必须在计算距离之前消除相机镜头失真。
  4. 所以第一步是校准你的相机和我们 cvUnDistort() 来纠正它的观点。
  5. 据我所知,openCV 中没有内置的正交变换。因此,您可以在校正后的图像上使用顶视图投影变换,但只有当两辆车都靠近图像中心时,您的距离才会准确。
  6. 您可以使用 unDisrtort() 实现正交变换,但这会花费您一些时间,因为您可能不熟悉相机模型和相机校准数学。在 unDistort() 中,您基本上应该插入与 sin('a') 匹配的泰勒展开级数的系数,即 a,-a^2/2,... 等...

无论如何,正如我之前所说,测量距离是一个非常困难的问题。我建议以下简单但不太准确的解决方案:

  1. 校正镜头畸变
  2. 应用顶视图投影变换
  3. 如果您发现当车辆远离图像中心时距离测量会产生错误,请尝试添加手动校正。您可以在此处找到几乎可以满足您的需求的开源: http ://code.google.com/p/signfinder/wiki/HowSignfinderWorks 该软件检测街道名称标志,并应用投影校正以便能够阅读文本. 希望它有所帮助
于 2012-08-22T07:00:04.063 回答