Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

5.4.3 视觉传感器

老师用一句话给这一节开了门:「视觉传感器呢,其实就是照相机」(02:22:01)。但这句话底下藏着一条相当长的链:光 → 感光元件 → 电荷 → 电压 → 视频信号 → 数字图像 → 像素坐标,中间还夹着镜头、快门、行场扫描和一次模数转换。本节先把成像器件(CCD 与 CMOS)的差别讲清,再补上照相机系统(镜头、快门、视频标准、帧捕捉器)的其余部件,然后把主要篇幅交给全节的重点——相机模型:一个三维空间的点是怎么一步步变成像平面上的一个像素的。这条链就是作业 5.7 要用的那套公式,也是第 10 章视觉控制的入口。录播 02:22:15–02:28:11。

5.4.3.1 从光到电:像素、CCD 与 CMOS

定义 5.4.5 · 视觉传感器、像素与 CCD/CMOS 传感器

任务:照相机作为视觉传感器的任务是测量目标反射的光的强度。为此利用一个感光元件,称为像素(pixel,或 photosite,感光单元),它能够将光能量转化为电能量。根据实现能量转换的物理原理不同,传感器的类型也不同;最常用的是 CCD 与 CMOS 传感器,它们都是基于半导体的光电效应工作的。

① CCD(charge coupled device,电荷耦合器件):由感光单元矩形阵列组成。由于光电效应,当一个光子碰撞到半导体的表面时,会产生许多自由电子,于是每一个元件都会积累一个电荷——这个电荷取决于入射照度在光敏元件上对时间的积分。随后,这个电荷通过传输结构(类似于模拟移位寄存器)被送到输出放大器中,同时感光单元被放电;电信号进一步处理即获得真实的视频信号。

② CMOS(complementary metal oxide semiconductor):由光电二极管矩形阵列组成。每一个光电二极管的交叉点都被预先充电,当被光子击中时就放电;每个像素集成的放大器把这个电荷转换为电压或电流数值。

两条本质差别:

CCD CMOS
像素是不是积分器件 是——电荷是照度对时间的积分 非积分——被激活后测量通过量(throughput),而不是积分量(volume)
后果 饱和像素会溢出并影响相邻像素 ⇒ 出现耀斑(blooming) 饱和像素永远不会溢出并影响相邻像素 ⇒ 防止了耀斑
读出方式 电荷经传输结构串行送到公共输出放大器 每个像素自带放大器,输出直接是二维阵列,元素可自由访问

彩色相机(教材脚注):由对三原色(RGB)敏感的特殊 CCD 构成;复杂的相机有三个独立的传感器,每种基色各一个。

老师说这一块(02:22:27)「在上面自己看一下」,但他自己把关键的那条差别说了出来:「所以 CMOS(每个像素是独立的),所以 CCD 需要一个积分的过程,有可能有(饱和溢出)的情况」——积分与溢出是同一枚硬币的两面:正因为 CCD 的像素把电荷攒起来再排队搬走,攒过头就会溢到邻居家去(耀斑)。

5.4.3.2 照相机:镜头、快门与视频信号

一个相机不只是一个感光芯片。 教材提醒:照相机是不同于光学传感器的复杂系统,包含快门、镜头、模拟预处理电子组件三部分;镜头主要负责把物体反射的光聚集到光学传感器所在的平面上——这个平面叫成像平面。

输出端有两种活法(教材 §5.4.3):

(一)单色 CCD 相机 → 先出模拟视频,再数字化。 传感器的输出放大器产生一个信号,经定时模拟电子学处理,按现有的视频标准之一——CCIR(欧洲与澳大利亚标准)或 RS170(美国与日本标准)——产生电信号。无论如何,视频信号都是峰峰值为 1 V 的电压,其幅值顺序表示图像强度。图像的读出方式值得记住:

  • 整个图像分为很多行(CCIR 标准 625 行,RS170 标准 525 行),被相继扫描;
  • 光栅扫描从头到尾水平扫过每一行,而且先扫所有偶数行(形成第一个扫描场),再扫所有奇数行(第二个场)——一帧由两个连续的场组成,这种技术叫隔行扫描(interlacing);
  • 隔行扫描允许图像按帧率或按场率更新:按帧率时更新频率就是整幅画面的更新频率(CCIR 25 Hz、RS170 30 Hz);按场率时更新频率可以翻倍,前提是能容忍一半的纵向分辨率。

测量处理的最后一步是把模拟视频信号数字化。为视频信号获取而采用的专用模数转换器称为帧捕捉器(frame grabber):把相机的输出接到帧捕捉器上,视频波形被抽样并量化,数值保存在表示图像空间抽样的二维存储序列中,即帧存储器(framestore);这个阵列随后以场率或帧率更新。

(二)CMOS 相机 → 直接出二维阵列。 对 CMOS 相机(教材加了一句:目前仅对单色图像可行)而言,得益于允许把模数转换器集成在每个像素点上的 CMOS 技术,相机的输出直接是一个二维阵列,其元素可以自由访问。相对于 CCD 相机,这个优势意味着:只要访问整个画面的一部分,就能获得更高的帧率——这正是后来「ROI 高速读图」的雏形。

5.4.3.3 相机模型:一个三维点怎么变成像素(作业 5.7 的公式)

老师把这一节的必要性说得很直接(02:23:06–02:23:44):要用视觉传感器做机器人的控制,就「需要建立模型」——需要知道真实物理世界中的一个点与相机成像平面之间「一个点的(映)射关系是什么」。教材的处理是把它拆成四步。

第一步:换坐标系(外参数)。 考虑固连于相机的坐标系 Oc−xcyczcO_c-x_cy_cz_c,其关于基础坐标系的位置由齐次变换矩阵 TbcT_b^c 确定。取目标的一点,坐标为 pc=[pxc pyc pzc]Tp^c=[p^c_x\ p^c_y\ p^c_z]^{\mathrm T}——一般地,选择目标的质心。则从基础坐标系到相机坐标系的坐标转换描述为(式 5.35)

pc=Tbc p~p^c=T_b^c,\tilde p

其中 p~\tilde p 表示相对于基础坐标系的目标位置的齐次表达式。这一步用的正是第二章的齐次变换:「如果我们知道它们之间相对的姿态和位置的关系,其实也就是咱们第二章的内容」(02:24:07)。

第二步:透视变换(把点投到像平面上)。 在成像平面上引入参考坐标系,其轴 XX 和 YY 平行于相机坐标系的轴 xcx_c 和 ycy_c,原点位于光学轴和成像平面的交点,称为主点。由于折射现象,相机坐标系中的点通过透视变换转换为成像平面上的点:

Xf=−fpxcpzc,Yf=−fpycpzcX_f=-\frac{fp^c_x}{p^c_z},\qquad Y_f=-\frac{fp^c_y}{p^c_z}

其中 (Xf,Yf)(X_f,Y_f) 是成像平面上新坐标系的坐标,ff 是镜头的焦距。两点提醒:这些坐标用米制单位表示;该变换在 pzc=0p^c_z=0 处是奇异的(点在光学轴上、投影无定义)。

正负号与「正面透视」。 负号的存在与「目标的像在相机像平面是上下颠倒」这一现象吻合。为了计算方便,可以改用一个位于镜头前面、与 zc=fz_c=f 平面对应的虚拟像平面,这样就避免了颠倒,得到正面透视变换(式 5.36、5.37):

Xf=fpxcpzc,Yf=fpycpzcX_f=\frac{fp^c_x}{p^c_z},\qquad Y_f=\frac{fp^c_y}{p^c_z}

(教材特意注明:为避免符号滥用,虚拟平面上的变量名保持不改。)老师把它讲成一句几何直觉:「透视变换其实也是相似三角形」(02:25:34);「相当于把这个面放到这儿,那这个时候就可以把这个符号给消除了」(02:26:41)——本节的 SVG 图正是按这个模型画的。

真实的镜头不完美。 上述关系「仅在理论上成立」,真实镜头总有非理想性,会引起图像品质下降,公认的有两种变形:像差(aberrations)与失真(geometric distortion)。像差可以通过把光线限制到镜头的一个小的中心区域来降低;失真的影响可以通过一个参数可以被辨识的合适模型来补偿。

第三步:采样并换成像素。 视觉信息一般由数字处理器处理,测量原理是把像平面上每一点的光强度 I(X,Y)I(X,Y) 转换为数字。显然,像平面上有无限多个点,所以需要空间采样;图像随时间而变,所以也需要时间采样。谁来干这两件事?——CCD 或 CMOS 传感器起空间采样器的作用,镜头前的快门起时间采样器的作用。

空间抽样的单位是像素,于是像平面中点的坐标 (X,Y)(X,Y) 要以像素表示为 (XI,YI)(X_I,Y_I)。由于相片的维数有限,点的像素坐标通过比例因子 αx\alpha_x 和 αy\alpha_y 与米制单位中的坐标联系起来(式 5.38、5.39):

XI=αxfpxcpzc+X0,YI=αyfpycpzc+Y0X_I=\frac{\alpha_xfp^c_x}{p^c_z}+X_0,\qquad Y_I=\frac{\alpha_yfp^c_y}{p^c_z}+Y_0

其中 X0X_0 和 Y0Y_0 是考虑像素坐标系统原点关于光学轴的位置(偏移)。这一步老师也点到了(02:27:28):「(前面)其实是以米制单位来进行的表示,但实际的相机(图像)空间它是以像素的形式来进行坐标的描述,所以我们要把米制的表示转化成像素的表示,它也是一个线性的关系。」

线性化:把除法收进齐次坐标。 这个非线性变换可以借助点 (xI,yI,zI)(x_I,y_I,z_I) 的齐次表达式写成线性形式——令 XI=xIλX_I=\dfrac{x_I}{\lambda}、YI=yIλY_I=\dfrac{y_I}{\lambda}(λ>0\lambda>0),于是式(5.38)(5.39)可改写为(式 5.40)

[xIyIλ]=λ[XIYI1]=ΩΠ[pxcpycpzc1]\begin{bmatrix}x_I\ y_I\ \lambda\end{bmatrix}=\lambda\begin{bmatrix}X_I\ Y_I\ 1\end{bmatrix}=\Omega\Pi\begin{bmatrix}p^c_x\ p^c_y\ p^c_z\ 1\end{bmatrix}

其中(式 5.41、5.42)

Ω=[fαx0X00fαyY0001],Π=[100001000010]\Omega=\begin{bmatrix}f\alpha_x&0&X_0\ 0&f\alpha_y&Y_0\ 0&0&1\end{bmatrix},\qquad \Pi=\begin{bmatrix}1&0&0&0\ 0&1&0&0\ 0&0&1&0\end{bmatrix}

Π\Pi 只干一件事:把三维齐次向量 (pxc,pyc,pzc,1)(p^c_x,p^c_y,p^c_z,1) 截成三维 (pxc,pyc,pzc)(p^c_x,p^c_y,p^c_z)(丢掉常数 1);Ω\Omega 则一次完成「乘焦距、乘比例因子、加偏移」。

第四步:合成——照相机校准矩阵。 到这一步,从观察对象的笛卡儿空间到图像的像空间中像素的全局转换,就是式(5.35)与式(5.40)的复合(式 5.43):

Ξ=ΩΠTbc\Xi=\Omega\Pi T_b^c

这就是所谓的照相机校准矩阵。它里面装着两类参数:

参数类在哪个矩阵里取决于什么
内参数(intrinsic) αx,αy,X0,Y0,f\alpha_x,\alpha_y,X_0,Y_0,fΩ\Omega传感器和镜头的特征
外参数(extrinsic)TbcT_b^c相机相对于基础坐标系的相对位置和方向

为什么要标定:为了尽可能精确地计算笛卡儿空间与像空间之间的变换,现有一些技术来辨识这些参数(教材 §5.4.3;参考书里也专门给出了一种最常用的视觉系统校准技术)。内参数由制造与装配决定(αx,αy\alpha_x,\alpha_y 还反映像素的物理尺寸),外参数则由相机装在机械手上的位姿决定——作业 5.7 给的那组 f=8 mmf=8\ \mathrm{mm}、αx=79.2 pixel/mm\alpha_x=79.2\ \mathrm{pixel/mm}、αy=120.5 pixel/mm\alpha_y=120.5\ \mathrm{pixel/mm}、X0=Y0=250X_0=Y_0=250 就是内参数。

规范化坐标(一个计算上的小工具)。 如果相机的内参数已知,从计算的观点看,方便改用规范化坐标 (X,Y)(X,Y),它由规范化透视变换定义(式 5.44):

λ[XY1]=Π[pxcpycpzc1]\lambda\begin{bmatrix}X\ Y\ 1\end{bmatrix}=\Pi\begin{bmatrix}p^c_x\ p^c_y\ p^c_z\ 1\end{bmatrix}

这些坐标也用米制单位定义;当 f=1f=1 时,它们与式(5.36)(5.37)的坐标一致。比较式(5.40)与式(5.44),得到可逆变换(式 5.45)

[XIYI1]=Ω[XY1]\begin{bmatrix}X_I\ Y_I\ 1\end{bmatrix}=\Omega\begin{bmatrix}X\ Y\ 1\end{bmatrix}

——即通过内参数矩阵把规范化坐标与像素坐标联系起来。「先归一化、再上内参」这条分解,正是后来相机标定与视觉伺服里最常用的写法。

相机模型:针孔几何(正面透视)与从三维点到像素的变换链 上半部分是侧视的针孔模型:左侧为目标 p 所在平面,中间为透镜中心与光学轴,透镜左侧是位于 z_c = f 的虚拟像平面,右侧是真实像平面;两条光线从目标顶端与底端经透镜中心射到像平面上,在虚拟像平面上交于 (X_f, Y_f)。下半部分是变换链:基础坐标系中的点 p 经外参数 T_b^c 变为相机坐标系中的 p^c,再经透视变换得到像平面的 X_f、Y_f,最后经内参数矩阵 Ω 变为像素坐标 X_I、Y_I,整体合成为相机校准矩阵 Ξ = Ω Π T_b^c。 ① 针孔几何:透视变换 = 相似三角形(侧视) 光学轴 透镜中心 虚拟像平面 zc=fz_c=f 真实像平面(像上下颠倒) 目标 pp:pc=[pxc,pyc,pzc]Tp^c=[p^c_x,p^c_y,p^c_z]^{\mathrm T} Yf=fpyc/pzcY_f=fp^c_y/p^c_z(正面透视,不变号) 焦距 ff ② 变换链 pp:基础坐标系 pc=Tbcpp^{c}=T_b^{c}p(外参数) Xf,YfX_f,Y_f(透视变换) XI,YIX_I,Y_I(Ω\Omega:内参数 fαx,fαy,X0,Y0f\alpha_x,f\alpha_y,X_0,Y_0) 合成:Ξ=ΩΠTbc\Xi=\Omega\Pi T_b^{c} —— 照相机校准矩阵(内参数 × 透视 × 外参数)
相机模型与变换链(本教程绘):上半按正面透视(虚拟像平面)画,因此像与物同向、公式中不出现负号;下半把一个点从基础坐标系走到像素坐标的四步与两块矩阵(TbcT_b^c 与 Ω\Omega)并排摆开——作业 5.7 就是在已知 TbcT_b^c(由机械手位姿算出)与 Ω\Omega(f,αx,αy,X0,Y0f,\alpha_x,\alpha_y,X_0,Y_0)的前提下,把 pp 一路推到 (XI,YI)(X_I,Y_I)。

5.4.3.4 从低水平到高水平:这一串步骤站在哪一层

教材在收尾处给整节内容定了个「层次」:

上述的从图形信息到图像获取的一系列步骤,可以被归为低水平处理(low-level vision)一类;这包括提取基本图像特征,例如质心和亮度的不连续。

也就是说,从镜头、CCD/CMOS、扫描到像素坐标,这一整套做的都是把光变成可计算的数、并在这些数上提取最原始的特征。而真正意义上的「眼」还要往上一层:只有当模拟认知(cognition)程度的处理可行的时候,一个机器人系统才可以看作是真正的自主系统——教材举的标准例子是「从一个存储在数据库中的 CAD 模型集合中识别出一个观测目标」;在这种情况下,人工视觉处理可以被称为高水平视觉(high-level vision)。

(本编补注:这一传统里通常把层次划成低 / 中 / 高三级——低水平是滤波、边缘、角点这类基本特征;中水平是分割与描述(把像素聚成区域/物体并给出描述子);高水平才是识别与理解。教材原文只显式点名了低与高两级,中间那级是同一分类里的常规叫法,读者读到「分割、描述」时知道它落在哪一层即可。)

工业应用在哪一层? 教材本节没有铺开应用清单,但它给了两条线索:其一,高水平视觉的判据就是从 CAD 模型库中识别出观测目标;其二,本章卷首语说视觉传感器的作用是在机械手与环境互动时「测量相应目标的特征参数」——这些参数正是后续(第 10 章)用视觉参与控制的输入。老师 02:23:06 也是从「用视觉传感器(做)机器人的控制」切进来的。(背景补充:工程上机器视觉的典型用途——在线检测与缺陷判别、尺寸测量、定位与引导抓取、字符/条码识别——全都落在这三级里:特征→描述→识别一层层往上走。)

考点 · 老师原话(录播时间点)

视觉就是照相机,成像靠 CCD/CMOS。 「一般使用 CCD 或者是 CMOS 相机(来)成像」(02:22:15)。

两种器件的关键差别。 「所以 CMOS(每个像素是独立的),所以 CCD 需要一个积分的过程,有可能有(饱和溢出)的情况」(02:22:33–02:22:44)。

为什么要建模。 「(用)视觉传感器(做)机器人的控制,这是需要建立模型的……我们需要知道一个真实物理世界中的(点)和相机的成像平面……一个点的(映)射关系是什么」(02:23:06–02:23:42)。

第一步就是第二章的齐次变换。 「如果我们知道它们之间相对的姿态和位置的关系,其实也就是咱们第二章的内容……就可以(表示)出来同一点 PP 在不同空间(的)表示」(02:24:07–02:24:24)。

透视变换就是相似三角形。 「透视变换其实也是相似三角形」,「可以得到这样的一个关系」(02:25:34);「正面透视……相当于把这个面放到这儿,那这个时候就可以把这个符号给消除了」(02:26:41)。

米制 → 像素是一个线性关系。 「(前面)其实是以米制单位来进行的表示,但实际的相机(图像)空间它是以像素的形式来进行坐标的描述……它也是一个线性的关系」;「X0X_0(与)Y0Y_0(是用来)进行比较(的偏移)」(02:27:28–02:28:06)。

点到即止,第十章再见。 「下面大家自己去看一下。咱们到第十章的时候可能会涉及到这些内容」(02:28:15–02:28:35)。

默写点 · 合上书再写(主动回忆)
  1. CCD 与 CMOS 的两条本质区别是什么?各自的后果是什么?
  2. 写出一套相机参数下「三维点 → 像素坐标」的完整步骤(四个式子),并说明 Ω\Omega、Π\Pi、TbcT_b^c 各装了什么。
  3. 透视变换里的负号从哪来?「正面透视」用的是什么手段消掉它的?
  4. 什么叫空间采样、什么叫时间采样?各由相机的哪个部件负责?「低水平视觉」与「高水平视觉」的分界在哪?
核对

积分 vs 非积分:CCD 的像素积累的是入射照度对时间的积分,CMOS 的像素被激活后测量通过量而非积分量;后果是 CCD 的饱和像素会溢出并影响相邻像素(耀斑 blooming),CMOS 不会溢出、不产生耀斑。读出方式:CCD 靠传输结构(模拟移位寄存器)串行送往公共输出放大器并放电;CMOS 每个像素自带放大器,输出直接是二维阵列且元素可自由访问(因此只读部分画面即可获得更高帧率)。

① pc=Tbcp~p^c=T_b^c\tilde p(外参数:基础系 → 相机系,用的就是第二章的齐次变换);② 正面透视 Xf=fpxcpzcX_f=\dfrac{fp^c_x}{p^c_z}、Yf=fpycpzcY_f=\dfrac{fp^c_y}{p^c_z}(米制、像平面坐标);③ 像素化 XI=αxfpxcpzc+X0X_I=\dfrac{\alpha_xfp^c_x}{p^c_z}+X_0、YI=αyfpycpzc+Y0Y_I=\dfrac{\alpha_yfp^c_y}{p^c_z}+Y_0;④ 齐次线性化 [xI,yI,λ]T=ΩΠ[pxc,pyc,pzc,1]T[x_I,y_I,\lambda]^{\mathrm T}=\Omega\Pi[p^c_x,p^c_y,p^c_z,1]^{\mathrm T},全局合成 Ξ=ΩΠTbc\Xi=\Omega\Pi T_b^c。Ω\Omega 装内参数(fαx,fαy,X0,Y0f\alpha_x,f\alpha_y,X_0,Y_0,取决于传感器与镜头),Π\Pi 是把齐次四维截成三维的投影矩阵,TbcT_b^c 装外参数(相机相对基础坐标系的位置与方向)。

负号来自折射成像使目标的像在像平面上上下颠倒(Xf=−fpxc/pzcX_f=-fp^c_x/p^c_z,Yf=−fpyc/pzcY_f=-fp^c_y/p^c_z)。消除手段是改用位于镜头前面、对应 zc=fz_c=f 平面的虚拟像平面(正面透视),于是 Xf=fpxc/pzcX_f=fp^c_x/p^c_z、Yf=fpyc/pzcY_f=fp^c_y/p^c_z 不再带负号(教材注明:虚拟平面上变量名不改,属「滥用记号」)。

空间采样:像平面上点有无穷多个,必须抽成有限个像素——由 CCD/CMOS 传感器完成;时间采样:图像随时间变化,必须在时间上取帧——由镜头前的快门完成。低水平视觉 = 从图形信息到图像获取的这一串步骤与基本图像特征(质心、亮度不连续)的提取;高水平视觉 = 具备模拟认知能力的处理,例如从数据库中的 CAD 模型集合里识别出观测目标(中间的分割/描述一层通常称为中水平视觉)。

5.4.3 小结与常见错误

  • 一条链:光 → 像素(光能转电能)→ CCD(积分、串行转移、会耀斑)/CMOS(非积分、每像素放大器、可随机访问)→ 镜头/快门/模拟预处理 → 视频标准与隔行扫描 → 帧捕捉器 + 帧存储器(CMOS 则直接得到二维阵列)。
  • 一套模型:p→Tbcpc→透视Xf,Yf→ΩXI,YIp\xrightarrow{T_b^c}p^c\xrightarrow{\text{透视}}X_f,Y_f\xrightarrow{\Omega}X_I,Y_I,合成 Ξ=ΩΠTbc\Xi=\Omega\Pi T_b^c(内参数 × 透视 × 外参数);标定就是为了把这套参数辨识出来。
  • 一个层次:这一整节都在低水平处理里(成图 + 基本特征);高水平视觉才谈识别(例如从 CAD 模型库中认出目标)。
常见错误清单 · 自查三条
  1. 把 CCD 与 CMOS 的差别只记成「谁更便宜/更省电」——考试要的是积分/非积分与耀斑/随机访问这两条本质差别。
  2. 相机模型里把主点(光学轴与成像平面的交点)与像素坐标系原点混为一谈——两者差一个 (X0,Y0)(X_0,Y_0) 的偏移。
  3. 以为透视变换是线性映射——它在 pzc=0p^c_z=0 处奇异,本质是除法(相似三角形);只有把除法收进齐次坐标(λ\lambda)之后,整条链才写成矩阵乘积。