你如何判断图片中物体的(真实世界)距离?

时间:2011-06-03 06:53:57

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

我正在使用C ++构建识别程序并使其更加健壮,我需要能够找到图像中对象的距离。

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

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

3 个答案:

答案 0 :(得分:4)

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

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是图片平面的深度,是相机的内部参数。

作为参考,针孔相机模型将图像协调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]完全线性4点摄像机姿态确定算法,Lihong Zhi和Jianliang Tang

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

答案 1 :(得分:2)

如果您知道现实世界物体的大小和相机的视角,那么假设您知道水平视角α(*),则图像的水平分辨率为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

答案 2 :(得分:1)

这可能不是一个完整的答案,但可能会推动你朝着正确的方向前进。曾经看过NASA如何在太空中拍摄这些照片?他们在图像上有这些微小十字架的方式。就我所知,他们如何对物体的深度和大小有一个公平的认识。解决方案可能是让对象知道图片中的正确大小和深度,然后计算其他对象。是时候做一些研究了。如果那就是美国宇航局做的那样,那么值得一试。

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