Calibration
8/11/25
Homography
单应性变换,两个平面之间的映射。
Rigid Body Transformation
刚体:在三维空间中保持形状和体积不变的物体,可以进行平移和旋转。
刚体变换:描述刚体在三维空间中的位置和姿态变化,包括旋转和平移。从一个坐标系到另一个坐标系的映射关系。
标定与配准基础概念与流程
基础概念
相机内参矩阵(Camera Intrinsic Matrix, )
- 用于将三维相机坐标 转换为二维像素坐标 。
- 公式:
相机外参矩阵(Camera Extrinsic Matrix, )
- 用于将三维世界坐标 转换为相机坐标 。
- 公式:
反向坐标映射
- 可以通过求逆矩阵,将像素坐标还原为相机坐标,或将相机坐标还原为世界坐标。
标定与配准流程
已知信息
- Meta Quest 3:内参矩阵 ,外参矩阵
- RealSense:内参矩阵 (外参 不用)
目标
- 统一所有相机到Meta世界坐标系。
- 关键问题:如何将RealSense图像像素转换为Meta世界坐标下的三维位置。
主要步骤
读取棋盘格图像对
- 检查两台相机的图像帧是否同步,若不同步则等间隔抽取相同数量的图像对。
提取棋盘格角点像素坐标
- 用OpenCV函数分别提取每对图像的角点像素坐标 和 。
- 只保留角点数量一致的图像对。
像素坐标转三维相机坐标
- 用各自相机的内参矩阵将像素坐标转换为三维相机坐标:
- 其中 为深度(可由PnP或深度相机获得)。
- 用各自相机的内参矩阵将像素坐标转换为三维相机坐标:
刚体变换矩阵T的估计(SVD)
- 用SVD算法,从大量点对中估计RealSense到Meta相机坐标之间的刚体变换矩阵 。
- 公式:
最终映射公式
- 将RealSense像素映射到Meta世界坐标:
- 将RealSense像素映射到Meta世界坐标:
如果使用远大于真实深度的常数d会发生什么?
所有像素点会被拉伸到远处的一个大平面上
如果使用远小于真实深度的常数d会发生什么?
所有像素点会被压缩到近处的一个小平面上
为什么演示时需要深度 ,录棋盘时不要?
这是因为两种场景的已知条件不同:
- 录棋盘时(标定/配准)
你已经知道棋盘格每个角点在世界坐标系下的三维位置(),
通过 cv2.solvePnP 等方法,直接用这些已知的三维点和像素点来反推出相机的外参(位姿),不需要假设深度 ,因为三维点的深度是已知的。 - 像素坐标转换演示时
你只有一个像素点 ,并不知道它在三维空间中的真实深度 。
要把像素点还原为三维相机坐标,必须假设或给定一个深度 ,否则无法唯一确定该点在三维空间中的位置(因为一条像素射线有无数个点)。
这时 是你人为指定的一个值(比如 mm),只是为了演示整个变换流程。
具体步骤
准备标定板参数和相机内参
- 设置棋盘格的内角点数量和实际物理尺寸(如 ,)。
- 配置 RealSense 和 Quest3 相机的内参矩阵、畸变参数、图像缩放比例和图片文件夹路径。
检测棋盘格角点
- 对每张图片,使用 OpenCV 检测棋盘格角点。
- 可选:对 Quest3 图像进行 gamma 矫正。
- 若检测成功,亚像素级优化角点坐标,并调整内参以适应缩放。
计算每帧的相机位姿
- 对每对有效的棋盘格角点,使用
cv2.solvePnP
结合内参和畸变参数,估算相机的旋转向量 和位移向量 。 - 旋转向量 可用 Rodrigues 公式转为旋转矩阵 。
- 对每对有效的棋盘格角点,使用
将棋盘格世界坐标点转换到相机坐标系
- 对每个三维世界点 ,用旋转和平移变换到相机坐标系:
- 对每个三维世界点 ,用旋转和平移变换到相机坐标系:
收集所有有效帧的点对
- 对于每对同步的 RealSense 和 Quest3 图像,提取并配对所有角点的三维相机坐标。
用 SVD 估计刚体变换矩阵
- 设 RealSense 点为 ,Quest3 点为 ,用 SVD 算法求解刚体变换 (旋转 、平移 ):
- 具体步骤:
- 计算两组点的质心
- 去中心化:,
- 计算协方差矩阵
- SVD 分解
- 旋转矩阵
- 平移向量
- 刚体变换矩阵 为:
- 设 RealSense 点为 ,Quest3 点为 ,用 SVD 算法求解刚体变换 (旋转 、平移 ):
验证变换精度
- 将 RealSense 的点用变换矩阵映射到 Quest3 坐标系,计算与实际 Quest3 点的误差:
- 统计平均误差、标准差、最大/最小误差。
- 将 RealSense 的点用变换矩阵映射到 Quest3 坐标系,计算与实际 Quest3 点的误差:
保存结果
- 将变换矩阵、旋转矩阵、平移向量、误差统计等保存为 npz 和 json 文件,便于后续使用。
像素坐标转换演示
- 给定 RealSense 像素坐标 和深度 ,先转为相机坐标:
- 用变换矩阵 映射到 Quest3 相机坐标:
- 再投影回 Quest3 像素坐标:
- 给定 RealSense 像素坐标 和深度 ,先转为相机坐标:
使用方法
Inputs
src_img
: Source imagesrc_K
: Source camera intrinsic matrixdst_K
: Destination camera intrinsic matrixT
: Homogeneous transformation matrix from source to destination camera其中表示三维空间中的刚体变换群,包含所有三维旋转和平移的组合。
out_shape
: Output dimensionsdepth
: Assumed depth value (default=500)
Algorithm Steps
Generate Destination Pixel Grid:
Destination Pixels → Camera Coordinates:
Transform to Source Camera Frame:
Source Camera Coordinates → Pixels:
Image Sampling with Boundary Check:
Output
- Returns warped image