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

Aug*_*ust 6 c++ opencv distance

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

面向前

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

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

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

从非正向的透视图中查看目标矩形时会发生此问题:

不要面向前方

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

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

aba*_*rry 0

这是你所知道的:

  1. 左上角和右上角之间的距离(以英寸为单位) ( w_target)
  2. 2D 平面上这些角点之间的距离(以像素为单位)( p_target)

所以问题是你没有考虑到p_target矩形倾斜时的收缩距离。例如,当矩形旋转 45 度时,您将丢失 中大约一半的像素p_target,但您的公式假设w_target为常数,因此您高估了距离。

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

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