2D标定没那么神秘:仿射变换帮你搭建像素↔毫米的桥梁
2D标定没那么神秘:仿射变换帮你搭建像素↔毫米的桥梁
一台相机、一个平面、几个点,就能把“图像坐标”变成“真实尺寸”
在机器视觉项目里,最常遇到的一个需求就是:知道图像上一个点,它在真实世界里到底在哪儿?有多远?
这个问题就是“2D标定”。而解决它最简单实用的数学工具之一,就是仿射变换。
今天我们就来聊聊,如何用仿射变换把“像素”和“毫米”连接起来。
为什么仿射变换可以用来标定?
想象一下理想情况:
- 相机光轴完全垂直于被测平面
- 镜头没有畸变
那么,图像平面和物理平面之间,就只差一个线性关系:缩放、旋转、平移。这不就是仿射变换吗?
当然,现实中没有绝对完美的垂直和零畸变。但在很多实际场景中:
- 视场不大
- 精度要求不是“微米级”
- 或者你已经提前做了畸变校正
用仿射变换来近似这个映射,完全够用,而且非常简单。
于是,2D标定的核心任务就变成了:
👉 求出一个仿射变换矩阵,能把像素坐标 (row, col) 映射到世界坐标 (Xw, Yw)
三个最典型的应用场景
1️⃣ 像素当量标定(最简单)
- 放一个已知实际尺寸的标准圆(或方格)在视野里
- 测量它的像素直径
- 就能算出 1 像素 = 多少毫米
- 很适合测量长度、间距、直径
2️⃣ 机器人手眼标定(平面抓取)
- 相机固定在机器人的上方,拍摄平面上的工件
- 通过标定板建立图像 ↔ 机器人坐标系的映射
- 机器人就能根据视觉定位,精准抓取
3️⃣ 多相机拼接或位置补偿
- 两个相机拍摄同一平面,需要统一坐标系
- 用仿射变换做图像配准或坐标对齐
Halcon 里的实现:四步搞定
第1步:拍标定板,提取点的像素坐标
你可以用圆点阵或棋盘格标定板,物理间距是已知的。
通过 Halcon 的 find_calib_object 或者手动提取圆心,得到一组 (row, col)。
第2步:定义这些点的世界坐标
以标定板左上角为原点,单位 mm,给每个点分配 (Xw, Yw)。
第3步:一句话计算变换矩阵
vector_to_hom_mat2d (PixelRows, PixelCols, WorldY, WorldX, HomMat2D)
⚠️ 注意:Halcon 中 Row 对应 Y,Col 对应 X,所以传入顺序是
像素Y, 像素X, 世界Y, 世界X。
第4步:应用矩阵,完成转换
* 单个点转换
affine_trans_point_2d (HomMat2D, row, col, worldY, worldX)
* 整张图像矫正到世界坐标系(拉正)
affine_trans_image (Image, ImageRectified, HomMat2D, 'constant', 'false')
就这么简单,你已经完成了从像素到真实世界的映射。
小贴士:如果手里的矩阵是反的怎么办?
有时候你已有的矩阵是从世界坐标 → 像素坐标的,没关系,求个逆矩阵就行:
hom_mat2d_invert (HomMat2D_WorldToPixel, HomMat2D_PixelToWorld)
affine_trans_point_2d (HomMat2D_PixelToWorld, Row, Col, WorldY, WorldX)
这些坑,你最好提前知道
| 问题 | 影响 | 怎么办 |
|---|---|---|
| 镜头畸变明显 | 映射不准,边缘尤其严重 | 先做畸变校正,再用仿射标定 |
| 标定物体不是严格平面 | 仿射变换不适用 | 需要用透视或3D标定 |
| 只用了3个点,而且共线 | 解不唯一或矩阵不稳定 | 至少用4个不共线的点,越多越好(vector_to_hom_mat2d 会自动用最小二乘) |
| 标定点集中在局部区域 | 外推精度很差 | 让标定点均匀铺满整个工作区域 |
什么时候该用仿射变换,什么时候不该?
| 场景 | 推荐 |
|---|---|
| 小视场、低精度、快速标定 | ✅ 仿射变换足够 |
| 镜头畸变大(如广角、鱼眼) | ❌ 先畸变校正,再用仿射 |
| 物体有高度变化(不是平面) | ❌ 需要透视或3D标定 |
| 微米级精度要求 | ⚠️ 建议做完整的相机标定(含畸变模型) |
| 光轴明显不垂直(斜拍) | ⚠️ 仿射还能凑合,但透视模型更好 |
一句话总结
在2D平面标定中,仿射变换就是连接“像素坐标”和“物理坐标”的最简单桥梁。
它特别适合:快速现场标定、精度要求不高的测量、或作为复杂标定前的粗校准。
下次你再需要把“图像里的像素”变成“机器能懂的毫米”,不妨从仿射变换开始。三个点,一行代码,世界坐标就出来了。
如果想要了解原理,这里还有一篇文章:玩转Halcon中的2D仿射变换:从原理到实战
你用过仿射变换做过哪些有趣的应用?欢迎留言分享~ 😊
更多推荐



所有评论(0)