3. 双摄标定基础
双摄融合的第一步,也是最关键的一步,就是标定。说白了,就是给两颗摄像头“对眼”,让它们知道彼此在三维空间里的位置关系。如果这一步没做好,后面的融合算法再牛也白搭。我在项目里见过不少团队,算法调得飞起,结果一上板子画面重影严重,最后查来查去,发现是标定文件里一个参数写错了。
这一章,我们就把双摄标定的底裤扒干净。从张正友标定法的核心原理,到双摄相对位姿的R、T矩阵,再到高通平台上的QCARCameraCalibration工具实战,最后教你读懂那个神秘的.calib文件。
3.1 张正友标定法:单摄内参是怎么算出来的?
双摄标定的基础是单摄标定。你得先知道每颗摄像头自己的“脾气”——也就是内参。张正友标定法是目前最主流的做法,它用一张棋盘格搞定一切。
核心思想其实很简单:
- 世界坐标系:棋盘格上的角点坐标,我们认为是已知的(比如每个格子30mm)。
- 像素坐标系:摄像头拍到的图像上,这些角点的像素坐标。
- 单应性矩阵H:通过至少4个对应点,解出世界坐标到像素坐标的投影关系。
- 分解H:从多个不同角度的H矩阵中,解耦出内参矩阵K和外参(旋转R、平移t)。
嗯,这里要注意,张正友法假设棋盘格是平面(Z=0),所以才能简化计算。我刚开始做的时候,有次打印的棋盘格没贴平,翘了个角,结果标出来的焦距偏差了5%。从那以后,我每次贴棋盘格都要用胶带压得死死的。
内参矩阵K长这样:
K = [fx, 0, cx;
0, fy, cy;
0, 0, 1]
其中fx、fy是焦距(单位像素),cx、cy是主点偏移。畸变系数(k1、k2、p1、p2、k3)也会一并算出来。
3.2 双摄相对位姿标定:R和T矩阵
单摄标定完,我们知道了每颗摄像头自己的内参。但双摄融合需要知道:右摄像头相对于左摄像头,到底在哪儿?脸朝哪边?
这就是相对位姿标定要干的事。我们用R矩阵(旋转)和T矩阵(平移)来描述这个关系。
假设左摄像头的外参是[R_l | t_l],右摄像头的外参是[R_r | t_r]。那么右摄相对于左摄的变换就是:
R = R_r * R_l^T
T = t_r - R * t_l
说白了,就是把两个摄像头各自在棋盘格坐标系下的位姿,转换到同一个坐标系下,然后做差。
这里有个坑——尺度问题。单目视觉标定出来的平移向量t是没有真实尺度的,但双摄标定时,我们通过已知大小的棋盘格,可以恢复出真实的物理尺度(毫米级)。
3.3 高通双摄标定工具:QCARCameraCalibration
高通平台提供了QCARCameraCalibration工具,专门用来做双摄标定。它封装了张正友法的实现,还集成了双摄相对位姿优化。
基本使用流程如下:
- 准备棋盘格:打印一张高精度棋盘格,贴在平整硬板上。格子大小要精确测量(比如30mm)。
- 采集标定图像:左右摄像头同时拍摄棋盘格,保存为左右配对图像。建议采集20-30对。
- 运行工具:执行QCARCameraCalibration,指定图像路径、棋盘格参数、输出路径。
- 检查结果:工具会输出重投影误差,一般要求小于0.5像素。如果误差太大,说明标定质量不行。
命令行示例:
./QCARCameraCalibration \
--left-image-dir ./calib_images/left \
--right-image-dir ./calib_images/right \
--pattern-size 30 \
--pattern-rows 9 \
--pattern-cols 6 \
--output ./calib_result
工具跑完后,会生成一个.calib文件。这个文件就是双摄融合算法的“身份证”。
3.4 标定文件(.calib)解析
.calib文件是高通平台专用的标定数据格式。它包含了双摄融合所需的所有几何信息。下面是一个典型的.calib文件结构:
# 文件头
calib_version: 3.0
sensor_count: 2
# 左摄像头内参
sensor_id: 0
intrinsic_matrix: [1234.5, 0.0, 640.0, 0.0, 1235.2, 480.0, 0.0, 0.0, 1.0]
distortion_coeffs: [0.12, -0.25, 0.001, 0.002, 0.05]
# 右摄像头内参
sensor_id: 1
intrinsic_matrix: [1233.8, 0.0, 639.5, 0.0, 1234.9, 479.8, 0.0, 0.0, 1.0]
distortion_coeffs: [0.11, -0.24, 0.0015, 0.002, 0.04]
# 双摄相对位姿
rotation_matrix: [0.9999, -0.0012, 0.0008, 0.0012, 0.9999, -0.0015, -0.0008, 0.0015, 0.9999]
translation_vector: [-59.8, 0.2, 0.5]
# 图像尺寸
image_width: 1280
image_height: 720
关键字段解读:
| 字段 | 含义 | 注意事项 |
|---|---|---|
| intrinsic_matrix | 内参矩阵(3x3) | fx、fy差异一般小于1%,如果差异太大,检查镜头是否损坏 |
| distortion_coeffs | 畸变系数(5个) | k1、k2是径向畸变,p1、p2是切向畸变,k3是高阶径向畸变 |
| rotation_matrix | 右摄到左摄的旋转矩阵(3x3) | 理想情况是单位矩阵,实际会有微小偏差 |
| translation_vector | 右摄到左摄的平移向量(3x1,单位mm) | Tx是基线距离,一般在50-100mm之间 |
3.5 双摄标定知识体系
下面这张图总结了双摄标定的完整流程和核心概念,建议你保存下来,做项目时对照着看。
这张图把整个标定流程串起来了。从棋盘格和图像输入开始,经过张正友法解算内参,再到双摄相对位姿标定,最后通过高通工具生成.calib文件。每一步都有对应的质量检查点。