【问题标题】:How do you judge the (real world) distance of an object in a picture?您如何判断图片中物体的(现实世界)距离?
【发布时间】:2023-04-01 21:35:01
【问题描述】:

我正在用 C++ 构建一个识别程序,为了使其更加健壮,我需要能够找到图像中物体的距离。

假设我有一张在 8.5 x 11 图片 22.3 英寸外拍摄的图像。系统可以正确识别尺寸为 319 x 409 像素的框中的图片。
将实际高度和宽度(AH 和 AW)以及像素高度和宽度(PH 和 PW)与距离(D)相关联的有效方法是什么?

我假设当我实际使用方程时,PH 和 PW 将与 D 成反比,而 AH 和 AW 是常数(因为识别的对象将始终是用户可以指示宽度和高度的对象) .

【问题讨论】:

  • 这里涉及的变量比较多。所用相机的视角(焦距)是多少?图像中的有效像素数和纵横比。图像被裁剪了吗?焦点是否清晰? (改变焦点会稍微影响视角)。我相信根据视角、像素密度和距离,可以得出一个公式。另外,请注意,当图片/对象靠近相机时,即使距离 D 的微小差异也会在所覆盖的像素数量上产生相对较大的差异。
  • 请注意,如果拍摄的对象是 8' x 11' 且平坦,则距离中心 22' 的相机将距离角落 23'。说相机距离这样的物体 22.3' 远超出现实。
  • @MSalters:对我来说,将诸如沿相机轴的距离称为“距离”并尽可能准确地测量它似乎是完全合理的。
  • 唯一缺少的变量是视角。如果您知道可以使用我在下面的答案来计算距离。

标签: c++ math computer-vision mathematical-expressions


【解决方案1】:

我不知道你是否在某个时候改变了你的问题,但我的第一个答案对于你想要的来说非常复杂。您可能可以做一些更简单的事情。

1) 长而复杂的解决方案(更一般的问题)

首先你需要知道物体的大小。

您可以查看计算机视觉算法。如果您知道对象(其尺寸和形状)。您的主要问题是姿势估计问题(即找到物体相对于相机的位置),您可以从中找到距离。可以看[1][2](比如有兴趣可以找其他文章)或者搜索POSIT、SoftPOSIT。您可以将问题表述为优化问题:找到姿势以最小化真实图像和预期图像之间的“差异”(给定估计姿势的对象投影)。这个差值通常是每个图像点 Ni 与当前参数对应的对象(3D)点 Mi 的投影 P(Mi) 之间的(平方)距离之和。

从中可以提取距离。

为此,您需要校准您的相机(粗略地说,找到像素位置和视角之间的关系)。

现在您可能不想自己编写所有这些代码,您可以使用 OpenCV、Gandalf [3] 等计算机视觉库 ...

现在您可能想做一些更简单(和近似)的事情。如果您可以找到距相机相同“深度”(Z)的两点之间的图像距离,您可以将图像距离 d 与实际距离 D 相关联:d = a D/Z(其中 a 是与焦距相关的相机,您可以使用相机校准找到的像素数)

2) 简短的解决方案(针对您的简单问题)

但这是(简单、简短)的答案:如果您在与“相机平面”平行的平面上拍摄(即它完全面向相机),您可以使用:

PH = a AH / Z
PW = a AW / Z

其中 Z 是图片平面的深度,a 是相机的内在参数。

作为参考,针孔相机模型将图像坐标 m=(u,v) 与世界坐标 M=(X,Y,Z) 相关联:

m   ~       K       M

[u]   [ au as u0 ] [X]
[v] ~ [    av v0 ] [Y]
[1]   [        1 ] [Z]

[u] = [ au as ] X/Z + u0
[v]   [    av ] Y/Z + v0

其中“~”表示“与”成比例,K 是相机的内在参数矩阵。您需要进行相机校准才能找到 K 参数。这里我假设 au=av=a 和 as=0。

您可以从这些方程中的任何一个中恢复 Z 参数(或取两者的平均值)。请注意,Z参数不是与物体的距离(在物体的不同点上有所不同),而是物体的深度(相机平面与物体平面之间的距离)。但我想这就是你想要的。

[1] 线性N点相机位姿确定,龙泉和中单蓝

[2] 一种用于相机姿态确定的完全线性四点算法,Lihong Zhi 和 Jianliang Tang

[3]http://gandalf-library.sourceforge.net/

【讨论】:

    【解决方案2】:

    如果你知道真实世界物体的大小和相机的视角那么假设你知道水平视角alpha(*),图像的水平分辨率是xres,那么距离dw到图像中间的一个物体,在图像中宽 xp 像素,在现实世界中宽 xw 米,可以如下推导(你的 trigonometry 怎么样?):

    # Distance in "pixel space" relates to dinstance in the real word 
    # (we take half of xres, xw and xp because we use the half angle of view):
    (xp/2)/dp = (xw/2)/dw 
    dw = ((xw/2)/(xp/2))*dp = (xw/xp)*dp (1)
    
    # we know xp and xw, we're looking for dw, so we need to calculate dp:
    # we can do this because we know xres and alpha 
    # (remember, tangent = oposite/adjacent):
    tan(alpha) = (xres/2)/dp
    dp = (xres/2)/tan(alpha) (2)
    
    # combine (1) and (2):
    dw = ((xw/xp)*(xres/2))/tan(alpha)
    # pretty print:
    dw = (xw*xres)/(xp*2*tan(alpha))
    

    (*) alpha = 相机轴与穿过图像中间行最左边点的直线之间的夹角。

    链接到您的变量: dw = D, xw = AW, xp = PW

    【讨论】:

      【解决方案3】:

      这可能不是一个完整的答案,但可能会将您推向正确的方向。见过 NASA 是如何处理这些来自太空的照片的吗?他们在图像上都有那些小十字架的方式。据我所知,这就是他们如何对物体的深度和大小有一个公平的认识。解决方案可能是让您知道图片中正确大小和深度的对象,然后计算其他对象的相对值。是时候做一些研究了。如果这就是 NASA 的做法,那么它应该值得一试。

      我不得不说这是我在 stackoverflow 上看到的最有趣的问题之一:D。我刚刚注意到您在这个问题上只附加了两个标签。添加更多与图像相关的内容可能会对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-29
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        相关资源
        最近更新 更多