1. 视觉标定概述:什么是相机标定、为什么需要标定、标定的核心目标与物理意义
大家好,我是老张。做机器视觉这行十几年了,每次带新人,第一个要讲透的就是标定。很多人觉得标定就是拍几张棋盘格照片,跑个算子就完事了。其实不然。今天咱们就把标定这件事,从根上捋清楚。
1.1 什么是相机标定?
说白了,相机标定就是给相机“量尺寸、纠偏差”。
你想想看,相机镜头不是完美的。它会把直线拍成曲线,把正方形拍成梯形,还会把真实世界的三维坐标压缩成二维像素坐标。标定要做的,就是找到这些畸变和映射关系的数学参数。
我习惯把标定分成三个层面:
- 内参标定:焦距、主点、畸变系数——相机自己的“性格”
- 外参标定:相机在世界坐标系里的位置和朝向——它“站在哪、看哪”
- 手眼标定:相机和机器人手臂的坐标关系——它“和谁配合”
咱们这门课主要聚焦在前两个,也就是单目相机的内参和外参标定。手眼标定后面有专门章节讲。
核心定义:相机标定是通过已知几何特征(如棋盘格角点)的图像,求解相机成像模型参数的过程。这些参数包括内参矩阵、畸变系数和外参矩阵。
1.2 为什么需要标定?
这个问题我经常被问到。有人觉得:“我买的工业相机出厂不是调好了吗?”
嗯,这里要注意:出厂参数是理论值,不是实际值。而且镜头一拧、光圈一调,参数就变了。
我举几个真实场景:
- 测量场景:你要测一个零件长50mm,不标定的话,像素当量算不准,测出来可能是49.2mm或者50.8mm。我曾经有个项目,客户投诉说我们的系统测距总是偏大0.3mm,查到最后就是标定板放歪了0.5度。
- 定位场景:机器人要抓取传送带上的工件。相机告诉机器人“工件在像素坐标(500, 300)”,但机器人需要知道“它在世界坐标的什么位置”。没有标定,这两个坐标系之间就是断的。
- 畸变校正:广角镜头边缘的桶形畸变,能把一条直线拍成弯的。不校正,边缘区域的检测精度直接崩掉。
避坑提醒:我曾经在一个3C电子厂的项目里,因为赶工期,用出厂焦距参数直接做测量,结果产品尺寸一致性差,被客户退货。从那以后,我定了个规矩:每次换镜头、调光圈、变工作距离,必须重新标定。没有例外。
1.3 标定的核心目标
标定的目标,用一句话概括:建立从像素到物理世界的精确映射。
具体拆开来看,有四个子目标:
| 目标 | 说明 | 对应参数 |
|---|---|---|
| 消除畸变 | 校正镜头带来的径向和切向畸变 | k1, k2, k3, p1, p2 |
| 确定内参 | 获取焦距、主点坐标、像素尺寸 | fx, fy, cx, cy |
| 确定外参 | 获取相机相对于世界坐标系的位姿 | R, t (旋转矩阵和平移向量) |
| 建立映射 | 实现像素坐标 ↔ 物理坐标的转换 | 单应性矩阵或投影矩阵 |
1.4 物理意义——标定到底在算什么?
咱们不推公式,只说物理意义。
相机成像,本质上是一个降维打击:三维世界投影到二维平面。这个过程中,信息丢失了(深度没了),形状扭曲了(透视效应),还加上了镜头畸变。
标定要做的,就是把这个过程的逆过程算出来:
- 内参矩阵:告诉你像素坐标系和相机坐标系之间怎么换算。比如,一个像素在传感器上对应多少毫米。
- 畸变系数:告诉你图像边缘被“拉”歪了多少,怎么把它“拉”回来。
- 外参矩阵:告诉你相机坐标系和世界坐标系之间怎么旋转和平移。
我打个比方:标定就像给相机做一次“视力检查+配眼镜”。内参是眼镜的度数,畸变系数是散光矫正,外参是你戴眼镜的角度和位置。三者合起来,才能让相机“看清”真实世界。
个人经验:我习惯在标定完成后,先做一步验证——用标定结果反投影几个已知点,看重投影误差。如果误差超过0.1像素,我会重新采集标定图像。这个习惯帮我避免了很多“标定完了但实际用不了”的尴尬。
1.5 标定的知识体系
下面这张图,是我自己总结的标定知识框架。每次培训新人,我都会先让他们看这张图,建立全局观。
这张图把标定的知识体系分成了四个层次:目标层、模块层、参数层和工具层。你从上往下看,就能理解标定到底在做什么。
1.6 标定在HALCON中的位置
在HALCON里,标定不是一个孤立的步骤,而是整个视觉系统的基石。我列一下常用算子,你就知道标定贯穿了哪些环节:
| 阶段 | HALCON算子 | 作用 |
|---|---|---|
| 标定板生成 | gen_caltab | 生成标定板描述文件 |
| 标定板识别 | find_caltab, find_marks_and_pose | 在图像中定位标定板并提取角点 |
| 标定计算 | camera_calibration | 求解内参、外参和畸变系数 |
| 畸变校正 | change_radial_distortion_cam_par | 生成无畸变图像 |
| 测量应用 | image_to_world_plane | 将像素坐标映射到物理平面 |
这些算子的具体用法,咱们后面章节会一个一个拆解。今天先把概念打牢。
我的习惯:每次开始一个新项目,我会先花15分钟做一次快速标定验证——哪怕只是拍一张标定板照片,跑一遍camera_calibration,看看重投影误差。如果误差大于0.3像素,我会检查光照、标定板平整度或者镜头是否松动。这个习惯帮我省了无数后期排查的时间。
好了,标定的概念就讲到这里。记住一句话:标定不是一次性的工作,而是贯穿整个视觉系统生命周期的基本功。后面我们会一步步深入,从标定板的选择、图像采集,到HALCON算子的具体参数配置,再到实际项目中的坑和技巧。