datetime:2025/02/06 15:22
author:nzb
三维空间中的点投影到二维图像平面
在相机成像过程中,内参(Intrinsic Parameters) 的作用是将三维空间中的点投影到二维图像平面,其核心是建立相机坐标系到像素坐标系的映射关系。以下是详细步骤和公式:
一、相机内参的定义
内参矩阵(K)通常表示为:
- :焦距(以像素为单位,可能因图像传感器非正方形像素存在差异)
- :主点(图像坐标系原点的像素坐标,通常为图像中心)
- 若图像传感器为理想正方形(无畸变),则 。
二、投影过程(3D→2D)
假设有一个三维点 (在相机坐标系下),投影到像素坐标 的步骤如下:
归一化坐标
将相机坐标系下的点投影到归一化平面 ( 平面):应用畸变校正(可选)
若存在径向畸变或切向畸变,需对 , y 进行修正(以径向畸变为例):其中 为畸变系数。
转换为像素坐标
通过内参矩阵将归一化坐标映射到像素坐标系:写成矩阵形式:
三、完整投影流程(含外参)
若已知三维点在世界坐标系下的坐标 ,需先用外参(旋转矩阵 和平移向量 将其转换到相机坐标系:
再按上述步骤投影到像素坐标。
四、代码示例(Python/OpenCV)
使用OpenCV的 projectPoints
函数实现投影:
import cv2
import numpy as np
# 定义相机内参和畸变系数
K = np.array([[fx, 0, cx],
[0, fy, cy],
[0, 0, 1]])
dist_coeffs = np.array([k1, k2, p1, p2, k3]) # 畸变系数
# dist_coeffs = np.zeros((5, 1), dtype=np.float32) # 无畸变假设
# 定义三维点(相机坐标系下,假设 Z_c > 0)
point_3d = np.array([[X_c, Y_c, Z_c]], dtype=np.float32)
# 投影到像素坐标(若需要畸变校正)
point_2d, _ = cv2.projectPoints(point_3d,
np.zeros(3), # 外参旋转(假设无旋转) np.eye(3, dtype=np.float32)
np.zeros(3), # 外参平移(假设无平移) np.zeros((3, 1), dtype=np.float32)
K,
dist_coeffs)
u, v = point_2d[0][0]
print(f"像素坐标:({u:.1f}, {v:.1f})")
# 无畸变,直接用内参矩阵算
K = np.array([[fx, 0, cx],
[0, fy, cy],
[0, 0, 1]])
x = x1 / z1 * K[0, 0] + K[0, 2]
y = y1 / z1 * K[1, 1] + K[1, 2]
五、注意事项
- 深度信息(Z_c):投影时需确保 ,否则无法归一化。
- 畸变校正顺序:先校正畸变,再应用内参矩阵。
- 外参与内参分离:外参描述相机姿态,内参描述相机固有属性,两者需分开标定。
总结:相机内参通过焦距和主点将归一化的三维点映射到像素坐标,结合外参可实现从世界坐标到像素坐标的完整投影。实际应用中需考虑畸变校正以提高精度。