2. 坐标系基础:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换关系与齐次坐标表示
在3D线扫相机手眼标定中,理解四个坐标系之间的转换关系是构建标定数学模型的前提。任何空间点从真实世界到最终像素坐标的映射,都遵循一条严格的几何变换链。本章将逐一拆解每个坐标系的作用、变换公式以及齐次坐标的简洁表示方法。
2.1 四大坐标系概述
坐标系定义了一个空间点的参考基准。在机器视觉中,我们通常使用以下四个坐标系来描述从三维场景到二维图像的完整映射过程:
| 坐标系 | 维度 | 单位 | 原点与定义 |
|---|---|---|---|
| 世界坐标系 | 3D (Xw, Yw, Zw) | mm / m | 用户自定义的参考系,通常固定在标定板或机器人基座上 |
| 相机坐标系 | 3D (Xc, Yc, Zc) | mm / m | 原点在相机光心,Zc轴沿光轴指向场景前方 |
| 图像坐标系 | 2D (x, y) | mm | 原点在光轴与成像平面的交点(主点),x/y轴平行于相机坐标系的Xc/Yc |
| 像素坐标系 | 2D (u, v) | pixel | 原点在图像左上角,u轴向右,v轴向下 |
关键认知: 世界坐标系是“真实世界”的度量,像素坐标系是“图像存储”的度量。标定的本质就是求解从世界坐标到像素坐标的精确映射参数。
2.2 坐标系转换链路与齐次坐标
完整的转换链路为:世界坐标系 → 相机坐标系 → 图像坐标系 → 像素坐标系。每一步都对应一个独立的变换矩阵,而齐次坐标是串联这些变换的数学工具。
2.2.1 齐次坐标简介
齐次坐标将n维向量用n+1维向量表示。对于3D点 (X, Y, Z),其齐次坐标为 (X, Y, Z, 1)。使用齐次坐标的核心优势在于:旋转、平移、缩放、透视投影都可以统一为矩阵乘法,避免了非线性的加法运算。
2.2.2 世界坐标系 → 相机坐标系(刚体变换)
该变换描述相机在世界坐标系中的位姿(位置+姿态),包含旋转R(3x3矩阵)和平移t(3x1向量)。
| Xc | | R11 R12 R13 tx | | Xw |
| Yc | = | R21 R22 R23 ty | * | Yw |
| Zc | | R31 R32 R33 tz | | Zw |
| 1 | | 0 0 0 1 | | 1 |
简写为:P_c = [R | t] * P_w,其中[R|t]为3x4外参矩阵。
2.2.3 相机坐标系 → 图像坐标系(透视投影)
基于小孔成像模型,将3D点投影到成像平面。焦距f是相机内参的核心参数。
x = f * (Xc / Zc)
y = f * (Yc / Zc)
齐次矩阵形式(3x4投影矩阵):
| x' | | f 0 0 0 | | Xc |
| y' | = | 0 f 0 0 | * | Yc |
| z' | | 0 0 1 0 | | Zc |
| 1 |
实际图像坐标:x = x' / z',y = y' / z'。
2.2.4 图像坐标系 → 像素坐标系(仿射变换)
将物理毫米坐标离散化为像素坐标。涉及主点偏移(u0, v0)和像素尺寸(dx, dy)。
u = x / dx + u0
v = y / dy + v0
齐次矩阵形式:
| u | | 1/dx 0 u0 | | x |
| v | = | 0 1/dy v0 | * | y |
| 1 | | 0 0 1 | | 1 |
2.3 内参矩阵与外参矩阵
将上述所有变换合并,得到从世界坐标到像素坐标的完整投影方程:
| u | | fx 0 u0 0 | | R11 R12 R13 tx | | Xw |
| v | = | 0 fy v0 0 | * | R21 R22 R23 ty | * | Yw |
| 1 | | 0 0 1 0 | | R31 R32 R33 tz | | Zw |
| 0 0 0 1 | | 1 |
其中:
- 内参矩阵 K(3x3):
[[fx, 0, u0], [0, fy, v0], [0, 0, 1]],fx=f/dx, fy=f/dy。 - 外参矩阵 [R|t](3x4):描述世界坐标系到相机坐标系的刚体变换。
标定目标: 通过拍摄已知世界坐标的标定板图像,求解内参矩阵K和外参矩阵[R|t]中的未知参数。对于线扫相机,还需要额外考虑单线扫描的畸变与运动补偿。
2.4 坐标系转换关系总览(SVG)
2.5 线扫相机的坐标系特殊性
与面阵相机不同,线扫相机每次只采集一行像素。其坐标系转换在Y方向(扫描方向)引入了运动维度:
- 图像坐标系:只有x方向(线方向)有物理意义,y方向由编码器触发的行数累积决定。
- 像素坐标系:u方向对应线阵的像素索引,v方向对应扫描行号。
- 外参标定:需要同时标定相机相对于世界坐标系的位姿,以及运动轴的方向与速度比例。
常见误区: 初学者容易将线扫相机的v坐标直接等同于世界坐标系的Yw。实际上,v坐标是时间累积的结果,必须结合运动速度与编码器分辨率才能换算为物理距离。
2.6 坐标系转换的Python实现片段
以下代码演示了使用齐次坐标进行坐标系转换的核心逻辑:
import numpy as np
def world_to_pixel(P_w, K, R, t):
"""
将世界坐标点转换为像素坐标
:param P_w: 世界坐标点 (3,) 或 (N, 3)
:param K: 内参矩阵 (3, 3)
:param R: 旋转矩阵 (3, 3)
:param t: 平移向量 (3, 1)
:return: 像素坐标 (u, v)
"""
# 构建外参矩阵 [R|t] (3x4)
Rt = np.hstack((R, t.reshape(3, 1)))
# 世界坐标转齐次 (4,)
P_w_h = np.append(P_w, 1)
# 转换到相机坐标系 (3,)
P_c = Rt @ P_w_h
# 透视投影:相机坐标转图像坐标
x = P_c[0] / P_c[2]
y = P_c[1] / P_c[2]
# 图像坐标转像素坐标
u = K[0, 0] * x + K[0, 2]
v = K[1, 1] * y + K[1, 2]
return np.array([u, v])
# 示例:假设内参和外参已知
K = np.array([[1000, 0, 320],
[0, 1000, 240],
[0, 0, 1]])
R = np.eye(3)
t = np.array([0, 0, 500]) # 相机在世界坐标系中沿Z方向偏移500mm
point_3d = np.array([50, 30, 0]) # 世界坐标点
uv = world_to_pixel(point_3d, K, R, t)
print(f"像素坐标: u={uv[0]:.1f}, v={uv[1]:.1f}")
2.7 本章要点总结
| 概念 | 关键公式/矩阵 | 维度 | 标定中作用 |
|---|---|---|---|
| 世界→相机 | P_c = [R|t] * P_w | 3x4 | 求解相机位姿(外参) |
| 相机→图像 | x = f*Xc/Zc, y = f*Yc/Zc | 非线性 | 建立投影模型 |
| 图像→像素 | u = x/dx + u0, v = y/dy + v0 | 2D仿射 | 离散化与主点偏移 |
| 齐次坐标 | (X, Y, Z, 1) | 4D | 统一矩阵乘法 |