在OpenCV中查找具有已知宽高比的矩形的距离

时间:2016-01-29 17:02:58

标签: c++ opencv distance

我正在开发一个OpenCV程序来查找从相机到具有已知宽高比的矩形的距离。从正面视图中查找到矩形的距离可以正常工作:

forward-facing

实际距离非常接近于此计算的距离:

            wtarget · pimage
d = c ——————————————————————————
       2 · ptarget · tan(θfov / 2)

w target 是目标的实际宽度(以英寸为单位), p image 是整个图像的像素宽度, p target 是检测到的四边形的最大宽度(以像素为单位)的长度,θ fov 是我们摄像头的FOV。然后乘以一些常数 c

从非正向的视角查看目标矩形时会出现问题:

not forward-facing

这两个方向之间的实际距离差异很小,但检测到的距离相差近2英尺。

我想知道的是如何一致地计算距离,考虑到不同的透视角度。我已经尝试了getPerspectiveTransform,但这需要我知道目标的最终比例 - 我只知道纵横比。

1 个答案:

答案 0 :(得分:0)

以下是您所知道的:

  1. 左上角和右上角之间的距离,以英寸为单位(w_target
  2. 2D平面上的像素之间的距离p_target
  3. 所以麻烦的是,当矩形处于一个角度时,你没有考虑p_target的缩小距离。例如,当矩形旋转45度时,p_target中的像素将丢失一半,但您的公式假设w_target是常量,因此您高估了距离。

    为了解决这个问题,你应该估计一下盒子转动的角度。我不确定从getPerspectiveTransform中提取信息的简单方法,但它可能是可能的。您可以设置约束优化,其中决策变量是距离和倾斜角度,并强制执行框中左右点之间的度量距离。

    最后,无论你在做什么,都应该确保你的相机已经过校准。根据您的应用程序,您可以使用AprilTags来解决问题。