datetime:2025/02/06 15:22
author:nzb

三维空间中的点投影到二维图像平面

在相机成像过程中,内参(Intrinsic Parameters) 的作用是将三维空间中的点投影到二维图像平面,其核心是建立相机坐标系到像素坐标系的映射关系。以下是详细步骤和公式:


一、相机内参的定义

内参矩阵(K)通常表示为:

  • :焦距(以像素为单位,可能因图像传感器非正方形像素存在差异)
  • :主点(图像坐标系原点的像素坐标,通常为图像中心)
  • 若图像传感器为理想正方形(无畸变),则

二、投影过程(3D→2D)

假设有一个三维点 (在相机坐标系下),投影到像素坐标 的步骤如下:

  1. 归一化坐标
    将相机坐标系下的点投影到归一化平面 ( 平面):

  2. 应用畸变校正(可选)
    若存在径向畸变或切向畸变,需对 , y 进行修正(以径向畸变为例):

    其中 为畸变系数。

  3. 转换为像素坐标
    通过内参矩阵将归一化坐标映射到像素坐标系:

    写成矩阵形式:


三、完整投影流程(含外参)

若已知三维点在世界坐标系下的坐标 ,需先用外参(旋转矩阵 和平移向量 将其转换到相机坐标系:

再按上述步骤投影到像素坐标。


四、代码示例(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]

五、注意事项

  1. 深度信息(Z_c):投影时需确保 ,否则无法归一化。
  2. 畸变校正顺序:先校正畸变,再应用内参矩阵。
  3. 外参与内参分离:外参描述相机姿态,内参描述相机固有属性,两者需分开标定。

总结:相机内参通过焦距和主点将归一化的三维点映射到像素坐标,结合外参可实现从世界坐标到像素坐标的完整投影。实际应用中需考虑畸变校正以提高精度。

results matching ""

    No results matching ""