这不完全是一个编程问题。我只是想知道您对数字图像处理中常见问题的处理方法。
假设您有一张 jpg 格式的几棵树的图像。您将如何找到每棵树的高度?照片是您唯一的输入。
我想知道你不必编码的方法。因此,您的答案是否含糊或非 DIP-ish 都没关系。
小修正:高度不必是树的实际高度。高度可以采用任何比例。但应该与图片中的所有对象一致。
这不完全是一个编程问题。我只是想知道您对数字图像处理中常见问题的处理方法。
假设您有一张 jpg 格式的几棵树的图像。您将如何找到每棵树的高度?照片是您唯一的输入。
我想知道你不必编码的方法。因此,您的答案是否含糊或非 DIP-ish 都没关系。
小修正:高度不必是树的实际高度。高度可以采用任何比例。但应该与图片中的所有对象一致。
是的,有可能。你所描述的是围绕它的整个行业,称为摄影测量
在这个领域有相当多的计算机视觉研究。假设您不知道相机约束,您将不得不对场景和相机做出假设,以确定达到比例因子的高度。请注意,如果没有相机限制或图像中的参考高度,就无法区分从远处拍摄的高大树木或近距离拍摄的矮树之间的差异。Criminisi的Single View Metrology工作是一个很好的开始。
使用摄影测量从图像中查找对象的大小很简单。摄影测量学是从照片进行测量的科学。为此,我们需要知道两件事,
以下是步骤:
校准相机
使用openCV校准相机。可以使用OpenCV calibrate.py工具和源码中提供的棋盘图案PNG生成校准矩阵。完成相机校准以找到相机参数。我用我的网络摄像头(为了校准我的网络摄像头)从多个角度拍摄了十多张棋盘照片。有关更多详细信息,请查看openCV 相机校准。
我们将从校准矩阵中得到 f_x,f_y,c_x,c_y。
检查您拍摄的照片的详细信息,您会发现照片的原始分辨率(heightXwidth),在它们的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/focal_length_of_camera
插入图像
插入您需要从中找到图像实际大小的图像。您应该知道物体和相机之间的距离。求图片的尺寸(height1Xwidth1)
以像素为单位查找对象大小
确定对象的大小(以像素为单位)。我只是使用距离公式来查找所选线的长度。您可以采用任何其他方法。
以较低的分辨率转换 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
假设它们的距离都相同,都是按比例计算的,你会想找到一个可以保证的单一测量单位。例如,如果照片中有一个人,同样比例相同,并且您知道他们正好有 6 英尺高,您可以使用它作为衡量标准。然后你拿它,计算有多少堆叠成树。比如你需要这个人的3.5,那么:
3.5 * 6 = 21
给你一棵 21 英尺高的树。
如果没有对所有内容的单一参考点,或者如果它们都在不同的尺度上,那么您需要的信息比您不去那里容易获得的信息要多得多。
我会依赖一个已知尺寸的物体出现在图片中。例如,一个男人。
或者,我们可以使用 EXIF 数据根据相机的传感器尺寸、镜头和使用的焦距对物体的尺寸进行逆向工程。这又取决于角度。当相机垂直于拍摄对象时,我们应该得到最准确的结果。
如果您的图像是 3*3 并且您想找出图像的大小(即 3x3..so 3x3 = 9),现在我们有 8 个像素,从 0 到 8。所以 9/8=(___)kb。
如果您想以 MB 为单位查找图像的大小,就像上面的示例一样,只需执行 (9/8)/(1024)=(----)MB..
所以你会得到 Mb 的结果。