1. 坐标系基础:理解世界坐标系、相机坐标系、图像坐标系、像素坐标系的概念与关系

做机器视觉的人,天天跟坐标系打交道。我刚开始接触HALCON时,就被这四个坐标系绕晕过——明明看着同一个点,怎么在不同坐标系下坐标值差那么多?后来踩了几个坑才明白,坐标系转换是整个视觉系统的地基。地基不稳,后面做标定、做定位全得翻车。

这一章,咱们就把这四个坐标系彻底捋清楚。

1.1 为什么需要四个坐标系?

你想想看,一个视觉系统里,有相机、有机器人、有工件。相机看到的是像素,机器人要的是物理坐标,工件有自己的摆放位置。没有一个统一的坐标系语言,这些设备根本没法对话。

四个坐标系的作用,说白了就是一层层做“翻译”:

  • 世界坐标系:描述真实世界的位置,单位是mm
  • 相机坐标系:以相机光心为原点,描述物体相对相机的位置
  • 图像坐标系:在成像平面上,用物理单位描述投影位置
  • 像素坐标系:图像在计算机里的存储方式,单位是像素

我在项目中遇到过一位同事,直接拿像素坐标去控制机器人抓取,结果偏了十几毫米。嗯,这就是没搞懂坐标系关系的典型翻车现场。

1.2 四个坐标系详解

1.2.1 世界坐标系 (World Coordinate System)

世界坐标系是咱们自己定义的“参考系”。你可以把原点放在工作台角落,也可以放在机器人基座中心。怎么方便怎么来。

  • 通常用 (Xw, Yw, Zw) 表示
  • 单位:毫米(mm)
  • 作用:描述工件、相机、机器人在真实空间中的位置
我的习惯:做项目时,我一般把世界坐标系原点放在机器人基座中心,Z轴朝上。这样后续做手眼标定,数据直接能用,省去一次转换。

1.2.2 相机坐标系 (Camera Coordinate System)

相机坐标系的原点在相机光心,Z轴沿着光轴方向指向物体。这个坐标系描述的是“物体相对于相机的位置”。

  • 通常用 (Xc, Yc, Zc) 表示
  • 单位:毫米(mm)
  • Zc 就是物距

从世界坐标系到相机坐标系,靠的是外参矩阵(旋转 + 平移)。外参决定了相机在世界中的位姿。

1.2.3 图像坐标系 (Image Coordinate System)

光线通过镜头,在成像平面上形成倒立的像。图像坐标系就建在这个平面上,原点通常在图像中心(主点)。

  • 通常用 (x, y) 表示
  • 单位:毫米(mm)
  • 原点:相机光轴与成像平面的交点

从相机坐标系到图像坐标系,靠的是透视投影——也就是小孔成像模型。这里用到了焦距 f。

1.2.4 像素坐标系 (Pixel Coordinate System)

图像最终要存成数字信号。像素坐标系就是图像在计算机里的“地址簿”。

  • 通常用 (u, v) 表示
  • 单位:像素(pixel)
  • 原点:图像左上角
  • u 轴向右,v 轴向下

从图像坐标系到像素坐标系,靠的是内参矩阵——包括像元尺寸 (dx, dy) 和主点偏移 (u0, v0)。

我曾经踩过的坑:像素坐标系的原点在左上角,v 轴向下。而图像坐标系的原点在中心,y 轴向上。这两个坐标系之间有一个“翻转”关系。做转换时千万别忘了这个符号变化,否则你的坐标会上下颠倒。

1.3 四个坐标系的关系图

下面这张图,把四个坐标系之间的转换关系画清楚了。我建议你把它存下来,做标定的时候对照着看。

四个坐标系转换关系图 世界坐标系 (Xw, Yw, Zw) 相机坐标系 (Xc, Yc, Zc) 图像坐标系 (x, y) 像素坐标系 (u, v) 外参矩阵 (R, T) 透视投影 (焦距 f) 内参矩阵 (dx, dy, u0, v0) 💡 转换路径: 世界坐标 → (外参) → 相机坐标 → (透视投影) → 图像坐标 → (内参) → 像素坐标 反过来就是:像素坐标 → (内参逆) → 图像坐标 → (透视逆) → 相机坐标 → (外参逆) → 世界坐标

1.4 坐标系转换的数学表达

搞清楚了概念,咱们来看看数学上怎么转。HALCON 里这些转换都是封装好的,但理解原理能帮你排查问题。

1.4.1 世界 → 相机

| Xc |   | R11 R12 R13 Tx | | Xw |
| Yc | = | R21 R22 R23 Ty | | Yw |
| Zc |   | R31 R32 R33 Tz | | Zw |
| 1  |   | 0   0   0   1  | | 1  |

这个 4×4 矩阵就是外参矩阵。R 是旋转,T 是平移。

1.4.2 相机 → 图像

x = f * Xc / Zc
y = f * Yc / Zc

这就是小孔成像模型。注意这里 Zc 不能为 0,否则除零错误。

1.4.3 图像 → 像素

u = x / dx + u0
v = y / dy + v0

dx、dy 是每个像素的物理尺寸,u0、v0 是主点偏移。

关键点:整个转换链可以写成:

像素坐标 = 内参矩阵 × 透视投影 × 外参矩阵 × 世界坐标

HALCON 里用 cam_par 存内参,用 pose 存外参。标定就是求解这两个参数。

1.5 坐标系对比一览表

坐标系 符号 单位 原点位置 转换到下一级
世界坐标系 (Xw, Yw, Zw) mm 用户自定义 外参矩阵
相机坐标系 (Xc, Yc, Zc) mm 相机光心 透视投影
图像坐标系 (x, y) mm 图像中心 内参矩阵
像素坐标系 (u, v) pixel 图像左上角 —

1.6 避坑指南

做坐标系转换,有几个坑我几乎每个项目都会遇到新人踩一遍:

  • 单位混用:世界坐标用 mm,像素坐标用 pixel,中间转换时千万别搞混。我见过有人把像素当毫米用,结果定位差了十万八千里。
  • 原点方向搞反:像素坐标系 v 轴向下,图像坐标系 y 轴向上。这个符号变化很容易被忽略。
  • Zc 为 0:透视投影时 Zc 不能为 0。如果标定板放得太近或太远,Zc 可能接近 0,导致计算不稳定。
  • 外参顺序:HALCON 的 pose 是 [X, Y, Z, Rx, Ry, Rz, 类型],顺序不能乱。我刚开始用的时候,把旋转和平移写反了,标定结果完全不对。
我的调试技巧:做坐标系转换时,先用一个已知点验证。比如在世界坐标系中选一个点,手动算一遍转换到像素坐标,再跟 HALCON 算的结果对比。如果对不上,说明某个环节出问题了。

这一章的内容就到这里。四个坐标系的关系是后续所有标定、定位、测量操作的基础。你花时间把它吃透,后面学手眼标定、九点标定会轻松很多。