news 2026/9/8 19:28:10

无人机视觉之基:相机模型与标定全流程实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
无人机视觉之基:相机模型与标定全流程实战指南

无人机悬停、避障、定点投物这些功能,看着是飞控和算法在起作用,但真正让无人机“感知”到三维空间的,往往是机身下面那颗不起眼的相机。而相机把三维世界变成二维图像这件事,本身是有误差的,镜头畸变、安装偏差、像素坐标与真实尺度的换算关系,这些统统都要靠相机模型和标定来解决。我在调试植保无人机和室内视觉定位无人机时,被重投影误差和畸变问题折磨过不少次,后来把相机模型和标定流程彻底吃透之后,所有视觉相关的问题都变得可控了。这篇文章就围绕相机模型与标定在无人机上的应用展开,讲清楚原理,也给出可以直接照做的操作流程,适合正在做视觉SLAM、无人机自主导航或者刚接触机器视觉的开发者参考。

1. 先搞清楚相机怎么“看”空间:从针孔模型开始

1.1 针孔模型为什么能描述三维到二维的映射

相机成像的本质,其实就是一个小孔成像。光线从三维空间中的某个点出发,穿过相机光心,投射到后方的感光平面上。这个过程中,三维点(X, Y, Z)被映射成二维像素坐标(u, v),中间的数学关系就是针孔相机模型。

实际相机用的都是透镜组,等效光心到感光芯片的距离就是焦距f。把世界坐标系中的一个点P(X, Y, Z)转到相机坐标系,再根据相似三角形关系映射到像素平面,就得到:

u = fx * X/Z + cx v = fy * Y/Z + cy

这里fx、fy是焦距在像素单位下的表示,cx、cy是主点偏移。注意X/Z这个形式,它说明尺度信息在单目相机里是丢失的,这也是为什么无人机单目视觉测距往往需要借助已知高度、已知目标尺寸或者其他传感器辅助。理解了这一点,就能明白为什么无人机视觉定位系统里,相机标定只是第一步,后面往往还要接IMU、气压计或RTK去补全尺度。

1.2 内参、外参、畸变:三个绕不开的参数组

相机标定最终要得到的,是三个层面的参数。

内参描述的是相机自身的几何属性,也就是上面这个矩阵K:

K = [fx 0 cx] [ 0 fy cy] [ 0 0 1]

内参决定了像素坐标和归一化平面坐标之间的映射关系。只要相机不换镜头、不改变分辨率,内参理论上不会变。

外参描述的是相机在某个参考坐标系下的位姿,也就是旋转矩阵R和平移向量t。在无人机上,外参通常指相机相对于机体坐标系、IMU坐标系或者世界坐标系的相对位姿。比如你要做视觉导航,就要知道相机看到的目标在机体坐标系下的方位,这时相机到机体的外参就是必须的。

畸变参数描述的是镜头加工和装配带来的成像误差。主要分两类,一类是径向畸变,也就是画面边缘向里凹或向外凸的“桶形”和“枕形”畸变,用k1、k2、k3三个系数来拟合;另一类是切向畸变,源于镜头和感光芯片的平行度偏差,用p1、p2两个系数来描述。畸变模型通常写作:

x_distorted = x * (1 + k1*r^2 + k2*r^4 + k3*r^6) + 2*p1*x*y + p2*(r^2 + 2*x^2) y_distorted = y * (1 + k1*r^2 + k2*r^4 + k3*r^6) + p1*(r^2 + 2*y^2) + 2*p2*x*y

实际标定时,畸变系数用得最多的就是k1、k2、p1、p2,k3一般只在鱼眼镜头或者畸变特别大的广角镜头上才需要。无人机上常用的镜头多为广角或超广角,边缘畸变往往不小,k3该用还是得用。

1.3 无人机场景下的模型选择

无人机上用的相机型号很杂,从普通的卷帘快门广角相机到全局快门小相机,再到双目相机、鱼眼相机,模型选择完全不一样。

普通广角镜头用标准针孔模型就够。鱼眼镜头如果视场角超过120度,针孔模型在边缘的拟合效果会变得很差,这时应该用等距投影模型或单位球模型,OpenCV里对应的就是fisheye模块,Kalibr里也有pinhole-equidistant这种模型组合。双目相机在单目内参标定的基础上,还要额外标定左右相机的相对外参和基线长度,这直接决定了深度估计的精度。很多工业无人机用的双目模块,比如小觅、ZED,出厂带标定参数,但运输振动、温度变化会导致参数漂移,实际项目里我还是建议自己重新标一遍。

还有一个容易被忽略的问题:卷帘快门。消费级无人机上大多数CMOS都是卷帘快门,高速运动时画面会出现果冻效应。如果做高速避障或动态目标跟踪,最好选全局快门的工业相机,否则标定得再准,图像采集本身就已经带了运动畸变。这一点在选型时就该想清楚,等算法跑起来发现问题再换相机,成本就高了。

2. 标定前的准备工作:工具选型与标定板设计

2.1 常用标定工具对比

标定工具我实际用过三类,各有优劣。

OpenCV自带的cv2.calibrateCamera最基础,代码简单,文档多,适合快速验证,但精度一般,主要是因为它对棋盘格的角点检测算法比较老旧,而且没有对帧间位姿做优化。MATLAB的Camera Calibrator体验好很多,交互式界面能实时显示重投影误差和每张图的位姿,初学者很容易看懂,但需要MATLAB许可。Kalibr是目前视觉SLAM社区里最常用的标定工具,它支持多种相机模型、多相机联合标定、相机与IMU联合标定,精度高,输出直接对接VINS、ORB-SLAM等系统,缺点是安装比较麻烦,依赖库多。

我的建议是,普通内参标定用MATLAB或者OpenCV都行,做VIO或者视觉惯性导航项目时直接用Kalibr一步到位。Kalibr标出来的相机内参、外参、IMU外参格式和VINS-Mono无缝衔接,省去手动转换参数的麻烦。

2.2 标定板设计:棋盘格、AprilTag、Charuco怎么选

标定板的选择直接影响角点检测的稳定性。传统棋盘格是最常见的,角点是黑白方块的交点,检测算法成熟。但棋盘格有一个致命问题:如果图像里只拍到部分棋盘格,或者有遮挡,会导致角点排序混乱,因为棋盘格本身没有方向信息。飞无人机的时候,标定板很难一直完整出现在画面中央,经常是拍到一半,传统棋盘格的鲁棒性就下降了。

AprilTag和Charuco这类带编码信息的标定板可以解决这个问题。它们是二维码和棋盘格的结合体,每个格子都携带独立的ID信息,即使只拍到局部,算法也能知道这一部分是标定板的哪个位置。我实际测试下来,Charuco在无人机室外标定场景里最实用,因为无人机飞行姿态变化大,拍到的标定板往往不完整,Charuco的鲁棒性让它基本不会出现角点错乱。

打印标定板时有两个细节必须注意。第一,必须用高分辨率激光打印机,普通喷墨打印的黑色块边缘会有毛刺,像素级角点检测直接受影响。第二,标定板要贴在完全平整的刚性背板上,KT板、纸板都会翘边,最好用铝塑板,轻且硬。

2.3 无人机场景的标定环境布置要点

无人机标定有个特殊的地方,就是相机视角问题。普通相机标定,固定相机对着标定板拍就行,但无人机相机通常朝下或朝前安装,你很难把无人机固定在一个完美的角度。

我的经验是,如果相机可以拆卸,直接拆下来放到三脚架上标定,这样图像质量最高。如果相机不可拆,就把无人机固定在一个稳定的支架上,让标定板在相机视野内移动。注意,标定原理其实是标定板在动、相机不动,或者反过来,都需要保证标定板覆盖视野的各个区域,尤其是边缘。

环境光线尽量均匀柔和。室外强烈阳光下,标定板黑格和白格的对比度会降低,甚至反光,我遇到过好几次因为反光导致角点检测失败的情况。室内用LED面板灯补光,保证标定板亮度均匀,是最理想的状态。

3. 从零开始做一次完整的相机标定

3.1 图像采集:数据质量决定了标定质量

标定图像采集是整个流程里最容易被忽视、但影响最大的环节。很多初学者拿相机随便拍十几张图就开始跑标定,最后重投影误差确实小,但实际用在无人机导航里却漂得厉害,原因就是标定图像过于类似,参数解算不唯一。

理想的标定图像应满足以下几个条件:

  • 数量在20到30张之间,太少参数不稳定,太多信息冗余,计算时间也变长
  • 标定板需要出现在画面的不同位置:四角、四边、中心都要有覆盖
  • 标定板相对相机的姿态要多样,包括俯仰角、偏航角的变化,不要只是正对着相机前后移动
  • 标定板和相机之间的距离要变化,让标定板在画面中的尺度有差异,这有助于解算出更准确的焦距
  • 画面里不能有运动物体遮挡标定板,也不能有强反光

采集图像时我用过一个实用的技巧:边拍边移动标定板,同时观察角点检测结果。OpenCV里可以实时显示检测到的角点,如果有图像检测异常,当场重拍。等到全部拍完再处理,发现某几张图有问题还得重新布置场景,效率太低。

3.2 角点检测与参数求解:实际上是怎么算出来的

这里说标定算法是怎么一步一步把参数解出来的。先用棋盘格上的角点像素坐标作为输入,再通过张正友标定法求解。

张正友法的核心思想是,把标定板看作一个平面,平面上所有点的Z坐标都等于0,这样就可以先估计一个单应性矩阵,然后利用不同位姿下多个单应矩阵的约束,线性地解算出内参的初始值,再用最大似然估计对所有参数做非线性优化。

OpenCV里的cv2.findChessboardCorners负责角点检测,也就是找到图像中棋盘格内部角点的像素坐标。检测到足够多的图像后,cv2.calibrateCamera会完成上述的初值计算和非线性优化,返回内参矩阵、畸变系数,以及每张图像对应的外参。

Kalibr的标定流程稍微不同。它使用Aprilgrid或Checkerboard标定板,通过kalibr_calibrate_cameras命令,在YAML配置文件中指定相机模型和畸变模型,输出的结果是一个包含相机内参和畸变系数的JSON文件。Kalibr的优化过程还会考虑标定板自身的误差模型,所以精度通常比OpenCV高。

有个参数值得单独说:标定板的格子边长。这个物理尺寸必须精确测量,而不是照抄标定板文件里的标称值。打印过程会有缩放,卡纸厚度也会影响实际尺寸,用游标卡尺量一下最保险。这个参数错了,标定出来的焦距就会成比例地偏大或偏小,影响后续所有基于像素坐标换算距离的计算。

3.3 结果评估:重投影误差怎么看

重投影误差是衡量标定质量最直观的指标。它表示把三维角点通过标定出来的内外参重新投影到图像平面,得到的像素坐标和实际检测到的像素坐标之间的距离,单位是像素。

OpenCV标定结果里会直接输出RMS重投影误差。一般要求小于0.5像素,如果超过1像素,说明图像数据质量有问题,或者标定板不平整,需要重新采集。MATLAB的Camera Calibrator界面里,每一张图片都会显示平均误差,用柱状图列出,可以很方便地找出误差偏大的图像并将它剔除。

单纯看整体RMS还不够,我习惯再做一个验证:用标定好的参数对图像做畸变校正,然后观察画面边缘的直线是否变直。比如拍一扇门或建筑的边缘,畸变校正后直线的弯曲程度直观可见。这一步能发现重投影误差掩盖掉的局部畸变问题。

无人机上最终用的是校正后的图像,所以标定参数的正确性可以通过校正后的图像来判断。如果校正图像边缘有非自然的扭曲,说明畸变模型选择可能不对,比如普通针孔模型用在鱼眼镜头上就会这样,需要考虑换用其他模型重新标定。

3.4 把结果用到无人机里:内参写入相机驱动

标定完成后,内参和畸变系数要写到实际的感知代码或相机驱动配置里。这里的关键是坐标系定义必须一致,否则参数直接套用会出错。

最常用的格式是ROS的CameraInfo消息,包含内参矩阵K、畸变系数D、分辨率等信息。在ROS里,图像话题通常和CameraInfo话题成对发布,图像处理节点通过image_proc包对原始图像做去畸变,得到校正图像。

如果是在Pixhawk或PX4的视觉惯性导航系统里,标定参数一般写到VINS-Mono或ORB-SLAM3的配置文件里,同时还要把相机到IMU的外参写进去。外参的坐标系转换关系要格外注意,不同框架规定的旋转顺序不一样,VINS-Mono用的就是“相机到IMU”的变换,写反了整个系统都会发散。

还有一个容易被忽略的点:校准后的图像分辨率。如果你标定用的是1280x720的图像,但运行算法时用1080p,那内参必须按缩放比例重新换算,不能直接沿用。fx、fy、cx、cy都要乘以对应的比例系数,很多开发者都在这上面翻过车。

4. 从单相机到多传感器:外参标定与手眼标定

4.1 无人机视觉定位为什么一定要标外参

无人机上很少只靠一个相机工作。视觉惯性导航系统里,相机要和IMU配合,IMU提供高频的角速度和线加速度,相机提供低频的视觉约束,两个传感器数据融合的前提就是精确知道相机和IMU之间的相对位姿,也就是外参。

外参标定常用的工具是Kalibr的kalibr_calibrate_imu_camera模块。它通过让无人机或相机做特定激励运动,比如正弦摆动、八字形运动,同时采集IMU数据和图像数据,联合优化出相机到IMU的旋转矩阵和平移向量。

这里有个实操经验:标定IMU-camera外参,激励运动必须足够丰富。只做匀速运动或者静止,IMU的加速度和角速度没有足够的可观测性,外参解算不出来。至少要包含三个轴的旋转和三个轴的平移,保持1到2分钟,期间动作尽量平滑但快速。实测下来,绕三个轴画“8”字是效率最高的运动模式。

外参标定的结果直接决定了VIO系统的初始化速度和长时间漂移程度。外参误差只要超过1度,或平移误差超过1厘米,融合后的轨迹就会明显漂移。

4.2 手眼标定在无人机云台上的应用

无人机云台上的相机标定,本质上是一个手眼标定问题。云台转动时,相机的朝向在变化,但相机相对于云台末端的安装位置是固定的。我们需要求解的就是相机坐标系到云台末端坐标系之间的固定变换。

手眼标定的标准方程是AX=XB,其中A是云台末端的前后两次运动变换,B是相机坐标系的前后两次运动变换,X就是要求解的相机到云台的固定变换。

实际做的时候,让无人机云台转到多个不同角度,每个角度下用标定板解算相机外参,同时记录云台上报的姿态角,用solvePnP的结果和云台姿态角就可以构造出A和B,然后用Tsai-Lenz或其他求解算法得到X。

这个变换对云台相机的视觉锁定和目标跟踪非常重要。因为云台一直在转动,如果不知道相机相对云台的精确安装关系,就无法把图像中目标的位置换算到云台坐标系下,也就无法控制云台精准转动去跟踪目标。很多开源云台相机的跟踪效果不理想,就是卡在这一步没有标定。

4.3 双目相机和LiDAR相机联合标定

无人机避障系统里,还有一种常见组合是双目相机或者LiDAR加相机。双目相机需要标定左右目之间的相对外参,这个用Kalibr的kalibr_calibrate_cameras可以直接完成,它会同时优化左右相机的内参和它们之间的外参,结果可以用来做立体校正。

LiDAR相机标定稍微复杂一些,因为LiDAR点云和图像数据是异构的,要在3D点和2D像素之间找对应关系。常规做法是摆放带反光标记的标定板,或者用带有明显边角的箱子,先在LiDAR点云中检测出平面或角点,再在图像中找到对应的像素位置,通过P3P或EPnP求解外参。也有基于互信息的自动标定方法,不需要标定板,但鲁棒性不如手动方法,更适合实验结果稳定后的微调。

无人机上如果用LiDAR做定位、相机做目标识别,这种多传感器融合的场景,联合标定的精度直接决定融合效果。我在实际项目中遇到过因为外参没标准,LiDAR检测到的障碍物和相机检测到的障碍物在空间上重合不到一块的情况,后面重新做了联合标定,问题就消失了。

5. 常见问题与排查技巧实录

5.1 重投影误差偏大的排查思路

重投影误差偏大的时候,不要急着调整算法参数,先按这个顺序排查:

先检查标定板是否平整。把标定板放在桌面或地板上,观察四个角是否悬空。很多标定板用久了会翘角,这会导致局部的角点坐标偏移,重投影误差自然大。

再检查角点检测是否正确。用可视化工具把所有标定图像的角点画出来,逐张确认有没有漏检、错检。尤其是棋盘格被部分遮挡时,角点顺序很容易乱。

然后检查图像数量是否充足。低于15张的标定结果可信度很低。如果前面都没问题,试着剔除掉重投影误差最大的一两张图像,重新标定,误差通常会有明显下降。

如果所有图像都剔除后误差还在0.8像素以上,那就要怀疑畸变模型选择是否匹配镜头了。普通广角镜头用pinhole-radtan模型,鱼眼镜头用pinhole-equidistant或fisheye-equidistant模型,模型不匹配时会反映在重投影误差上,而且校正后的图像边缘会有明显扭曲。

5.2 角点检测失败和误匹配的常见原因

角点检测失败最典型的原因是光照不均和反光。标定板上有强反光时,白色格子过曝成一片,角点附近失去对比度,检测器定位不准。解决办法调整标定板角度,避免阳光直射产生镜面反射,室内用散射光源。

另一个原因是运动模糊。手持无人机或标定板不稳,快门速度跟不上运动速度,图像边缘就会糊,角点位置偏移。无人机标定时最好把无人机固定,只移动标定板,或者反过来,保证相对运动可控。如果必须用手持拍摄,用大光圈的工业相机配合高快门速度,能有效减少模糊带来的定位误差。

还有一个容易忽视的是标定板图案分辨率过低。远距离拍摄时,棋盘格在画面里只占很小区域,单个格子的边缘在像素级别已经模糊,角点检测自然不精确。出现这种情况,要么靠近一点,要么换大格子标定板。

5.3 不同分辨率、不同温度下的标定漂移

标定参数不是一劳永逸的,这个必须说清楚。同一个相机,如果工作分辨率变化,内参就要按比例重新换算。如果镜头可以变焦,那焦距变化后必须重新标定。如果相机模组经历过剧烈振动或者维修,内参也可能发生微小漂移,因为镜头和感光芯片之间的相对位置可能变了。

温度影响是无人机特有的问题。无人机在户外作业时,白天暴晒和傍晚降温温差可能超过20度,镜头光学元件的折射率和机械结构尺寸都会发生变化,表现为标定参数轻微漂移。严格的项目里,冷态和热态各标定一次,分别存参数,根据环境温度切换。大多数消费级场景不需要这么精细,但要意识到温度突变后视觉里程计精度下降,很可能是标定参数漂移导致的。

经验是,长时间使用的无人机,每季度做一次内参标定检查,用旧参数对当前图像做畸变校正,如果边缘直线的弯曲明显,那就该重新标定了。

5.4 实测排除记录:一张表速查常见问题

我整理了一份无人机相机标定常见问题速查表,覆盖我实际开发中遇到过的高频问题,帮助快速定位故障原因。

现象可能原因排查方法解决方案
重投影误差大于1像素标定板翘曲/不平整放在平面上观察四角换铝塑板,重新粘贴
重投影误差集中在一侧标定板图像不均匀/照明偏差查看单张图像误差分布调整光源,重新采集
角点检测错乱棋盘格被部分遮挡/方向无编码检查检测可视化使用Charuco/AprilTag标定板
校正后边缘扭曲严重畸变模型不匹配换用鱼眼模型对比选择正确的畸变模型
校正图像分辨率不对标定和运行分辨率不一致检查图像尺寸按比例重算内参
VIO初始化失败相机IMU外参不准检查激励运动是否充分重新采集数据标定外参
温度变化后定位漂移镜头热胀冷缩用旧参数测试校正效果冷/热态分别标定
双目深度不准基线长度误差重新标定双目外参检查基线是否变动

这张表基本就是我遇到的最常见问题的集合。很多问题表面看起来像算法不行,实际查到最后都是标定数据没做好,花了大量时间往错误方向排查,最后绕回来重新做标定就解决了。

6. 实操心得:标定这件事最容易被忽视的两个细节

说两个我踩过坑之后收获最大的经验。

第一个是标定板尺寸和拍摄距离的匹配。标定板的棋盘格尺寸决定了它能被准确检测的最近和最远距离。如果标定板太小,无人机相机离它近的时候,画面里只会有几个格子,角点太少,单张图像提供的约束不足。如果标定板太大,又不容易让它在画面边缘出现。我做室内无人机视觉定位时,用的是A2大小的Charuco标定板,格子边长30mm,无人机在1到3米距离上拍摄,效果最理想。室外用大疆无人机标定,因为镜头视野广,A1大小的棋盘格才能同时满足近处和远处的覆盖需求。

第二个是标定数据的“多样性”权重比“数量”更高。我之前犯过一个典型错误,为了凑数量,在几乎同一个位置、同一个角度拍了30张图,最后标定结果重投影误差很小,但实际飞行中视觉定位系统表现很差,因为那些图像提供的信息几乎是重复的。后来我调整策略,每个位置拍两三张,但让标定板覆盖画面九个区域,同时每次之间改变倾斜角度和距离,20张图的效果远超之前30张重复图的效果。标定求解的是一个高维参数空间的最小化问题,让观测数据在参数空间里“撑开”,才是关键。

相机模型和标定这件事,看起来是视觉SLAM里最基础的一环,但恰恰是这一环决定了整个无人机视觉系统的上限。内参不准确,畸变校不准,后面的特征匹配、位姿估计、三维重建全都建立在错误的像素坐标上,算法再先进也救不回来。我建议在做任何无人机视觉项目时,把标定当成一个重要环节来抓,而不是随便跑一下脚本就完事。前期多用一点心思把标定做扎实,后面调算法的时候会省掉大量的麻烦。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 19:27:41

智能体技术落地四大关键:自进化、世界模型、AI Coding与Agent Infra

看到“2026 奇点智能技术大会”首批议题公布的消息时,我第一反应不是“又一场技术峰会”,而是“终于有人把 Agent 自进化、AI Coding、世界模型、Agent Infra 这四件事放到同一张桌上了”。过去一两年,这几个词分别出现在不同的朋友圈、不同的…

作者头像 李华
网站建设 2026/9/8 19:27:39

OpenClaw 2.0:从开源极客玩具到数字员工平台的架构与实践

OpenClaw 2.0 发布那天,我盯着 GitHub 仓库里那只举着钳子的大龙虾 logo 看了很久。从 0.9 时代就开始用的老用户都清楚,这个项目最早就是个极客玩具——挂在个人博客边上的小机器人,你让它查个天气、记个待办、发条定时推文,就已…

作者头像 李华
网站建设 2026/9/8 19:26:55

WorkBuddy智能工作台实战:从智能体到连接器的自动化指南

1. 这次有奖征集活动,到底在征集什么 先聊一个现象:很多效率工具发布后,用户最容易卡住的不是“装不上”,而是“装好了不知道拿它干什么”。WorkBuddy 这类智能工作台产品尤其如此,它能连接的场景太多,反而…

作者头像 李华