Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你如何判断图片中物体的(真实世界)距离? 我在C++中建立了一个识别程序,为了使它更健壮,我需要能够找到一个物体在图像中的距离。p>_C++_Math_Computer Vision_Mathematical Expressions - Fatal编程技术网

你如何判断图片中物体的(真实世界)距离? 我在C++中建立了一个识别程序,为了使它更健壮,我需要能够找到一个物体在图像中的距离。p>

你如何判断图片中物体的(真实世界)距离? 我在C++中建立了一个识别程序,为了使它更健壮,我需要能够找到一个物体在图像中的距离。p>,c++,math,computer-vision,mathematical-expressions,C++,Math,Computer Vision,Mathematical Expressions,假设我有一张照片,它是在距离8.5x11照片22.3英寸的地方拍摄的。系统在尺寸为319像素×409像素的方框中正确识别该图片。 将实际高度和宽度(AH和AW)以及像素高度和宽度(PH和PW)与距离(D)联系起来的有效方法是什么 我假设当我实际使用该方程时,PH和PW将与D成反比,而AH和AW是常数(因为识别的对象将始终是用户可以指示宽度和高度的对象)。这可能不是一个完整的答案,但可能会将您推向正确的方向。你有没有看过美国宇航局在太空拍摄的照片上是怎么做到的?他们在图像上画满了小十字架。就我所知

假设我有一张照片,它是在距离8.5x11照片22.3英寸的地方拍摄的。系统在尺寸为319像素×409像素的方框中正确识别该图片。
将实际高度和宽度(AH和AW)以及像素高度和宽度(PH和PW)与距离(D)联系起来的有效方法是什么


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

这可能不是一个完整的答案,但可能会将您推向正确的方向。你有没有看过美国宇航局在太空拍摄的照片上是怎么做到的?他们在图像上画满了小十字架。就我所知,他们就是这样对物体的大小和深度有了一个合理的认识的。解决方案可能是,在图片中有一个您知道正确大小和深度的对象,然后计算其他对象相对于该对象的大小和深度。你该做些调查了。如果NASA就是这样做的,那么它应该值得一看


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

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

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)关联,其中:

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

您可以从这些方程中的任何一个恢复Z参数(或取两者的平均值)。请注意,Z参数不是到对象的距离(在对象的不同点上不同),而是对象的深度(摄影机平面和对象平面之间的距离)。但我想这正是你想要的

[1] 线性N点相机姿势确定,龙泉和钟丹兰

[2] 摄像机姿态确定的完整线性四点算法,李洪志和唐建良


(3)

< P>如果你知道真实物体的大小和相机的视角,然后假设你知道水平视角α(*),图像的水平分辨率是XRE,那么距离图像DW在图像中间是XP像素宽的物体,现实世界中的xw米宽可以推导如下(您的情况如何?):

(*)alpha=摄影机轴与穿过图像中间行最左侧点的直线之间的角度,该点刚好可见

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

这里涉及的变量更多。所用相机的视角(焦距)是多少?图像中的有效像素数和纵横比。图像被裁剪了吗?它在清晰的焦点上吗?(改变焦点会稍微影响视角)。我相信基于视角、像素密度和距离,可以得出一个公式。另外,请注意,当图片/对象靠近相机时,即使距离D的微小差异也会使覆盖的像素数产生相对较大的差异。请注意,如果拍摄的对象是8英尺乘11英尺且平坦的,则距离中心22英尺的相机将距离角点23英尺。说相机离这样一个物体有22.3英尺远,这是一种超出现实的精确说法。@m阿尔特斯:我认为把像相机轴线上的距离这样的东西称为“距离”,并尽可能精确地测量它,似乎是完全合理的
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))