如何通过图像找到物体的高度?

21

这不完全是一个编程问题。我只是想知道你在数字图像处理中碰到的一个常见问题的解决方法。

假设你有一张几颗树的图片,比如说jpg格式。你会怎样找出每棵树的高度?该照片是你唯一的输入。

我想知道你的方法,而不是具体的代码。所以即使你的回答模糊或者不是DIP(数字图像处理)风格也无所谓。

小改正:高度不需要是树的实际高度。可以按任何比例尺度来测量。但是对于图片中所有对象应保持一致。


4
如果照片是您唯一的输入,那是无法完成的。考虑从近距离拍摄的盆景树和从远处拍摄的大型树木之间的区别。 - Jim Lewis
1
如果您从exif中获取日期和位置,那么您只需要进行一些阴影检测。然后,您就可以使用勾股定理计算高度了。 - zaf
@Jim Lewis-- 照片是否有关联的元数据,例如镜头信息和焦距?因为如果您知道树与照片之间的距离以及像素到英寸(或英尺或其他单位)的比例,那么将树与背景分开就是一个问题。 - mmr
1
基本上,您需要知道图像中物体的确切高度。然后,您可以将该确切高度与树木进行比较。 - Chase Florell
你需要在照片中有一些可以相对准确地获取大小的东西。我不确定数学上如何实现,但有一个iPhone应用程序可以使用图片中的信用卡来估算场景中物体的大小。也许类似的方法会对你有所帮助... - Sophtware
6个回答

8
是的,这是可能的。您所描述的内容已经形成了一个完整的行业,称为 摄影测量学

很抱歉,我不认为这个链接与答案有任何关系。不过这是一个不错的链接...... - Daij-Djan
4
不,我没有。仅仅提供维基百科的链接并不是一个答案。 - Daij-Djan

5
使用摄影测量学从图像中找到物体的大小非常简单。 摄影测量学是从照片中进行测量的科学。 为此,我们需要知道两件事:
- 相机和图像平面之间的距离(相机到物体的距离)。 - 焦距(以毫米和每毫米的像素数表示)或图像传感器的物理尺寸。
以下是步骤:
- 校准相机
使用OpenCV来校准相机。您可以使用OpenCV calibrate.py工具和提供在源代码中的棋盘图案PNG来生成校准矩阵。相机校准是为了找出相机参数。我使用网络摄像头从许多角度拍摄了大约十几张棋盘照片(以校准我的网络摄像头)。有关更多详细信息,请参见openCV camera calibration
我们将从校准矩阵中获得f_x、f_y、c_x、c_y。
检查你拍摄的照片的详细信息,你会发现照片的原始分辨率(高x宽),在它们的EXIF头文件中,你可以找到焦距值(f)。这些项目可能因你的相机而异。
每毫米像素
我们需要知道图像传感器上的每毫米像素(px/mm)。
f_x=f*m_x
f_y=f*m_y
由于每个公式有两个变量,我们可以解出m_x和m_y。我只是平均了f_x和f_y得到f_xy。
m=f_xy/相机焦距
插入图像
插入你需要找到实际图像大小的图像。你应该知道物体和相机之间的距离。找到图像的尺寸(高度1x宽度1)
找到像素中的物体大小
确定像素中物体的大小。我只是使用距离公式来找到所选线的长度。你可以采用任何其他方法。

将像素(px)转换为毫米(mm)在低分辨率下

pxpermm_in_lower_resolution = (width1*m)/width

图像传感器中物体的尺寸

size_of_object_in_image_sensor = object_size_in_pixels/(pxpermm_in_lower_resolution)

物体的实际尺寸

通过上述数据可以找到物体的实际尺寸,公式如下:

real_size = (dist*size_of_object_in_image_sensor)/focal_length


4

这个领域有相当多的计算机视觉研究。假设您不知道相机的约束条件,您将不得不对场景和相机进行假设,以确定高度,直到一个比例因子。请注意,在没有相机约束或图像中的参考高度的情况下,无法区分从远处拍摄的高树木和近距离拍摄的矮树木之间的区别。Criminisi的Single View Metrology工作是一个很好的起点。


谢谢你的回复。但是我不是在寻找确切的高度或其他什么东西。我只想知道物体的相对高度。相对于任何你想要的参照物。我该如何在图片中测量它呢? - Laz
你看了我提到的文档吗?它有那个确切的应用程序。 - jeff7

1

假设它们都距离相同,按比例缩放,您需要找到一个可以保证的单个测量单位。例如,如果照片中有一个人,同样的比例,并且您知道他们的确切身高为6英尺,那么您可以将其用作您的度量标准。然后,您取出它,并计算堆叠成树需要多少个。例如,如果您需要3.5个这样的人,则:

3.5 * 6 = 21

给你一棵高达21英尺的树。

如果没有一个单一的参考点,或者如果它们都在不同的比例尺上,你需要比你在那里时容易获得的更多信息。


0

我会依靠图像中已知尺寸的对象,例如一个人。

或者,我们可以利用EXIF数据根据相机传感器尺寸、镜头和使用的焦距反推出物体的大小。这又取决于角度。当相机垂直拍摄主题时,我们应该得到最准确的结果。


一个人的尺寸是未知的,除非你知道他正在站立和他的站立高度。 - mmr
听起来不错。但是你如何隔离每个对象?例如,从背景中分离出对象等。 - Laz

-4

如果您的图像是3*3,并且您想找出图像的大小(即3x3..所以3x3=9),现在我们有8个像素,从0到8。因此,9/8=( ___ )KB。

如果您想找出图像的大小(以MB为单位),就像上面的例子一样,只需这样做:(9/8)/(1024)=( ---- )MB。

因此,您将获得Mb的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接