基于相机内参矩阵与目标深度计算像素空间分辨率(mm)
如何通过相机内参K和深度计算像素的空间分辨率?
问题描述
已知描述像素单位焦距与x、y偏移量的相机内参矩阵K,以及图像中某像素的深度(单位:mm),能否计算出图像中每个像素的空间分辨率(单位:mm)?想了解单个方形像素在真实空间中对应的尺寸,例如在25mm深度下,1个方形像素可能对应10mm×10mm的真实区域。
结论
完全可以计算,你的思路方向正确,但可以通过直接推导简化计算过程,无需求内参矩阵的逆。
推导过程
核心投影公式修正
先修正针孔相机投影的标准齐次坐标公式:[u, v, 1] = (1/z) * K * [x, y, z]
其中标准3x3内参矩阵为:K = np.asarray([[f_x, 0, c_x], [0, f_y, c_y], [0, 0, 1]])
f_x/f_y:x/y方向的焦距(单位:像素)c_x/c_y:主点坐标(图像中心偏移,单位:像素)(x,y,z):真实空间点坐标(单位:mm,z为深度)(u,v):图像像素坐标
从公式反推空间坐标与像素的关系:
x = z * (u - c_x) / f_x y = z * (v - c_y) / f_y
计算像素空间分辨率
直接计算相邻像素的空间差值:
- 水平方向:当u增加1、v不变时,空间x的变化量为:
Δx = z * [(u+1 - c_x)/f_x - (u - c_x)/f_x] = z / f_x - 垂直方向:当v增加1、u不变时,空间y的变化量为:
Δy = z * [(v+1 - c_y)/f_y - (v - c_y)/f_y] = z / f_y
单个像素对应的真实空间尺寸为 Δx × Δy:
- 若为方形像素(相机传感器像素为方形,此时
f_x = f_y),则尺寸为(z/f_x) × (z/f_x)平方毫米。
与你的思路对比
你通过内参逆矩阵计算相邻像素空间差的思路是正确的,本质和上述推导结果一致,但直接推导无需计算矩阵逆,效率更高。
代码实现示例
import numpy as np # 示例相机内参(焦距为像素单位) f_x = 1000.0 f_y = 1000.0 c_x = 500.0 c_y = 500.0 K = np.array([[f_x, 0, c_x], [0, f_y, c_y], [0, 0, 1]]) # 目标像素的深度(单位:mm) z = 25.0 # 计算空间分辨率 delta_x = z / f_x delta_y = z / f_y print(f"水平分辨率:{delta_x} mm/像素") print(f"垂直分辨率:{delta_y} mm/像素") print(f"单个方形像素对应真实区域:{delta_x * delta_y} 平方毫米")
输出示例
水平分辨率:0.025 mm/像素
垂直分辨率:0.025 mm/像素
单个方形像素对应真实区域:0.000625 平方毫米
注意事项
- 若
f_x != f_y,说明像素非严格方形,需分别计算水平、垂直方向的分辨率 - 深度z必须是对应像素的真实深度(若为深度图,每个像素的z不同,分辨率会随深度变化)
- 内参K的焦距必须是像素单位,若为物理焦距(mm),需先转换:
f_x = (物理焦距 × 图像宽度) / 传感器宽度,f_y同理
内容的提问来源于stack exchange,提问作者BeginnersMindTruly
相关产品推荐
相关产品推荐

