← 全部文章 机器视觉

相机标定(一):世界、相机、图像、像素四个坐标系

2023 年 3 月 8 日 · 4 分钟读完

目录
  1. 一、四个坐标系
  2. 二、坐标系之间的转换
  3. 1. 世界 → 相机:旋转和平移
  4. 2. 相机 → 图像:透视投影
  5. 3. 图像 → 像素:换单位、挪原点
  6. 4. 合起来
  7. 三、在项目里
  8. 延伸

项目里研究标定时,要搞清楚像素坐标和运动轴位置的关系,也就是找到世界坐标系和像素坐标系之间的转换。理一理。

一、四个坐标系

  1. 世界坐标系(Ow-XwYwZw):三维,用来描述相机和物体在空间里的位置。可以根据需要自己定,通常和机器的运动坐标系(比如 XY 模组、机械手)重合,单位是 mm。
  2. 相机坐标系(Oc-XcYcZc):三维,原点在镜头光心,Zc 轴是光轴,Xc、Yc 分别平行于成像平面的两边。
  3. 图像坐标系(O-xy):二维,在成像平面上,原点是光轴和成像平面的交点(主点),一般在图像中心附近。单位是 mm(物理尺寸)。
  4. 像素坐标系(O1-uv):二维,原点在图像左上角,u 向右、v 向下,单位是像素。我们在软件里拿到的坐标就是这个。

为什么需要世界坐标系? 它是一个固定不变的参考。相机、物体、机械手都相对它来描述,换相机、移动相机时,只要重新求出相机相对世界的关系,其他的都不用变。

二、坐标系之间的转换

从世界坐标到像素坐标,一共三步:

世界坐标 ──旋转+平移──▶ 相机坐标 ──透视投影──▶ 图像坐标 ──单位换算+平移──▶ 像素坐标
         (外参)                  (焦距 f)               (像元尺寸、主点)

1. 世界 → 相机:旋转和平移

两个三维直角坐标系之间,总可以通过一个旋转 R(3×3 矩阵)加一个平移 T(3×1 向量)互相转换:

⎡Xc⎤       ⎡Xw⎤
⎢Yc⎥ = R · ⎢Yw⎥ + T
⎣Zc⎦       ⎣Zw⎦

写成齐次坐标(多加一维 1),可以合成一个 4×4 矩阵:

⎡Xc⎤   ⎡R  T⎤ ⎡Xw⎤
⎢Yc⎥ = ⎢    ⎥ ⎢Yw⎥
⎢Zc⎥   ⎣0  1⎦ ⎢Zw⎥
⎣ 1⎦          ⎣ 1⎦

旋转矩阵 R 可以拆成绕三个轴各转一次。先看绕 Z 轴转 θ:Z 轴重合不动,点 P 在旧坐标系里是 (x, y, z),在新坐标系里是 (x′, y′, z′):

由几何关系可以得到:

写成矩阵:

同理,绕 X 轴转 φ、绕 Y 轴转 ω,各得到一个矩阵:

三个乘起来就是旋转矩阵:R = Rθ · Rφ · Rω。注意矩阵乘法不满足交换律,绕轴旋转的顺序不同,结果也不同,用别人的标定结果时要确认它是按什么顺序定义的。

平移 T 是 3×1 的向量,就是两个坐标系原点之间的差。所以最终:

R 和 T 描述的是相机在世界里的位置和朝向,叫外参。相机一挪动,外参就变了。

反过来从相机坐标转回世界坐标,用的是逆变换:旋转部分是 Rᵀ(旋转矩阵的逆等于它的转置),平移部分是 -Rᵀ·T,不是原来那个矩阵。

2. 相机 → 图像:透视投影

针孔模型下,空间点 P 和光心的连线与成像平面的交点,就是 P 在图像上的投影。f 是有效焦距:

用相似三角形可以得到:

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

除以 Zc 就是「近大远小」:同样大小的物体,离相机越远(Zc 越大),成像越小。这一步把三维压成了二维,深度信息丢掉了,所以单个相机从一张图里无法还原出 Z。

3. 图像 → 像素:换单位、挪原点

图像坐标单位是 mm,原点在中心;像素坐标单位是像素,原点在左上角。两个坐标系的轴互相平行,没有夹角,所以只有缩放和平移:

设每个像素的物理尺寸是 dx × dy(像元尺寸,比如 3.45 μm),主点在像素坐标里是 (u0, v0):

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

4. 合起来

把三步串起来,就是标定里最常见的公式:

写成文字版:

     ⎡u⎤   ⎡fx  0  u0⎤               ⎡Xw⎤
Zc · ⎢v⎥ = ⎢ 0  fy v0⎥ · [ R | T ] · ⎢Yw⎥
     ⎣1⎦   ⎣ 0  0   1⎦               ⎢Zw⎥
                                      ⎣ 1⎦
           └── 内参 K ──┘  └─ 外参 ─┘

其中 fx = f / dx、fy = f / dy,是以像素为单位的焦距。

  • 内参:fx、fy、u0、v0,只和相机、镜头本身有关,换个位置也不变;
  • 外参:R、T,描述相机放在哪、朝哪;
  • 相机标定就是通过拍摄已知尺寸的标定板,把这些参数求出来。实际的镜头还有畸变,标定时会把畸变系数一起求出来。

三、在项目里

大部分 2D 定位项目没有这么复杂:相机垂直向下拍一个平面,物体都在同一高度(Z 不变),那么像素坐标和平面上的世界坐标之间就是一个仿射变换(缩放、旋转、平移、少量错切),用几组对应点就能求出来。这就是常说的九点标定,见下一篇 相机标定(二):九点标定和旋转中心。

需要用到上面完整模型的情况:相机斜着拍、物体高度不一、要做精确测量(必须去畸变),或者做 3D 视觉。

延伸

  • Halcon 里的标定:calibrate_cameras 系列算子配合 Halcon 的标定板,可以求出内参(含畸变)和外参;之后用 image_points_to_world_plane 把像素坐标转换成世界平面上的 mm 坐标。
  • OpenCV 里的标定:cv::calibrateCamera 用棋盘格求内参和畸变,cv::solvePnP 求外参。
  • 远心镜头:普通镜头近大远小,远心镜头在一定范围内放大倍率不随距离变化,没有透视效果,测量项目常用。它的模型里没有除以 Zc 这一步。
  • 矩阵和齐次坐标:用齐次坐标是为了让平移也能写成矩阵乘法,这样多次变换可以连乘合成一个矩阵。

# 标定 # 相机

原文首发于 blog.csdn.net