最近在做视觉相关的项目(YOLO 检测 + 机器人定位),被图像坐标系、相机坐标系、机器人坐标系这三个概念绕了好几天。翻了很多资料,结合自己的手写笔记整理出这篇博客,用自己的方式讲清楚:这三个坐标系分别是什么?它们之间怎么转换?为什么还要做相机标定?

适合和我一样刚入门视觉/机器人方向的同学阅读,公式不多,但每个公式都讲清楚在干嘛。


一、先抛一个问题:YOLO 检测出的框,为什么不能直接拿来用?

假设我们用 YOLO 在画面里检测到一个目标,输出是这样的:

目标框:左上角 (120, 80),右下角 (300, 260)
类别:杯子
置信度:0.92

这个 (120, 80) 是什么单位?——像素。它只告诉我们“杯子在画面的哪个位置”,但机器人真正关心的是:

  • 杯子离我多远?
  • 在我左前方还是右前方?
  • 我机械臂要伸到哪个三维坐标去抓?

像素坐标回答不了这些问题。所以我们需要一条转换链,把“画面里的像素位置”一步步翻译成“机器人坐标系下的真实三维位置”。这条链上有三个关键节点,就是本文要讲的三个坐标系。


二、三个坐标系分别是什么

坐标系原点在哪轴的指向单位回答的问题
图像坐标系 (u, v)画面左上角u 向右(列),v 向下(行)像素目标在图片的哪个像素
相机坐标系 (Xc, Yc, Zc)相机光心Zc 向前(沿光轴),Xc 左右,Yc 上下米目标在相机前方的三维位置
机器人坐标系 (Xr, Yr, Zr)机器人本体Xr 向前,Yr 向左,Zr 向上米目标相对于机器人在哪里

2.1 图像坐标系 (u, v)

这是最“接地气”的一个坐标系:

  • 原点 (0, 0) 在画面左上角;
  • u 轴向右,代表像素的列号;
  • v 轴向下,代表像素的行号;
  • 单位是像素(pixel)。

YOLO、SSD 这些目标检测网络输出的 bounding box 坐标,全部都在这个坐标系下。它只描述“像素在哪里”,不带任何物理尺寸信息。

(0,0) ────────────→ u
  │
  │   ┌─────────┐
  │   │  目标框   │
  │   └─────────┘
  ▼
  v

2.2 相机坐标系 (Xc, Yc, Zc)

把原点搬到相机的光心(镜头中心),三个轴这样定义:

  • Zc 轴:沿光轴向前,代表目标离相机的距离(深度);
  • Xc 轴:左右方向;
  • Yc 轴:上下方向;
  • 单位是米,是真实的物理单位。

💡 光轴是什么?

镜头光学系统的对称中心线,从镜头中心垂直向前延伸出去。光轴 ≈ 相机“正前方”的方向。

主点 (cx, cy) 就是光轴在图像平面上的落点。注意:主点 ≠ 图像中心,只是近似相等,实际装配中会有几像素的偏差。

2.3 机器人坐标系 (Xr, Yr, Zr)

最后把原点搬到机器人本体上(通常选底盘中心或机械臂基座):

  • Xr 轴:向前;
  • Yr 轴:向左;
  • Zr 轴:向上。

这个坐标系下的坐标,才是机器人控制器能直接用来规划运动、抓取物体的坐标。


三、三者的内在联系:一条“三级跳”转换链

把三个串起来,就是视觉定位的完整流水线:

        真实世界中的物体
              │
              │  ① 相机投影成像(小孔成像模型)
              ▼
   ┌────────────────────────┐
   │  图像坐标系 (u, v)      │  ← YOLO 直接输出的就是这里
   └────────────────────────┘
              │
              │  ② 乘内参矩阵 K + 深度 Zc
              ▼
   ┌────────────────────────┐
   │  相机坐标系 (Xc, Yc, Zc)│
   └────────────────────────┘
              │
              │  ③ 乘外参矩阵 [R | T]
              ▼
   ┌────────────────────────┐
   │ 机器人坐标系(Xr,Yr,Zr)  │  ← 机器人真正能用的坐标
   └────────────────────────┘

用一句口诀概括:

内参:图像 → 相机;外参:相机 → 机器人。

3.1 第二跳:像素 → 相机坐标(用内参)

根据小孔成像模型,由像素坐标反推相机坐标的公式是:

Xc = (u - cx) * Zc / fx
Yc = (v - cy) * Zc / fy

其中:

  • fx, fy:像素焦距,代表相机“看东西放大了多少倍”。
    • 传统相机的物理焦距 f 单位是毫米;
    • 而 fx = f / Sx(Sx 是单个像素的物理尺寸),单位变成了像素;
    • fx 对应水平方向的投影尺度,fy 对应垂直方向。
  • cx, cy:主点坐标,即光轴在图像中的像素位置。

这四个数 fx, fy, cx, cy 组成一个 3×3 的相机内参矩阵 K:

K = [ fx  0  cx ]
    [ 0   fy  cy ]
    [ 0   0   1  ]

深度 Zc 怎么来?

  • 如果用深度相机(RealSense、D435i 等),直接读;
  • 如果用单目相机,可以用一些几何估法,比如已知目标真实高度 H:
Zc = H * F / h

(F 是物理焦距,h 是目标在图像中的像素高度,本质是相似三角形。)

3.2 第三跳:相机坐标 → 机器人坐标(用外参)

Pr = R * Pc + T
  • R:旋转矩阵,描述相机朝哪个方向安装(俯仰、偏航、翻滚);
  • T:平移向量,描述相机光心在机器人坐标系下的位置。

这两个合起来就是外参——它们描述的不是相机本身的光学特性,而是相机和机器人之间的装配关系。


四、为什么必须做相机标定?

上面这条转换链里,我们用到了:fx, fy, cx, cy、畸变系数、R, T。这些数字既不能从镜头外壳上读出来,也不能靠猜。这就是相机标定要解决的问题。

4.1 不标定会怎样?

  1. 每颗摄像头都不一样——物理焦距有公差、传感器像素排布有偏差,主点 (cx, cy) 往往不在图像正中心;
  2. 镜头有畸变——尤其广角镜头,边缘的直线会被拍弯(径向畸变),不校正的话画面边缘的目标反推出来的三维位置会偏得很离谱;
  3. 相机装在机器人上的角度是装配出来的——不可能完美朝前,也不可能光心正好落在机器人原点;
  4. 不标定 = 拿一把刻度不准的尺子量东西——内参外参不准,“像素→米”这一步就没有可信的换算依据,机器人算出来的目标位置全是错的,抓取必然打偏。

4.2 常用标定方法

① 内参标定——张正友标定法(Zhang's Method)

工业界事实标准,OpenCV 里直接调 cv2.calibrateCamera() 就能跑。

做法:

  1. 打印一张棋盘格标定板(黑白方格,方格边长已知,比如 25 mm);
  2. 手持标定板,从不同距离、不同角度、倾斜着拍十几张照片(要求覆盖画面各个角落,包含俯仰和旋转);
  3. 程序自动检测每张图里棋盘格的角点像素坐标;
  4. 由于棋盘格的真实物理坐标是已知的(格子边长已知),通过多组“物理坐标 ↔ 像素坐标”的对应关系,反解出内参矩阵 K 和畸变系数。
② 外参标定——手眼标定(Hand-Eye Calibration)
  • 问题:求相机坐标系和机器人坐标系之间的 R, T;
  • 做法:让机器人带着相机(或在相机视野内)看一个已知位置的标定板,变换几个不同位姿,记录机器人关节角度 + 棋盘格图像坐标,解一个经典的 AX = XB 方程;
  • 分两类:
    • Eye-in-Hand:相机装在机械臂末端,跟着机械臂一起动;
    • Eye-to-Hand:相机固定在外部场景中,机械臂在视野里动。

五、一张图总结

┌─────────────┐   内参 K + Zc   ┌─────────────┐   外参 R,T   ┌─────────────┐
│  图像坐标系  │ ─────────────▶ │  相机坐标系  │ ───────────▶ │ 机器人坐标系 │
│   (u, v)    │   像素→米       │ (Xc,Yc,Zc)  │   相机→机器人 │ (Xr,Yr,Zr)  │
│   像素单位   │                │   米单位     │              │   米单位     │
└─────────────┘                └─────────────┘              └─────────────┘
     ▲                              ▲                              ▲
     │                              │                              │
  YOLO 输出                    相机标定得到 K                   手眼标定得到 R,T

六、写在最后

这三个坐标系的本质,是一层层把“我们看到的图像”还原成“真实世界里的位置”:

  • 图像坐标系是算法(YOLO)直接能看懂的语言;
  • 相机坐标系是相机自身视角下的三维空间;
  • 机器人坐标系是机器人本体能用的运动指令语言。

而相机标定,就是给整条转换链提供可信的“尺子”:

  • 内参标定校准镜头本身(放大率 fx/fy、主点 cx/cy、畸变);
  • 外参标定校准相机和机器人之间的安装位姿(R, T)。

搞懂了这条链,再去看双目视觉、手眼标定、物体抓取这些进阶内容,就不会再被一堆坐标变换绕晕了。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐