尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

相机标定核心算法张正友标定法原理与实战解析

相机标定核心算法张正友标定法原理与实战解析 简介这是张正友标定法Zhangs Calibration Method学习与实践资源适合计算机视觉初学者、相关课程学生及从事相机标定工作的工程师。内容围绕单平面棋盘格标定原理展开涵盖针孔相机模型、内参与外参估计、畸变系数求解、角点检测及坐标系转换等关键知识点同时给出MATLAB实现思路帮助读者从理论到代码快速上手标定流程。资源共27个文件以m脚本为主辅以asv备份、txt说明文档及caj论文原文压缩包仅85KB轻量便携。其中m文件可运行参考txt文件提供数据与步骤说明caj文件收录原始研究文献便于对照理解。已有497人学习下载。使用该资源可获得可直接调试的标定脚本、实验数据、结果文件以及原始论文参考适合用于课程设计、项目预研或自学入门是一份高效省时的相机标定参考资料。 标定相机最绕不开的一个名字就是张正友标定法。做视觉测量、三维重建、SLAM、无人机避障、机器人手眼标定只要你的项目里涉及到相机几何迟早要跟它打交道。今天我围绕这个方法本身把它背后的数学逻辑、实操流程、以及和其他主流标定法的对比一次性讲透。这篇文章适合刚接触计算机视觉的学生也适合已经在项目里用OpenCV标定过但没搞懂原理的工程师。张正友标定法的最大特点就是只需一个平面棋盘格相机在多个角度拍几张照片就能解出相机的内参、外参和畸变系数。相比传统标定需要高精度三维标定块它的器材门槛低、操作简单精度却能满足绝大多数视觉任务的需求相比自标定方法靠场景特征估算它的鲁棒性和精度又高出一大截。正因如此它在1998年提出之后迅速成为相机标定的事实标准至今仍是OpenCV和Matlab标定工具箱的核心算法。1. 张正友标定法的整体定位与核心思路1.1 从三大标定流派说起相机标定要解决的核心问题是建立三维世界坐标到二维像素坐标的映射关系。这个映射关系由两组参数决定内参描述相机本身的属性包括焦距、主点位置、像素歪斜外参描述相机在世界坐标系中的位置和姿态。标定方法大致分三个流派传统标定法、自标定法、基于主动视觉的标定法。传统标定法用已知尺寸的高精度标定块通过三维特征点的投影关系直接求解参数经典代表是Tsai两步法和DLT直接线性变换法。它们精度高但标定块制作昂贵且放置、检测要求严苛不适合现场快速标定自标定法不需要任何标定物直接利用场景中多视图之间的几何约束计算参数灵活但初始值敏感、鲁棒性差精度也达不到高精度测量需求主动视觉标定法通过控制相机做已知运动如纯平移、纯旋转来求解内参原理直观但依赖高精度运动平台应用场景受限。张正友标定法正好卡在传统法和自标定法之间。它用平面棋盘格作为标定物既不像三维标定块那样昂贵笨重又比自标定法多了精确的几何约束在精度、成本、便捷性之间取得了极好的平衡。1.2 张正友法的核心创新利用平面诱导的单应性这个方法的巧妙之处在于它没用传统的三维标定块而是把标定物拍平了用。棋盘格铺在平板上就可以把世界坐标系的其中一个轴设为0。这样原本需要求解三维到二维的映射关系就简化成了二维平面到二维平面的映射——单应性矩阵。这一步简化直接带来了两大好处。第一平面棋盘格极易获取一张打印的棋盘格贴在平板上或用显示器显示几十秒钟就能准备好第二单应性矩阵的求解有一套成熟稳定的算法直接线性变换加归一化数值稳定性好为后续的内参求解提供了可靠的初值。张正友法采用了两阶段求解策略先忽略畸变通过单应性矩阵的约束给出相机内外参的闭式解再把畸变系数加入对整个系统做非线性优化。这种“先有初值、后精化”的思路既保证了算法能收敛到全局最优附近又兼顾了求解效率。后期精化基于极大似然估计把所有图像的所有角点统一纳入优化目标精度非常可观。2. 核心原理深度拆解2.1 相机模型与内参外参的含义相机成像可以用针孔模型近似描述。一个世界坐标系下的三维点 P经过旋转和平移变换到相机坐标系再通过透视投影落到的像素平面上。整个过程可以用一个公式概括再具体一点世界坐标点[X,Y,Z]通过外参[R|t]转到相机坐标系然后除以Z_c深度归一化再乘以相机的内参矩阵K就从归一化平面映射到了像素坐标。内参矩阵里面的fx、fy是焦距相对于像素尺寸的缩放cx、cy是主点光轴与成像平面的交点的像素坐标s是像素倾斜因子现代相机一般近似为0。外参[R|t]把世界坐标和相机坐标联系起来。R描述相机坐标系在世界坐标系下的朝向t描述相机光心在世界坐标系下的位置。在不同的拍摄位姿下内参保持不变外参则随每次拍摄而变化。这就是为什么多张图像可以提供多条约束来联合求解内参。2.2 单应性矩阵的8个自由度与最少图像数量张正友法最精妙的一步是强制棋盘格平面在世界坐标系下的Z为0。这样一来原本旋转矩阵的三列向量[R1, R2, R3]中与Z轴对应的那一列R3在投影过程中被直接消掉了映射关系变成这里H就是单应性矩阵它把一个平面上的点映射到图像平面。单应性矩阵是3×3的通常缩放尺度归一化后有8个自由度。对每张棋盘格图像我们能从至少4个非共线角点的对应关系解出一个H。这个H带给了我们两个约束方程因为它们编码了内参矩阵K以及外参的旋转列向量R1、R2和平移向量t。利用旋转向量之间的正交性和模长相等性质可以建立关于内参的方程。每个H提供两个方程而内参矩阵有5个未知数fx、fy、cx、cy、s所以理论上最少需要3张图像6个方程才能解出全部内参。如果把s设为0则只需2张图像。实际使用中建议拍摄10到20张不同位姿的棋盘格因为噪声影响下方程组的解不够稳定多张图像不仅可以增加鲁棒性还能让畸变参数也被充分约束。2.3 畸变矫正与极大似然精化真实镜头并不是完美的小孔成像径向曲率和透镜装配误差都会让像素坐标发生偏移。径向畸变让直线变弯表现为桶形或枕形畸变切向畸变则来自透镜与成像平面不平行。张正友法采用主流的多项式畸变模型可以看到畸变模型先用r²、r四次方这些项描述径向畸变用2xy、r²2x²这些组合描述切向畸变。标定时我们把k1、k2、p1、p2纳入优化如果需要矫正大广角镜头还可以继续加入k3甚至更高阶项。整个优化流程是先从单应性矩阵求闭式解得到内参、外参初值再用极大似然估计对所有参数进行全局优化。优化的目标是让所有图像所有角点的重投影误差的总和最小——也就是把解出来的内外参和畸变系数代入相机模型把已知的世界坐标角点重新投影回图像计算与检测到的像素角点的差异。这个步骤在OpenCV中由calibrateCamera完成默认使用Levenberg-Marquardt算法迭代求解迭代收敛到局部最优之后得到的就是最终标定结果。3. 实操流程从棋盘格到标定报告3.1 标定板准备与拍摄要点我平时准备标定板有几种方式要求不高时直接用普通打印机将棋盘格打印在A4纸上贴在平整的硬板上需要高精度时去广告印刷店打印到铝板或亚克力板上平整度更好长期使用也不易变形。棋盘格不要选太密的比如9×6、12×9这些常见规格每个方格的边长要精准测量记录这个物理边长是后续尺度恢复的基准务必用卡尺多测几处取平均。拍摄时记得关闭自动对焦、自动白平衡和自动曝光。自动对焦会改变镜头的焦距直接破坏内参的一致性自动曝光会导致过曝或欠曝增加角点检测的误差。建议把相机固定转动棋盘格或者反过来把棋盘格固定转动相机覆盖不同的角度和距离。经验上至少拍15张让棋盘格在画面中占据足够大的面积并刻意让棋盘格倾斜覆盖画面边缘、角落这些畸变最明显的区域。3.2 基于OpenCV的标定流程OpenCV提供了完整的标定工具链核心流程如下第一步读取图像并转为灰度图用findChessboardCorners检测棋盘格角点。检测时传入棋盘格内角点数量比如9×6的棋盘格传入(9, 6)。如果检测失败可能是图像太暗、角点被遮挡或棋盘格过小适当调整预处理后处理。第二步用cornerSubPix对角点做亚像素细化。这一步很关键findChessboardCorners返回的角点精度大约在像素级cornerSubPix会在梯度方向上搜索把角点位置精化到亚像素级别。注意参数需要设置合适的winSize搜索窗口和ZerZone零区域。第三步声明物体坐标系。把棋盘格置于Z0平面角点坐标从(0,0,0)开始逐个生成(7, 7, 0)、(14, 7, 0)等坐标。这些坐标以“格数”为单位标定的结果尺度只对相机与棋盘格的相对尺度有意义如果你输入的是毫米内参焦距也对应毫米尺度但本质上所有尺度都是相对的只要后续三维重建时保持单位一致即可。第四步调用calibrateCamera传入所有图像的角点坐标、物体点坐标和图像尺寸返回相机矩阵、畸变系数、旋转向量、平移向量。flows如下import cv2 import numpy as np import glob # 棋盘格内角点数 pattern_size (9, 6) # 方格边长记得改成你实际测量的值单位可任意但需与后面尺度一致 square_size 25.0 objp np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32) objp[:, :2] np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) * square_size objpoints [] imgpoints [] images glob.glob(calib_images/*.jpg) for fname in images: img cv2.imread(fname) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners cv2.findChessboardCorners(gray, pattern_size, None) if ret: criteria (cv2.TERM_CRITERIA_EPS cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) corners2 cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) objpoints.append(objp) imgpoints.append(corners2) ret, mtx, dist, rvecs, tvecs cv2.calibrateCamera( objpoints, imgpoints, gray.shape[::-1], None, None ) print(内参矩阵\n, mtx) print(畸变系数\n, dist) print(重投影误差, ret)这组代码足够完成一次基础的相机标定。注意calibrateCamera返回的ret就是重投影误差这是判断标定质量的最直接指标。3.3 结果评估怎么判断标定质量标定完成后首先要看的就是重投影误差。在大多数室内视觉任务中重投影误差控制在0.1像素以内属于优秀0.2~0.3像素属于良好超过了0.5像素就要检查拍摄流程了。误差偏大的常见原因包括棋盘格不平整导致角点物理坐标与假设不符、图像运动模糊、光照不均导致角点检测抖动、拍摄数量不足或位姿覆盖不充分。另外要检查内参是否合理。用标定结果反投影计算焦距fx和fy可以把fx除以图像宽度得到的比值应该和镜头标称焦距除以传感器宽度的比值接近。主点cx、cy通常接近图像中心偏差特别大时说明标定图像存在明显的单边覆盖问题。畸变系数方面k1的值一般在-0.5到0.5之间p1、p2在-0.01到0.01量级超出这个范围就要怀疑标定板、图像质量或检测过程出了问题。4. 张正友法和其他标定法的选型对比4.1 传统标定法与张正友法的对比以Tsai两步法和DLT为代表的传统标定法需要精密加工的三维标定块上面布满了位置精确已知的特征点标定时必须用这些点建立空间坐标与像素坐标的映射关系。精度自然高但代价也非常明显三维标定块非常昂贵体积大、携带不便且标定块的加工精度直接决定标定上限。而在实际工程里这类标定块的应用场景很少——即便有也很难保证在现场有足够大的操作空间。张正友法用平面标定板替代了三维标定块标定板成本低到几乎可以忽略同时通过多视角拍摄的几何约束来弥补平面信息维度的不足。它的标定精度虽然理论上在产品级相机和大畸变镜头下略逊于顶级的Tsai法但工程上已经完全够用操作便捷度则远胜。如果你做的是高精度的工业测量项目并且有条件使用精密三维标定块传统标定法仍有优势如果是常规的视觉定位、三维重建、机器人抓取选张正友法基本不会错。4.2 自标定法与张正友法的对比自标定法不需要标定物完全依靠场景中多视图的匹配关系来求解内参。比如通过多张图像中的消失点、对极几何约束、绝对二次曲线等几何信息来估计内参。说起来很诱人解决了很多无法放置标定板的应用问题但代价是解的不确定性和噪声敏感性远高于平面标定法。少数情况下甚至会出现完全偏离实际的内参解需要人工干预。张正友法的鲁棒性来源于棋盘格角点精确已知的几何位置。这是一个刚性约束角点之间的相对位置关系是明确的优化过程不容易跑偏。自标定法则没有这样的锚点完全依赖图像特征很容易被重复纹理、遮挡、光照变化干扰。凡是对精度有一定要求的项目如果允许放置棋盘格我都会优先选择张正友法。4.3 主动视觉法与深度学习方法主动视觉标定法通过控制相机做精确的纯平移或纯旋转通过已知的运动模型来求解内参。它的数学推导非常优美但工程落地受限于运动平台的精度。如果你的应用本身就是机械臂这类自带精确位姿反馈的场景主动视觉方法倒是可以考虑但大多数项目不具备这种条件。基于深度学习的标定方法是近年来的热点输入单张或多张图像直接回归相机内参甚至直接回归深度图。优势在于部署时无需标定板且在大规模数据训练下对畸变的适应性很强。但目前深度学习方法仍然难以匹敌张正友法在可控场景下的亚像素级精度且难以解释、显存开销大工程落地远没到替代传统标定的程度。它更常见于大规模自动驾驶数据集的批量内参估计也就是“粗标定”场景。4.4 方法选型速查表方法标定物精度成本操作难度适用场景张正友法平面棋盘格高亚像素极低低绝大多数视觉任务传统三维标定法精雕三维标定块最高很高高高精度工业测量自标定法无中低无中不允许放置标定板的场景主动视觉法精密运动平台高高高有精确平台控制的场景深度学习方法大量标注图像中高低大规模批量自动标定5. 常见问题与避坑指南5.1 图像采集阶段的典型坑拍摄时棋盘格反光往往是最先遇到的坑。打印的棋盘格贴在玻璃或光滑面板上会在某些角度产生强烈的镜面反射导致检测不到角点或角点偏移。解决办法是把标定板稍微压暗处理拍摄时避免强光直射必要时使用偏光镜。另一个高频问题是图像数量不够。标定要求棋盘格覆盖视场的中心和边缘但很多人随手拍几张就完事。经验是每张图让棋盘格与相机的夹角有变化转动整个棋盘格而不是平移它并保证覆盖至少15张有效图像。有效图像的判断标准就是findChessboardCorners能成功检测到角点少于这个数标定的稳定性明显下降。还有一点容易被忽略标定板的平整度。纸张受潮、翘边都会让角点坐标偏离模型假设看似微小的偏差会在优化时被放大为畸变系数的严重误差。如果发现棋盘格紧贴平板后仍有褶皱宁愿重新打印一张。5.2 参数设定与优化细节拍摄前一定要把相机的自动对焦关掉或者锁定焦距。很多人标定时用了变焦镜头却忘了固定焦距标定过程中焦距变化导致内参会变成“模糊后的平均值”后续测量就会整体性偏软。如果镜头是变焦的实际使用时要固定在同一焦段最好贴胶带锁死机械焦环。角点检测之后不要直接送去标定。用cornerSubPix做亚像素细化非常必要这一步对重投影误差的影响可能达到0.1像素以上。同时注意棋盘格要尽量铺满画面但不要占到画面边缘本身边缘处的强畸变区域反而应该通过倾斜棋盘格让它露出来。5.3 实际项目中的经验建议标定完别急着下发参数先在现场做一次直观验证。打印一张A4棋盘格用标定结果做一次位姿估计然后在图像中叠加投影出来的三维坐标系看看是否锁得稳。误差大的话可以拍一段带棋盘格的视频在线跟踪角点看看重投影误差是否始终稳定。多传感器系统的标定顺序也很重要如果同时标定相机和激光雷达或双目相机系统应该先单独标定每一个相机的内参再标定传感器之间的外参。内参是外参标定的前提内参有偏差时外参标定的结果会把这些误差分配到传感器之间的旋转和平移上后续融合就各种别扭。最后再说说热词搜索里的对比问题。很多人纠结“张正友标定法和其他标定法哪个好”其实没有绝对意义上的好坏只有适不适合。对绝大多数应用来说张正友法就是那个“够好”的方案它不需要昂贵的硬件容错性强精度完全够用。我自己的项目里高精度工业检测用三维标定块做基准所有现场部署和日常标定全部走张正友法这个组合经过多年验证非常省心。正因如此掌握张正友标定法不仅仅是学会调用一个OpenCV函数而是理解了一套经典的标定问题建模与求解框架。它能帮你在遇到新传感器、新镜头、新场景时快速定位问题的根源这是任何现成工具箱都无法替代的能力。本文还有配套的精品资源点击获取
返回列表