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)也会一并算出来。

我的习惯:标定拍照时,棋盘格要占画面1/4到1/2,角度变化要丰富(倾斜、旋转、远近)。至少拍15-20张,保证覆盖整个视场。我一般会拍25张,剔除掉模糊的,留20张左右。

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是没有真实尺度的,但双摄标定时,我们通过已知大小的棋盘格,可以恢复出真实的物理尺度(毫米级)。

我曾经踩过的坑:有次标出来的T向量z分量特别大,检查了半天,发现是左右摄像头的图像时间戳没对齐。双摄标定要求左右图必须是同一时刻拍摄的,哪怕差一帧,标出来的位姿都是错的。后来我强制在驱动层做了硬件同步,问题才解决。

3.3 高通双摄标定工具:QCARCameraCalibration

高通平台提供了QCARCameraCalibration工具,专门用来做双摄标定。它封装了张正友法的实现,还集成了双摄相对位姿优化。

基本使用流程如下:

  1. 准备棋盘格:打印一张高精度棋盘格,贴在平整硬板上。格子大小要精确测量(比如30mm)。
  2. 采集标定图像:左右摄像头同时拍摄棋盘格,保存为左右配对图像。建议采集20-30对。
  3. 运行工具:执行QCARCameraCalibration,指定图像路径、棋盘格参数、输出路径。
  4. 检查结果:工具会输出重投影误差,一般要求小于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文件。这个文件就是双摄融合算法的“身份证”。

关键指标:重投影误差(Reprojection Error)是衡量标定质量的核心指标。我个人的经验是:误差小于0.3像素算优秀,0.3-0.5像素可接受,大于0.5像素建议重新标定。

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之间
重要提醒:千万不要手动修改.calib文件里的数值!我曾经为了调试方便,手改了一个畸变系数,结果融合出来的图像边缘全是扭曲的。标定数据必须由工具生成,任何手动修改都会破坏几何一致性。

3.5 双摄标定知识体系

下面这张图总结了双摄标定的完整流程和核心概念,建议你保存下来,做项目时对照着看。

双摄标定知识体系图 双摄标定知识体系 棋盘格标定板 左右摄像头图像对 硬件同步触发 张正友标定法 角点检测 → 单应性矩阵 → 内参分解 → 畸变优化 单摄内参标定 左摄K、D / 右摄K、D 双摄相对位姿标定 R矩阵(旋转) / T矩阵(平移) QCARCameraCalibration 工具 .calib 标定文件 重投影误差 < 0.5px 合格 基线距离 50-100mm

这张图把整个标定流程串起来了。从棋盘格和图像输入开始,经过张正友法解算内参,再到双摄相对位姿标定,最后通过高通工具生成.calib文件。每一步都有对应的质量检查点。

我的建议:在实际项目中,标定不是一次性的工作。温度变化、镜头松动、模组老化都会导致标定参数漂移。我一般会在产线做一次出厂标定,然后在设备每次启动时做一次在线校验,如果重投影误差超过阈值,就触发重新标定流程。