ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

单目与多目相机统一标定:从数学模型到工程实践的关键指南

2026/9/15 18:26:10 拓冰建站 浏览量
单目与多目相机统一标定:从数学模型到工程实践的关键指南 搞机器视觉这几年我最大的感触就是单目和多目标定明明是一套数学模型却被大多数人硬生生拆成了两套流程。很多项目前期用单目标定求内参后期上了双目、多目又重开一摊代码去做立体标定结果内参不一致、坐标系混乱、误差标准各说各话出了问题排查起来头疼得要命。其实单目和多目视觉统一标定这件事本质上就是一套框架解决所有相机模型的参数求解问题。这篇内容我会从数学模型出发把单目和多目为什么能用同一套标定思路、统一标定到底统一了什么、实操中图像怎么采、误差怎么读、多相机外参怎么联标每一步的关键点和坑都梳理一遍。文章主要面向刚接触相机标定的同学也适合已经在做视觉工程但被多套标定流程折腾过的工程师参考。内容全部基于我实际跑过的项目和常见实践该注意的地方都会标注清楚。1. 为什么单目和多目的标定不能各做各的很多项目的起点都是一个单目相机。做障碍物检测、车道线识别、二维码定位单目确实够用价格便宜标定也简单——拿个棋盘格拍几张图OpenCV跑一遍就得内参和畸变系数。这时候大家普遍觉得标定这事儿已经结束了。等到某一天需求升级要加深度信息要上双目或者多目视觉的时候问题就来了。你会发现之前单目标定得到的那套内参在双目标定里不一定好用。原因倒不是内参本身错了而是双目标定除了要求每台相机的内参和畸变系数还要求出两台相机之间的相对位姿——旋转矩阵R和平移向量T。这个R和T的精度直接决定了后面立体匹配和视差计算的准确性。但工程里的真实麻烦比这更大。我见过不少项目是这么干的单目那段代码里写了一套标定流程多目那段代码里又写了另一套标定流程两套流程用的标定板不一样采集图像的习惯不一样重投影误差的统计口径也不一样。最后做系统集成的时候单目模块报出来的内参和多目模块报出来的内参居然对不上同一个相机在两条链路里标出了两套K矩阵。你说哪套是准的其实可能都准只是标定时的图像集、优化初值、畸变模型阶数略有差异结果就差了几个像素。这在单目里可能无所谓但在多目视差计算里几个像素的误差直接让深度测量偏出去几十毫米。所以统一标定的第一个价值不是省事而是一致性。你要让同一个相机不管在单目链路还是多目链路里读到的都是同一套参数。要做到这一点就得从底层把单目和多目纳入同一个建模框架、同一套求解流程、同一个质量控制标准。统一标定的第二个价值是坐标系的可追溯性。单目标定只解决“相机自己是准的”这个问题但多目标定要解决“所有相机在同一个世界坐标系里各就各位”这个问题。如果你从一开始就把单目标定的外参理解为相机到某个参考系的位姿变换那么多目标定只是把参考系从“相机自己的坐标系”换成了“主相机坐标系”而已数学上没有任何跳跃。第三个价值是工程维护层面的。视觉系统的迭代频率比想象中高——今天换一颗镜头、明天调整一下安装角度每次改动都可能需要重新标定。如果是两套割裂的流程每次重标定都要做双倍的工作量还容易标漏某一台相机。统一成一条流水线之后脚本一跑单目、双目、多目全部覆盖哪个摄像头参数有问题一目了然。2. 统一标定的数学模型到底统一了什么要理解统一标定得先把标定这件事的数学本质看清楚。不管单目还是多目相机成像的底层模型都是一样的区别只在于约束的多少和参与求解的相机数量。2.1 针孔模型和内参矩阵每台相机的“身份证”先复习一下针孔相机模型。一个三维空间点经过相机成像到像素平面完整表达式是s * [u, v, 1]ᵀ K * [R | t] * [X, Y, Z, 1]ᵀ其中K是内参矩阵K [[fx, s, cx], [0, fy, cy], [0, 0, 1]]fx和fy是焦距在像素单位下的表示cx和cy是光学中心坐标s是像素坐标系下的倾斜系数。现代工业相机和大多数消费级相机传感器都做得比较规整s通常接近0但标定时还是建议把它留在模型里让优化器去判断不要拍脑袋直接置零。畸变模型一般用OpenCV的plumb_bob模型也就是k1、k2、p1、p2、k3五个参数其中k是径向畸变p是切向畸变。鱼眼镜头则用Fisheye模型多项式阶数更高但标定流程的骨架是一样的。在统一标定框架里K和畸变系数必须为每台相机单独求解这部分单目和多目没有任何区别。你可以把内参理解为相机的“身份证”它描述的是镜头和传感器组合的内在光学属性跟你把相机装在哪儿、装了几台没有任何关系。2.2 外参的本质把相机放进同一个空间外参[R | t]描述的是相机坐标系到某个世界坐标系的变换关系。单目标定里外参其实也会解出来只不过每次拍照时标定板位置一变外参就跟着变——它描述的是“这张照片里的标定板坐标系到相机坐标系的变换”。真正固定下来的只有内参。如果在固定安装场景里标定板放在一个已知位置不动那么外参就有了实际意义——它就是相机在世界坐标系里的位姿。多目标定里的外参本质上也是同一件事。双目标定时求的R和T描述的是右相机坐标系到左相机坐标系的变换多目标定时以某个主相机为参考其余相机到主相机的变换就是它们各自的外参。从数学模型上看这跟单目求“相机到世界坐标系的变换”完全同构——都是求一个刚体变换。这就是统一标定的关键洞察**单目和多目标定在数学上没有任何本质区别区别只是参考坐标系选在哪。**单目的时候参考系可以选标定板或某个世界坐标系多目的时候参考系往往选主相机但两者都是求一个3x3的旋转矩阵和一个3x1的平移向量都要满足刚体变换的约束。2.3 张正友标定法为什么能作为统一标定的地基张正友标定法之所以是单目和多目标定的公共地基因为它在数学上极其优雅地利用了平面标定板的特殊性。标定板平面上的点可以令Z0于是3D到2D的映射退化成s * [u, v, 1]ᵀ K * [r1, r2, t] * [X, Y, 1]ᵀK乘以[r1 r2 t]得到的是一个3x3的单应矩阵H。每一张标定板图像能提供一个单应矩阵而单应矩阵包含8个自由度。旋转向量r1和r2来自一个正交旋转矩阵所以它们天然满足两个约束r1和r2正交并且模长相等。多张图像积累足够的约束后就能线性求解内参K的初始值再用最大似然估计把所有参数包括畸变系数一起做非线性优化。这套方法对单目和双目都适用。单目直接用上述流程解内参和畸变系数双目则是在单目分别标定出各自内参后再通过对同一时刻拍摄的标定板图像求两台相机之间的R和T。所以我一直觉得张正友标定法不是“单目标定法”也不是“双目标定法”它就是“视觉标定法”是单目和多目统一标定的理论地基。2.4 单目、双目、多目在约束上的层次关系从约束条件来看单目、双目、多目是逐层叠加的关系单目标定每幅图像提供单应矩阵H利用旋转矩阵的正交约束求内参。求解的是K和畸变系数外参随图像变化。双目标定在单目基础上利用左右相机同时在观测标定板建立两相机坐标系的几何约束求解R和T。多目标定在双目基础上进一步扩展。如果相机之间有共同视野可以逐对求解相对位姿最后统一到主坐标系下。这种递进关系意味着只要你把底层的参数表达和优化框架设计好单目、双目、多目真的就只是同一套代码里不同的约束组合而已。3. 实操链路从采集图像到重投影误差理论说再多最终还是要落到实际操作的每一步。这里我按自己跑通的标准流程把单目和多目标定的实操链路完整梳理一遍每一个环节都有明确的要点和注意项。3.1 标定板选型棋盘格、圆点阵还是AprilTag标定板的选择直接影响角点提取的稳定性和标定精度不能随便打印一张纸就开搞。棋盘格是最普遍的方案OpenCV的findChessboardCorners对棋盘格支持最成熟角点提取速度快、精度稳定。圆形标定板的优势在于圆心位置对透视变形的敏感性低但圆点阵在极端角度下可能出现椭圆拟合偏移。AprilTag标定板最大的好处是每张图像都能提供ID信息适合多相机需要识别“同一块板在不同相机里是哪一面”的场景而且在大角度下的鲁棒性更好。我的建议是如果是标准单目或双目标定用棋盘格就行如果要做多相机大角度布置优先考虑AprilTag因为它在遮挡、大角度下的角点管理更省心。标定板的物理精度是很多人忽略的重点。打印纸贴在硬纸板上这种方案精度要求不高的项目勉强能用但纸受潮、热胀冷缩都会让标定板上的格点位置偏离理想坐标误差直接进到标定结果里。预算允许的情况下用陶瓷或者玻璃基板的工业标定板热膨胀系数小格点精度能到微米级。对于要求不高的项目至少也要用PVC板做基底打印后用卡尺实测几个关键格点的尺寸用实测值而不是理论值参与标定能消除一部分系统误差。3.2 图像采集策略20到30张怎么拍才有效标定图像的数量和质量比算法本身更容易拉开差距。经验值是单目每台相机采集20到30张有效图像双目系统要求左右相机同时采集那么就是20到30组。采集策略的要领是覆盖视场的各个区域并且姿态要多样化。具体注意事项标定板要在画面的左上、右上、中心、左下、右下各出现几组保证光学中心附近和边缘都有特征点覆盖标定板相对于相机光轴要有明显的倾斜角度比如倾斜15度到30度不要全是正对相机远近范围要拉开至少覆盖从最近工作距离到最远工作距离避免只在同一距离、同一姿态下平移标定板那样对畸变参数的约束严重不足拍摄时还有一个很关键的细节**标定板表面要平整不要用手去捏板边。**手掌温度会让薄板轻微变形拍出来的角点位置就会出现微小偏差这种误差在单张图里看不出来在优化后会表现为重投影误差偏高且难以收敛。3.3 OpenCV标定流程与关键代码OpenCV的标定流程已经高度封装但每个函数传入的参数和顺序仍然有讲究。单目标定的核心代码可以组织为1. 读取一组标定板图像 2. 用findChessboardCornersSB提取亚像素角点 3. 用calibrateCamera同时求解内参、畸变系数和外参 4. 计算重投影误差评估标定质量这里我要特别强调一点新版本OpenCV里有findChessboardCorners和findChessboardCornersSB两个函数前者的角点检测算法在某些光照不均、镜头畸变大、倾斜角大的图像上会丢失角点后者基于Blob检测稳定性好了不止一个档次。所以我通常直接用SB版本省下大量“为什么角点又没检测到”的调试时间。双目标定要在单目基础上多做一步。正确顺序是1. 分别对左右相机做单目标定得到各自的内参和畸变系数 2. 用stereoCalibrate求两台相机之间的R和T传入上一步的内参作为初值并固定 3. 用stereoRectify计算立体校正映射 4. 用initUndistortRectifyMap和remap生成校正后的图像 5. 检查校正后的左右图像在水平方向是否对齐stereoCalibrate传参时有一个常见的坑如果flags参数不设置函数会同时优化内参和外参结果可能把单目标定已经确定的K又改动了。通常我会传入CALIB_FIX_INTRINSIC让优化器只关注外参R和T。如果对单目内参的置信度不高可以用CALIB_USE_INTRINSIC_GUESS让内参在初值附近微调而不是大范围漂移。多目标定的结构类似区别在于你需要自己组织参考坐标系。我的做法是选视野最居中、被其他相机覆盖最多的那台相机作为主相机然后每两台有共视区域的相机跑一遍stereoCalibrate求解相对位姿最后把次要相机到主相机的变换串联起来。注意串联后要做一次全局联合优化把重投影误差放到所有相机上一起算这样才能避免相邻相机之间的误差累积。3.4 重投影误差怎么读、怎么调重投影误差是衡量标定质量最直接的指标。它的含义是把标定板上的三维格点按照当前标定的内参和外参投影到图像平面跟实际检测到的角点像素坐标之间的距离。单位是像素。经验判断标准小于0.1像素非常优秀工业级项目可以接受0.1到0.3像素正常水平大多数项目够用0.3到0.5像素需要检查标定板是否平整、图像是否清晰、采集姿态是否足够多样大于0.5像素标定基本不合格要排查原因如果重投影误差长期停留在0.5像素以上最常见的三个原因标定板物理不平整、标定板格点尺寸输入错误我见过用标称尺寸代替实测尺寸导致系统性偏差、图像中存在运动模糊。有运动模糊的图像应该直接在采集环节丢弃不要纳入优化。涉及相机的曝光时间设置采集标定板图像时快门速度尽量高一些减少手持或机械振动带来的模糊这是很多人忽略的细节。4. 多相机外参联标把每台相机拴进同一个坐标系多目标定模型上比双目复杂但实际操作时保持逻辑清晰就不容易乱套。4.1 为什么双目标定的外参精度要求比单目高单目内参标定如果误差几个像素在二维检测任务里可能只是检测框平移几个像素影响不大。但双目和视差相关的任务就完全不同了R和T的微小误差会直接导致立体校正后左右图像无法严格行对齐视差图出现系统性倾斜或偏移。深度精度严重劣化。举个例子大视场下如果R的旋转误差有0.1度到了图像边缘校正后的行差可能达到几个像素而视差计算的基本假设就是“同名点在左右图像同一行上”行对齐一旦破坏匹配搜索窗口就要扩大误匹配率显著上升。所以多目标定里外参联标的质量控制比单目标定更严格而且需要专门做一项验证看校正后的图像在远景和近景处的行对齐情况。如果校正参数没问题远处物体的同一特征点在左右图中应该落在同一水平线上近处物体有视差也只在水平方向有偏移。4.2 多相机无共视区域的传板法实际工程里经常遇到一个尴尬情况多相机的安装角度差异很大视野之间没有太大重叠甚至完全没有重叠。比如环绕车身的环视系统前视相机和后视相机可能完全看不到同一个标定板。这种情况下面临的问题是stereoCalibrate的前提——两相机同时看到同一目标——不成立。工业上常见的做法是传板法或靶标递推法。原理是利用中间相机的桥接作用相机A和相机B有共视区域相机B和相机C有共视区域但A和C没有。先标定A和B的相对位姿再标定B和C的相对位姿最后通过位姿变换链得到A到C的变换。这个思路在数学上就是刚性变换的复合完全可行。但要注意误差会沿传递链累积所以传板的级数最好控制在两级以内超过两级要预留全局优化环节。多相机联标用的标定板一定要保证刚性。一张板子在不同相机之间传递时边角磕碰都会让传递矩阵产生系统误差。我习惯用两到三块完全一致的工业标定板各自摆放后让相邻相机看到不同板子再用优化算法同时求所有相机的位姿虽然现场操作成本高一点但结果稳定性比单板传递好得多。4.3 多相机时间同步对标定的影响多相机联标还有一个容易被忽视的前提所有相机必须同一时刻拍摄标定板。如果相机不同步标定板在画面里处于不同位置两两之间计算出来的R和T就会有随机的偏差。这个偏差在手提标定板拍摄时尤其明显——板子在两个相机的曝光时刻之间发生了位移和旋转。这也是为什么多相机联标不适合手持标定板晃动拍摄最好是使用三脚架固定标定板安装到载具上或者用机械臂带着标定板做精确的位姿变化。如果系统的同步精度较差还应把所有相机改为软件触发模式由同一个信号源同时触发曝光把时间不同步问题在源头消掉。5. 从标定到落地九点标定、手眼标定与单目测距标定不只是把相机参数标出来它最终要服务于实际应用。聊完统一标定本身我把工程里最常见的三个延伸应用一起梳理出来它们本质上都是在统一的标定体系之上做约束补充。5.1 九点标定和十二点标定机械臂抓取里的像素到机器人坐标映射工业视觉里常说的九点标定解决的是“像素坐标到机械臂基座坐标或夹具坐标”的映射问题。它不是严格意义上的相机标定而是建立一个简单的平面变换模型。操作上让机械臂末端走到九个或者十二个已知位置记录每个位置对应的像素坐标和机械臂坐标然后用仿射变换或透视变换求解映射矩阵。那为什么是九个点而不是更多九点配合3x3单应矩阵本质上自由度是8九个点提供18个方程已经是超定系统可以最小二乘求解。但实际工程中点少了容易被个别异常点带偏所以才有十二点标定这种升级版——多出的点用于鲁棒估计比如用RANSAC筛选掉误差大的点。九点标定和相机内参标定不是一回事但两者有层级关系。如果相机的畸变没校正直接用原始像素坐标做九点标定画面边缘的映射精度就会很差如果先把像素坐标通过畸变矫正投影到归一化平面坐标系再做平面映射标定结果的精度会好很多。所以规范的流程是先完成相机内参标定再做九点标定。5.2 手眼标定眼在手上与眼在手外手眼标定是另一个高频场景它解决的是相机坐标系和机械臂末端或基座坐标系之间的变换关系。数学表达是经典的AXXB问题A是机械臂末端在两个位姿之间的变换B是相机在两个位姿之间的变换X就是安装关系。眼在手上的场景相机固定在机械臂末端标定板放在工作台固定位置眼在手外的场景相机固定在外部支架上标定板装在机械臂末端。这两种情况的X含义不同但求解的都是同一个矩阵方程。手眼标定对数据质量的要求很苛刻。机械臂的位姿变换要有足够的旋转差异全是在原地平移的位姿组合无法为旋转参数提供有效约束。一般采集十几组机械臂位姿每组之间至少有30度以上的姿态变化标定结果才比较稳定。实际工程里手眼标定精度不够的最常见原因就是旋转变化不够、数据太集中。5.3 单目测距为什么离不开标定热搜里反复出现单目测距这个词。单目相机从原理上没办法直接获得绝对深度但工程上仍然有不少单目测距方案它们靠的其实就是标定出来的内外参加上一些先验假设。最常用的方法是基于地面平面假设的单目测距相机安装在固定高度和固定俯仰角地面近似为一个平面结合相机到地面的外参安装高度和俯仰角就可以把图像上的像素点投影到地面上计算目标到相机的距离。这里用到的数学模型是逆透视变换输入是内参矩阵K和相机相对地面的外参输出是地面平面上每个像素对应的物理坐标。这类方案的精度高度依赖外参标定的准确性。安装高度差1厘米远处目标的距离估算可能偏差几米。所以固定安装的单目测距系统在投入使用前必须结合标定板或已知尺寸参照物做一次外参验证不能只标内参就上项目。6. 我踩过的坑和几条落地建议标定这个东西看着代码简单真正到了现场全是细节。我把这几年项目里踩过的坑和沉淀下来的经验集中列出来每条都是真金白银换来的。6.1 打印棋盘格的变形问题第一次做单目测距项目时为了省钱用A4纸打印棋盘格贴在铝塑板上。白天项目环境温度升高铝塑板和纸张的热膨胀系数不一样标定板表面出现肉眼几乎不可见的微小起伏。标定出来的内参还算正常但外参一直在漂重投影误差从早上的0.2像素慢慢升到下午的0.45像素。排查了很久才意识到是标定板热胀冷缩变形导致的。从那之后我定了一条规矩任何要用于外参标定或多目标定的标定板必须用低热膨胀系数的陶瓷或玻璃基底。如果预算实在有限至少用亚克力板并实测角点尺寸把测量误差控制在0.05毫米以内。6.2 优化重投影误差时要注意特征点分布初学标定时我追求整体重投影误差越小越好结果发现仅看均值会掩盖局部区域的劣化。图像中心区域角点检测精度天然较高边缘区域因畸变较大、角点提取困难误差偏高。如果把大量图像集中在中心区域整体重投影误差会很好看但边缘区域的畸变参数却标得不准。正确的评估方式是看分区域误差分布。把图像按九宫格划分统计每个区域的角点重投影误差每个区域都应该在0.3像素以下。如果某个边缘区域误差异常高说明该区域的图像采集覆盖不够或有系统性问题应该补拍该区域的标定板图像。6.3 多相机时间不同步让外参标定结果飘忽不定做环视多目系统时最开始用各相机自由曝光模式采集标定板图像手动触发每一台相机的拍摄。多路相机之间本身存在几毫秒到几十毫秒的启动延迟采集标定板时手持晃动又叠加了标定板位置变化导致外参标定的重投影误差忽高忽低同样的操作多跑几遍结果都不一致。后来把多台相机的触发信号统一接到同一个硬件触发源上所有相机在同一时刻曝光外参标定的稳定性立刻改善。这个问题的隐蔽性在于它不会以“标定失败”的形式出现而是表现为标定结果重复性差、系统参数隔一段时间就要重标。如果你也遇到类似情况检查多相机时间同步是第一步。6.4 面向工程化的标定质量检查表项目收尾或交付前我通常按下面这张检查表过一遍标定质量检查项指标说明单目重投影误差小于0.3像素按九宫格分区域评估内参重复标定偏差fx/fy偏差小于0.5%同一相机重复标定应一致双目校正行对齐行差小于1像素在图像边缘区域检查远端特征多目外参重投影误差小于0.5像素全局联合优化后统计标定板平整度起伏小于0.05毫米工业板出厂数据或卡尺实测时间同步精度小于曝光时间的一半硬件触发优先这套检查表不是我发明的是踩了无数次坑之后沉淀出来的底线标准。按这个标准走不敢说标定结果多惊艳至少项目不会在标定环节拖后腿。每个项目场景差异很大遇到特殊工况再针对性调整但骨架思路是通用的。最后再分享一个个人习惯标定产生的数据一定要留档包括每张标定板图像、对应的检测角点、重投影误差、最终参数版本号。项目运行一段时间后如果发现视觉精度下降这些数据就是排查是镜头松动、标定参数丢失还是环境变化导致的精确定位依据。标定这件事一次做好不难难的是每次都能复现同样的精度而留档是复现的第一步。