简介计算机视觉从业者在进行视觉检测与尺寸测量前常需先完成相机标定。这份《Halcon参考手册英文直译中文版无删减》第六章“Calibration/标定”是Halcon相机标定章节的完整汉化手册贴合标定板选择、畸变补偿、内外参数设置、单目/双目/手眼校准等高频场景适合算法工程师与视觉集成人员对照查阅、排查标定精度问题。资源为单个PDF文件压缩包共1个文件、约813KB便于下载后按章节离线阅读。目前已有362人学习浏览。手册内容覆盖校准对象查找、投影与反投影、畸变校正、参数处理、自校准及多相机设置并给出0.1像素均方根误差等结果判读标准可作为中文参考资料帮助读者快速理解原文术语在项目调试中少走弯路。1. 标定是视觉测量的地基这份无删减手册能帮你少走半年弯路做视觉尺寸测量的人迟早会在标定这一关踩上一次坑。HALCON 参考手册第六章 Calibration 的直译中文版讲透了从校准板选型、相机参数结构、数据模型准备到拍图规范、畸变模型选择这一整条链路。这一章最反直觉的地方在于标定成不成功不看校准板认得有多准而看后投影均方根误差 RMSE 能不能压到 0.1 像素左右这个量级。适合正在搭单目测量、视觉引导或机器人抓取项目的从业者新手可以照着步骤准备数据和执行校准熟手则能把它当参数速查表确认自己对 Sx、Sy 这类固定参数的边界判断是否准确。这份无删减译文把整个逻辑链条完整保留了下来值得放进参考资料里反复翻。2. 校准板与相机参数先选对板型再读懂九到十六个内参2.1 六边形与矩形校准板板型决定后续流程HALCON 标准校准板只有两种排列方式六边形排列标记板和矩形排列标记板。这不是个人偏好问题后续的图像数量要求、是否允许局部可见、坐标系原点定义甚至适用的算子都不一样。开始标定前先确认手里是哪块板后面才不容易翻车。对比项六边形排列标记板矩形排列标记板生成描述文件算子create_caltabgen_caltab查找器图案特殊六边形标记组其中部分带点状孔周围框架加上三角形角标记板是否必须完全可见否至少一个查找器图案可见两个可判镜像是必须整板入图建议最小图像数至少 6 张其中至少 4 张为倾斜位姿至少 15 张世界坐标系原点第一个查找器图案中心标记的中心校准板表面中间坐标系方向z 轴指向板面x 轴向右y 轴向下同左旧算子兼容性camera_calibration 不适配find_caltab find_marks_and_pose 可替代选型上我一般这么判断大视场、被测物体可能遮挡部分板、想多拍几个角度的场景优先用六边形板因为它不要求整板可见只要视野里出现至少一个查找器就能迭代相反如果相机视野能稳稳包住整块的矩形板的提取结果更直观而且坐标原点就在板面中间后续做手眼标定或构建基准都比较省事。注意矩形板必须完全可见视场装不下整块就别硬选它否则 find_caltab 会一直找不到。2.2 面阵相机内部参数九到十六个参数的读法内部参数描述的是传感器尺寸和镜头投影特性。面阵相机按镜头类型展开后常见的内部参数从 9 到 16 个不等。手册里给了很清晰的清单核心在这几个族常规投影镜头 面阵相机area_scan_division 和 area_scan_polynomial对应分割畸变模型和多项目式畸变模型。division 模型参数是 Focus、Kappa、Sx、Sy、Cx、Cy、ImageWidth、ImageHeightpolynomial 模型把 Kappa 换成 K1、K2、K3、P1、P2。远心镜头 面阵相机area_scan_telecentric_division 和 area_scan_telecentric_polynomial。这里把 Focus 换成 Magnification也就是放大倍率。倾斜镜头系列area_scan_tilt_division、area_scan_tilt_polynomial、area_scan_tilt_image_side_telecentric_division 等。这一族多出 ImagePlaneDist、Tilt、Rot 三个参数专门描述光轴相对传感器平面的倾斜关系。超中心镜头area_scan_hypercentric_division 和 area_scan_hypercentric_polynomial参数结构跟常规面阵类似。内部参数里最容易被忽视的是带星号的固定参数。以 Sy 为例因为大多数相机是同步采样Sy 由芯片尺寸决定不需要估计。这里有个数学模型上的必然针孔相机模型下焦距 Focus、Sx、Sy 三者无法同时确定算法固定 Sy 来解开歧义。远心镜头同理放大倍率 Magnification 与 Sx、Sy 也不能同时标定于是固定 Sy像侧远心倾斜镜头更严格除了 Sy 连 Sx 也一起固定。各参数的初值来源和估计状态如下表参数含义初始值来源是否参与优化Focus焦距镜头标称焦距如 0.008 米估计Magnification放大倍率远心镜头标称倍率如 0.2估计Kappa径向畸变系数0.0估计K1/K2/K3/P1/P2畸变系数0.0估计Sx像元水平间距相机芯片规格固定Sy像元垂直间距相机芯片规格固定Cx/Cy主点坐标半图像宽高估计ImageWidth/ImageHeight采样图像宽高采集设置固定Tilt/Rot/ImagePlaneDist倾斜镜头参数从镜头倾斜机构读取估计这里有一个非常容易踩的细节如果图像做了次采样Sx、Sy 的值要相应放大Cx、Cy 和 ImageWidth、ImageHeight 则要缩小。有人标定完发现 Sx 和规格书差了好几倍先别怀疑算法检查是不是分辨率缩放后忘了用对应的初值。2.3 外部参数与单位约定外部参数描述的是三维姿态即世界坐标系相对于相机坐标系的位置和方向。一共六个量TransX、TransY、TransZ 沿相机坐标系三轴平移RotX、RotY、RotZ 绕相机坐标系三轴旋转再加上一个姿态表示类型的编码。当使用标准 HALCON 校准板时世界坐标系由校准板自身定义坐标原点按上一节表格中的位置确定。单位问题看着不起眼实际影响很大。HALCON 校准板以米为单位相机参数也默认使用米制对应单位。如果项目里习惯用毫米就必须把所有长度相关参数统一换算否则焦距、Sx、偏移量之间会出现一个稳定的比例误差标出来的模型在度量意义上完全错位。手册里反复强调这一点实操中也常被忽略建议一开始就固定单位制不要中途切换。3. 从 create_calib_data 到 calibrate_cameras标定数据模型的四步准备3.1 创建模型与填入相机参数实际标定前所有信息都放在一个校准数据模型里。流程不是上来就调 calibrate_cameras而是先建模型、填参数、收集观测最后才执行优化。手册给出的顺序可以归纳成下面的调用链步骤操作符作用关键输入1create_calib_data创建校准数据模型相机数量、校准对象数量2set_calib_data_cam_param指定相机类型和初始内参相机索引、相机类型、参数元组3set_calib_data_calib_object载入校准对象描述校准对象索引、描述文件路径4find_calib_object提取标记并估计初始姿态图像、相机索引、校准对象索引5set_calib_data配置优化范围排除项如 sx、sy6calibrate_cameras执行实际校准校准数据模型句柄7get_calib_data查询标定结果内参、外参、标准差、RMSEcreate_calib_data 第一个参数是相机数量。做单目标定传 1双目或多视图按实际相机数传。第二个参数是校准对象数量如果一套标定里要用多块不同板也要在这里声明后续再逐块做 set_calib_data_calib_object。set_calib_data_cam_param 这一步最关键的是相机类型字符串必须和镜头匹配。投影镜头配 division 类远心镜头配 telecentric 类倾斜镜头配 tilt 类写错类型后面优化出来的参数没有物理意义。初始内参元组里的 Focus 用镜头标称焦距比如 8mm 镜头写 0.008远心镜头用标称放大倍率畸变系数一律先写 0。镜头的标称值不一定准但它能给优化一个合理的起点避免掉进局部极小。3.2 收集观测数据与旧算子兼容问题观测数据就是校准标记的图像坐标以及校准对象相对相机的粗略姿态。get_calib_data 之前必须把图像数据喂进模型这一步由 find_calib_object 完成。它要求输入的图像里校准板清晰、对比度够否则提取出的标记坐标本身就带误差后续优化再努力也救不回来。如果用的是矩形排列标记板也可以组合 find_caltab 和 find_marks_and_pose 两个旧算子达到同样效果。这是 camera_calibration 时代保留下来的方案习惯旧接口的人可以沿用。但注意六边形板不适用于 camera_calibration别拿旧接口去配六边形板手册明确写了这一点。3.3 配置优化范围与执行校准当某些内部参数已知得很精确时可以把它排除在优化之外。手册给了一个典型场景如果相机的传感器单元尺寸 Sx、Sy 能精确确定只需要标定其余参数就调用 set_calib_data (CalibDataID, camera, 0, excluded_settings, [sx, sy])。这个调用在视觉项目里非常常用尤其是高分辨率面阵相机的像元间距来自芯片手册可信度很高时固定住反而能让 Focus 和主点收敛得更稳。配置完成后calibrate_cameras 会用存储在校准数据模型里的所有观测数据执行优化。它不是只算一组内参就结束而是同时完成三件事优化内部参数、为每次观测计算并添加外部参数姿态、计算内参标准差、协方差以及后投影的均方根误差 RMSE。优化结束后用 get_calib_data 把内参、外参和误差指标取出来这一步的结果才是判断标定质量的数据来源。4. 拍一组合适的标定图像角度、数量与画质的六个硬指标4.1 相机设置的三个不变项采集图像期间光圈不能改变相机位置不能移动焦点也就是焦距同样不能改变。这三个不变项的逻辑很直接标定得到的内参描述的是当前光学设置下的投影关系任何一项中途变动都等于换了另一套光学配置旧标定结果就作废了。很多人以为只要对焦清晰就行实际上光圈一变化景深和畸变分布都会跟着变这个坑越到产线越明显。4.2 校准板放置与图像数量校准板的位置和方向要有意识变化。一组图像里视场的每个部分至少应该被板覆盖一次板也可以填充整个图像。方向不要平行着不动校准图像集里还应该包含倾斜板子的图像倾斜角度大约在 30 到 45 度之间。如果景深有限实现不了这个角度至少要尽量靠近这个范围。数量上六边形板至少 6 张其中至少 4 张是倾斜位姿矩形板建议至少 15 张。数量不是拍脑袋定的六边形板因为允许部分可见几张不同方向的倾斜图就能把畸变参数约束住矩形板要求整板可见且覆盖范围有限需要更多位姿去补偿视野各区域的观测密度。4.3 画质硬指标直径、对比度、过曝与同质性图像质量直接决定标定能否成功手册给了几个可以抄作业的硬指标指标要求说明标记直径至少 20 像素太小则亚像素提取抖动被误差放大明暗对比度至少 100 灰度值8 位图像下保证检测算子稳定过曝上限浅色部分灰度值不超过 240标记附近尤其不能过曝照明同质性浅色部分灰度值范围不超过 45保证均匀照明尽量避免反光覆盖与方向视野每部分至少被板覆盖一次方向应在一组图像内变化镜像检查六边形板至少可见两个查找器用于判断板是否被反向成像过曝是最容易犯的错。标定板的浅色区域灰度一旦超过 240标记边缘会溢出提取的中心点位置就不再准确。宁可整体暗一点也不要局部高光反射高光造成的误差不是后处理能补回来的。均匀照明下同一块板上的灰度分布应该平缓反射引起的亮斑会造成标记中心系统性偏移。4.4 畸变模型选型分割模型还是多项式模型区域扫描相机有 division 和 polynomial 两种畸变模型选型对最终精度影响很大。两者对比看关键差别对比项division 分割模型polynomial 多项式模型畸变参数单参数 KappaK1、K2、K3、P1、P2径向畸变模拟单参数近似高阶项更贴近真实分布离心畸变不建模用 P1、P2 模拟逆畸变计算解析可反解必须迭代求解较慢鲁棒性校准图像少或覆盖不足时更稳需要视野覆盖更充分我一般会先用 division 模型跑一遍。它的优势在于畸变较小或校准图像数量有限时结果比多项式模型稳定得多而且逆畸变能解析计算后续做反投影和测量时速度更快。只有当 division 模型的 RMSE 压不下来、确认图像覆盖足够充分时才切换到 polynomial 模型换更高阶的精度。还有一点要记住多项式模型只能保证在校准板覆盖到的区域内模拟准确视野边界和没覆盖到的区域外推的畸变完全可能失真。5. 标定避坑与常见问题五个现象与对应的排查方法5.1 RMSE 远超 0.1 像素现象单目标定结果 RMSE 在 0.5 甚至 1.0 像素以上。原因通常是图像质量问题比如对焦不实、标记过曝其次才是校准图像数量不足再有就是校准板自身的制造精度不够。解决先按第 4 章的硬指标重新拍一组图检查标记直径是否达到 20 像素确认板的浅色区域没有高光溢出。如果重拍后 RMSE 依然很大再怀疑板子精度换一块正规渠道购买的校准板复测。5.2 六边形板镜像与倒置现象find_calib_object 在部分图像上返回错误或者提取出的标记坐标与几何表对不上。原因玻璃材质的校准板被背面朝前拍摄时标记会透过玻璃形成镜像查找器图案的方向判断失效。解决确保图像中至少可见两个查找器图案这样算法能判断板是否镜像。HDevelop 在检测到镜像时会返回对应错误信息看到错误先检查板的正反而不是去调算子参数。5.3 光圈或焦点改变后测量漂移现象上午标定完下午微调了一次镜头对焦哪怕只是很小的转动测量结果开始整体偏移。原因焦距变化直接改变了内参旧标定的相机模型不再适用。解决光圈和焦点在图像采集期间必须锁死。每次调过镜头哪怕是计划内的调整都重新走一遍标定流程。这条看起来简单却是产线上最常见的翻车源头。5.4 Sx 标定值与规格书差数倍现象标定出来的 Sx 比相机芯片手册上的值大了两三倍但 RMSE 却正常。原因可能图像在采集或处理时做了次采样Sx 会相应放大同时 Sx 与 Focus、Sy 之间存在耦合针孔模型下三者不能同时确定算法强制固定 SySx 的估计结果依赖初值。解决改过分辨率后按缩放比例先换算 Sx、Cx、Cy 的初值再执行标定。5.5 自打印校准板压不进 0.1 像素现象用自己打印的标定板跑标定RMSE 始终在 0.3 到 0.5 像素徘徊。原因普通打印机的定位精度本身有限纸张收缩、碳粉边缘锯齿都会让标记的实际三维位置和描述文件不一致。解决自打印板只能用于流程验证和算法调试高精度测量应用必须使用刻蚀或镀膜工艺的精密校准板并配套对应的描述文件。6. 进阶验证与边界参数三种 3D 相机模型的剩余细节6.1 用残差回投验证标定闭环标定完成后最直接的验证方式就是残差回投。用 get_calib_data 把校准板标记的三维坐标和对应姿态取回来将三维点按标定出的相机模型重新投影到图像平面和实际提取的图像坐标做差这个平均距离就是 RMSE。常规单目相机 0.1 像素左右说明优化和观测数据拟合得很好如果差得远问题大概率出在图像质量、图像数量或校准板精度上。别只看最终 RMSE还要把每张图的残差单独拉出来看如果有某一张特别大通常是那张图里板子倾斜太极端或局部过曝。6.2 三种相机模型与变换链HALCON 把 3D 相机模型分成三类区域扫描针孔相机、区域扫描远心相机、线扫描针孔相机和线扫描远心相机。从世界坐标点到像素坐标要经过四步先用刚性变换把点从世界坐标系转到相机坐标系再做投影针孔用焦距 Focus远心用放大倍率 Magnification接着加镜头畸变division 或 polynomial 按选型来倾斜镜头还需要在畸变后额外做一次二维射影变换。线扫描相机的特殊之处在于每条图像线对应不同的成像位置但所有转换都基于第一条图像线对应的相机坐标系运动矢量 Vx、Vy、Vz 以米/行的单位补偿相对运动。6.3 远心与线扫的参数边界远心镜头下校准板到相机的距离在光学上无法确定所以标定结果中外参的 Z 分量被设定为 1 米这只是一个参考值不是真实物理距离。线扫描远心相机里 Vz 对三维点的图像位置没有影响因此它不参与优化初始值应设为 0。倾斜镜头也有类似边界镜头畸变越大Tilt 才能标定得越准畸变很小时优化的 Tilt 可能和机构读数相差很大但只要 RMSE 很小这套参数在校准空间内描述成像几何就是一致的不影响测量使用。我现在的习惯是每次标定完都强制自己走一遍同一个验证顺序先看 RMSE 是否落在 0.1 像素附近再把各张图的回投残差列成一张表排除离群点最后把标记直径、对比度、同质性这三个拍图硬指标打印出来贴在工作台旁。这套顺序源自一次因重新对焦后直接复用旧内参导致整组测量结果同方向偏移的经历从那以后就不再凭感觉判断标定质量了。希望这些边界参数和排查思路能帮你少走一段弯路。本文还有配套的精品资源点击获取