我正在用C++构建一个识别程序,为了使其更加稳健,我需要能够找到图像中物体的距离。
比如说,我有一张距离一张8.5 x 11照片22.3英寸的图像。系统正确地识别出了该图片,并在一个尺寸为319像素乘以409像素的框中显示出来。
那么,将实际高度和宽度(AH和AW)与像素高度和宽度(PH和PW)联系起来以获得距离(D)的有效方法是什么?
我假设当我实际使用这个方程时,PH和PW将与D成反比例关系,而AH和AW是常数(因为所识别的物体总是用户可以指定宽度和高度的对象)。
我正在用C++构建一个识别程序,为了使其更加稳健,我需要能够找到图像中物体的距离。
比如说,我有一张距离一张8.5 x 11照片22.3英寸的图像。系统正确地识别出了该图片,并在一个尺寸为319像素乘以409像素的框中显示出来。
那么,将实际高度和宽度(AH和AW)与像素高度和宽度(PH和PW)联系起来以获得距离(D)的有效方法是什么?
我假设当我实际使用这个方程时,PH和PW将与D成反比例关系,而AH和AW是常数(因为所识别的物体总是用户可以指定宽度和高度的对象)。
现在你可能不想亲自编写所有内容,你可以使用计算机视觉库,如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
# 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))
这可能不是一个完整的答案,但可以为您指明正确的方向。你见过NASA在太空图片上是如何做的吗?他们在图像上放置了许多小十字架。据我所知,这是他们获得物体深度和大小的公平想法的方式。解决方案可能是在图片中有一个您知道正确大小和深度的物体,然后相对于它计算其他物体的大小和深度。现在是时候进行一些研究了。如果NASA是这样做的,那么值得一试。
我必须说,这是我在stackoverflow上很长时间以来看到的最有趣的问题之一:D。我注意到您只附加了两个与此问题相关的标签。添加更多与图像相关的内容可能会更好地帮助您。