python - 如何从图像中的对象大小(以像素为单位)根据英寸厘米等测量值来测量现实世界中的对象大小?

标签 python opencv image-processing pixel

我已经从包含对象的图像中根据 像素 计算了对象大小。我想测量现实世界中的物体大小。有没有办法找出乘数来衡量实际尺寸?我目前正在使用 python 进行实现。

最佳答案

通常,您将使用相机获取图像,该相机通过镜头将 3 维场景转换到 2 维传感器上。垂直(高度)投影如下图所示(我假设是一个直线透镜):

Lens Scene to Sensor projection (Vertical axis)

您说您感兴趣的对象的高度(以图像的像素为单位)为 150 像素:

h_{obj} = 150 pixels

你说图像大小的总高度为 800 像素,假设这是传感器分辨率:

h_{sensor} = 800 pixels

您有兴趣找到距离相机D 处的对象H_{obj} 的公制实际高度。

弧度表示角度,我们可以建立以下关系:

D \cdot \theta = H_{obj} , f \cdot \theta = h_{obj}

其中 f 是镜头的焦距。

分离术语并替换我们到达 \frac{D}{f}\cdot h_{obj} = H_{obj}

但是您已经用像素表示了 h_{obj},而您希望 H_{obj} 以公制表示。因此,让我们首先从像素移动到毫米。

h_{obj} (mm) = \frac{h_{obj}(pixels)}{h_{sensor}(pixels)}\cdot h_{sensor} (mm)

假设您不知道传感器高度,因此我们暂时将其保留为变量。重新排列,将焦距表示为毫米 (mm) 并代入前面的方程式,我们有:

D \cdot \frac{h_{obj}(pixels)}{h_{sensor}(pixels)} \cdot \frac{h_{sensor}(mm)}{f(mm)} = H_{obj}

注意术语: \frac{h_{sensor}(mm)}{f(mm)} = \alpha (radians)

\alpha 表示相机的垂直视野(因为我们使用传感器高度),这是通常为相机和镜头计算提供的参数。

3dimensional Field of View

通常它以度数给出,所以我们只是将它转换为弧度。

\frac{V_{fov}º}{180º}\cdot \pi = V_{fov} (radians)

  • 如果您确实知道镜头的焦距和传感器的尺寸,只需直接计算视野即可。这给我们留下了以下等式:

H_{obj} = D \cdot \frac{h_{obj}(pixels)}{h_{sensor}(pixels)} \cdot V_{FOV} (radians)

视野是您缺少的参数,无法完成您的计算。为了完成这个例子,我们假设它是 90º:

V_{FOV} = \frac{\pi}{2} (radians)

您现在用来表示距离 D 的单位系统将定义 h_{obj} 的表示单位。

H_{obj} (meters) = D(meters) \cdot \frac{150}{800} \cdot \frac{\pi}{2}


另一种方法是,给定视场并假设使用直线镜头,您可以计算距相机指定距离处的像素高度和像素宽度。

距离D处的垂直分辨率

V_{resolution@D(meters)} \left(\frac{mm}{pixel}\right) = \frac{1000(mm)}{1(meter)} \cdot D (meters) \cdot \frac{V_{FOV}(radians)}{V_{sensor}(pixels)}


有关视野的更多信息:

关于python - 如何从图像中的对象大小(以像素为单位)根据英寸厘米等测量值来测量现实世界中的对象大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42035721/

相关文章:

python - 如何递归循环遍历文件结构并在python中重命名目录

python - OpenCV 和 Python 的书籍?

opencv - 在 Windows 上构建 opencv 3.1 - 我在哪里指定 LAPACK 库位置?

c++ - 图像分辨率大于1080 * 1080的OpenCV图像拼接

python - Flask 或 Werkzeug/0.9.4 破坏 POST 数据

python - 在 Flask 中获取请求负载的一致方法

image - 如何解释 1 bpp BMP 文件中的像素阵列

image-processing - 在 calchist opencv 中选择 channel

c++ - 下采样图像

python - Django/Python,在每个用户请求上调用特定的类/函数