Computer Vision Notes
计算机视觉学习笔记,参考资料:
- Stanford, CS231A, Computer Vision: From 3D Resconstruction to Recognition
- 计算机视觉,2019 Winter, ZJU
Camera Models
摄像机模型以小孔成像作为基础,描述了如何将真实世界(三维)内每个点经过投影变换映射到二维平面上对应点。映射关系可以视为一系列线性变换,完全使用矩阵代数描述。(这应该是最基础的知识了)
上图是传统pinhole camera模型,分成三个部分:
- 投影平面坐标系$\Pi’$
- 摄像机坐标系$O$
- 真实世界坐标系$O_w$
思考一下摄像机进行的工作,数学上来讲,就是将$O_w$下所有点映射到$\Pi’$下,即一个映射$E$满足:
$$
E: \mathbb{R}^3 \rightarrow \mathbb{R}^2
$$
简单情况
简单情况下,$O_w$与$O$坐标系相同,此时使用相似三角形可以进行坐标变换的对应关系推导,我们令$\mathbf{P}$为$O_w$内一点坐标,$\mathbf{P}’$为$\Pi’$内一点坐标,$f$为摄像机距离$\Pi’$的距离:
$$
\mathbf{P} = \begin{bmatrix}
x \ y \ z
\end{bmatrix}, \space
\mathbf{P}’ = \begin{bmatrix}
x’ \ y’
\end{bmatrix} = \begin{bmatrix}
f\frac{x}{z} \ f\frac{y}{z}
\end{bmatrix}
$$
考虑到实际中我们使用量化的像素描述坐标(因子$k,l$,表示像素/单位距离),并且根据$\Pi’$原点位置的设定可能存在平移$c_x$与$c_y$,变换关系修正为:
$$
\mathbf{P}’ = \begin{bmatrix}
x’ \ y’
\end{bmatrix} = \begin{bmatrix}k f\frac{x}{z} + c_x \ l f\frac{y}{z} + c_y
\end{bmatrix} = \begin{bmatrix}\alpha\frac{x}{z} + c_x \\beta\frac{y}{z} + c_y
\end{bmatrix}
$$
其中$\alpha$和$\beta$表示全部因子乘积。
于是我们得到了$O$(即$O_w$)到$\Pi’$的变换方法。但是仔细一看,出现了$\frac{1}{z}$项,这说明现在的变换$(x,y,z)\rightarrow (x’,y’)$是非线性的!我们不喜欢非线性变换,所以得想个办法构造线性变换,从而可以使用矩阵代数描述变换。
Homogeneous Coordinates 齐次坐标系
齐次坐标系的引入使得变换能够以线性方式进行。它使用$N+1$维描述$N$维空间内一个点,具体为什么这样做这里不进行展开,自行查阅其他资料。
我们将欧式坐标系记为$E$,齐次坐标系记为$H$,则变换关系为:
$$\begin{aligned}
&E \rightarrow H:\space (x,y,z) \rightarrow (x,y,z,1) \
&H \rightarrow E:\space (x,y,z,w) \rightarrow (\frac{x}{w}, \frac{y}{w}, \frac{z}{w})
\end{aligned}$$
我们先对$O$坐标系下的点转入齐次坐标系$O_h$,然后发现我们可以用线性的方式表示齐次坐标系下的等价变换:
$$
\mathbf{P}_h’ = \begin{bmatrix}
\alpha & 0 & c_x & 0 \
0 & \beta & c_y & 0 \
0 & 0 & 1 & 0
\end{bmatrix} \begin{bmatrix}
x \ y \ z \ 1
\end{bmatrix} = \begin{bmatrix}
\alpha x + c_x z \
\beta y + c_y z \
z
\end{bmatrix}
$$
齐次坐标系下进行变换得到齐次坐标系下点坐标,因此我们得到$\Pi_h’$坐标系下投影点的齐次坐标,将其变换回欧式空间,得到:
$$
\mathbf{P}’ = \begin{bmatrix}
\frac{\alpha x + c_x z}{z} \
\frac{\beta y + c_y z}{z}
\end{bmatrix} = \begin{bmatrix}
\alpha \frac{x}{z} + c_x \
\beta \frac{y}{z} + c_y
\end{bmatrix} = \begin{bmatrix}
x’ \ y’
\end{bmatrix}
$$
这恰是欧式坐标系下投影平面$\Pi’$上的点$\mathbf{P}$投影坐标,而且我们用线性变换描述了投影变换的过程。
以后推导符号中不做显式说明,默认变换全部在齐次坐标系下进行。
最后我们做一些定义,定义Camera matrix $K$:
$$
\mathbf{K} = \begin{bmatrix}
\alpha & 0 & c_x \
0 & \beta & c_y \
0 & 0 & 1
\end{bmatrix}
$$
定义变换矩阵$M$:
$$
\mathbf{M} = \mathbf{K} \begin{bmatrix}
\mathbf{I} & \mathbf{0}
\end{bmatrix} = \begin{bmatrix}
\mathbf{K} & \mathbf{0}
\end{bmatrix}
$$
投影变换可记为:$\mathbf{P}’ = \mathbf{M}\mathbf{P}$。
But…
注意了,我们之前的变换存在于一种简单情况下,即真实世界坐标系$O_w$与摄像机坐标系$O$相同,但是现实是,它们一般是不同的!我们完全可以使用一套独立坐标系$O_w$描述真实世界中的点。
这样导致了一个问题:一共出现了三个坐标系,其中投影平面已经利用投影变换和摄像机系联系起来了,但是真实世界和摄像机还没有变换关系。
我们需要一个线性变换将$O_w$系下坐标变换到$O$系下。这个变换对应空间内向量的旋转和平移,要求$\mathbb{R}^3 \rightarrow \mathbb{R}^3$。
旋转变换
旋转变换中三个轴有三个旋转角度,对应变换矩阵:
$$\begin{aligned}
\mathbf{R} &= \mathbf{R}_x \mathbf{R}_y \mathbf{R}_z \
&= \begin{bmatrix}
1 & 0 & 0 \
0 & \cos{\alpha} & -\sin{\alpha} \
0 & \sin{\alpha} & \cos{\alpha}
\end{bmatrix} \begin{bmatrix}
\cos{\beta} & 0 & \sin{\beta} \
0 & 1 & 0 \
-\sin{\beta} & 0 & \cos{\beta}
\end{bmatrix} \begin{bmatrix}
\cos{\gamma} & -\sin{\gamma} & 0 \
\sin{\gamma} & \cos{\gamma} & 0 \
0 & 0 & 1
\end{bmatrix}
\end{aligned}$$
有点复杂不是吗?
平移变换
平移变换记为一个列向量:
$$
\mathbf{T} = \begin{bmatrix}
t_x \ t_y \ t_z
\end{bmatrix}
$$
现在我们把旋转、平移加入到齐次坐标系下的$O_w \rightarrow O$坐标系变换中,此时$(x,y,z,1)$为$O_w$系下齐次坐标:
$$
\mathbf{P} = \begin{bmatrix}
\mathbf{R} & \mathbf{T} \
\mathbf{0} & 1
\end{bmatrix}_{4\times 4} \begin{bmatrix}
x \ y \ z \ 1
\end{bmatrix}
$$
再进行投影变换实现$\mathbf{P} \rightarrow \mathbf{P}’$:
$$\begin{aligned}
\mathbf{P}’ &= \mathbf{M}\mathbf{P} \
&= \mathbf{K} \begin{bmatrix}\mathbf{I} & \mathbf{0}\end{bmatrix} \begin{bmatrix}
\mathbf{R} & \mathbf{T} \
\mathbf{0} & 1
\end{bmatrix}{4\times 4} \begin{bmatrix}
x \ y \ z \ 1
\end{bmatrix} \
&= \mathbf{K} \begin{bmatrix}\mathbf{R} & \mathbf{T}\end{bmatrix}{3\times 4} \begin{bmatrix}
x \ y \ z \ 1
\end{bmatrix} \
&\triangleq \mathbf{M}_w \mathbf{P}_w
\end{aligned}$$
以后我们仍然使用符号$\mathbf{M}$表示整个投影变换,此时其定义为:
$$
\mathbf{M} = \mathbf{K} \begin{bmatrix}\mathbf{R} & \mathbf{T}\end{bmatrix}
$$
Camera Calibration
校准的目的是让相机能够重建出三维场景,从而使图像上每个二维点都对应原三维场景下的一个点。
从投影变换矩阵说起
投影变换$\mathbf{M}$包含相机的内参和外参。内参$\mathbf{K}$描述了相机的焦距信息,外参$\begin{bmatrix}\mathbf{R} & \mathbf{T}\end{bmatrix}$描述了真实世界坐标系与相机镜头坐标系之间的转换关系,于是我们能根据投影变换$\mathbf{P}’=\mathbf{M}\mathbf{P}$求得任意两点之间的坐标变换。
但是相机的内外参数可能是未知的,如果想进行变换,首先得估计出相机的参数矩阵,这个过程就是校准。
解线性方程组
由于投影变换是线性的,我们可以根据已知的坐标对应关系求解参数矩阵$\mathbf{M}$。为此,我们需要几组如下的对应关系:
$$\begin{aligned}
(x_1’, y_1’) &\longleftrightarrow (x_1, y_1, z_1) \
& \dots \
(x_n’, y_n’) &\longleftrightarrow (x_n, y_n, z_n)
\end{aligned}$$
那么需要几组对应关系呢?
Local Features
一些具有仿射变换不变性的经典图像局部特征。
说在前面,特征点(feature points,或者某些特殊的叫法称“角点”,corners)与特征点描述子(descriptor)不是同种事物,概念上却容易混淆。
特征点是“点”,具有几何意义,可在二维平面上用坐标$(x,y)$描述;特征点描述子,或者简称描述子,是特征“点”进行量化描述的方式,例如SIFT使用的128维向量。传统进行特征描述的时候使用特征点描述位置,同时使用某种描述子对特征进行量化。
Harris角点
顾名思义,是对角点敏感的特征,对角状纹理敏感,例如曲线拐点位置,使用以下概念进行描述:
- 滑窗:定义可感知的变化范围/邻域
- 能量函数$E(u,v)$:量化描述变化引起的差异
将滑窗在图像上进行微小移动,会导致移动前后滑窗内图像亮度的变化,用三种方式为变化对应的纹理进行分类:
- 平坦区域:图像变化很少,表现为较一致的亮度
- 边缘区域:沿边缘方向变化很少,其他方向变化较大
- 角区域:沿所有方向变化都很大
推导
首先我们定义能量函数描述“变化”的大小:
$$
E(u,v) = \sum_{x,y} w(x,y)\left(I(x+u, y+v) - I(x, y)\right)^2
$$
其中,$(x,y)$表示滑窗内某个点,$[u,v]$表示以滑窗内$(x,y)$开始在两个方向上移动的两个小距离,对应移动前后的像素内亮度值分别为$I(x,y)$和$I(x+u,y+v)$,$w(x,y)$为滑窗定义了权重,一般使用1或者高斯函数,最后我们将滑窗内所有点的变化求加权和作为因为$(u,v)$移动造成的全部差异。
不同$E$的取值表示不同方向移动带来的局部差异不同。我们关注较大和较小的取值,因为它们说明了哪些移动方向对应强烈和微弱的变化。
还记得之前提到的三个区域吗?还需要对我们的目标$E$做一些变形才能将其对应到三个区域上:
由于进行的是微小移动,$[u,v]$可以认为取值很小,因此一阶泰勒展开近似:
$$
\begin{aligned}
E(u,v) &= \sum_{x,y} w(x,y)\left(I(x+u, y+v) - I(x, y)\right)^2 \
&= \sum_{x,y} w(x,y)\left(I(x,y) + u\nabla_xI + v\nabla_yI - I(x, y)\right)^2 \
&= \sum_{x,y} w(x,y) (u\nabla_xI + v\nabla_yI)^2 \
&= \sum_{x,y} w(x,y) \left( u^2\nabla^2_xI + v^2\nabla^2_yI + 2uv\nabla_xI\nabla_yI \right) \
&= \sum_{x,y} w(x,y) \begin{bmatrix}
u & v
\end{bmatrix}
\begin{bmatrix}
\nabla^2_xI & \nabla_xI\nabla_yI \
\nabla_xI\nabla_yI & \nabla^2_yI
\end{bmatrix}
\begin{bmatrix}
u \ v
\end{bmatrix}
\end{aligned}
$$
我们令$
\mathbf{M} = \begin{bmatrix}
\nabla^2_xI & \nabla_xI\nabla_yI \
\nabla_xI\nabla_yI & \nabla^2_yI
\end{bmatrix}$,则原式可以简化为:
$$
E(u,v) = \sum_{x,y} w(x,y) \begin{bmatrix}
u & v
\end{bmatrix}
\mathbf{M} \begin{bmatrix}
u \ v
\end{bmatrix}
$$
对$\mathbf{M}$进行特征值分解,结果得到两个特征值$\lambda_{max}$和$\lambda_{min}$,它们对应的特征向量分别为$E$变化最快和最慢的两个方向。由二次型可知,$\begin{bmatrix}
u & v
\end{bmatrix}
\mathbf{M} \begin{bmatrix}
u \ v
\end{bmatrix}$代表一个二次曲面,特征向量对应其上一个等势线截面椭圆的长轴和短轴方向。
我们使用特征值进行之前三种区域的分类,定义一个判决变量$R$:
$$\begin{aligned}
R &= \det \mathbf{D} - k \mathbb{Tr}(\mathbf{D}) \
&= \lambda_{max} \lambda_{min} - k (\lambda_{max} + \lambda_{min})
\end{aligned}$$
$R$称为corner response,根据其取值,我们确定三种区域:
- $R > 0$:角区域
- $R < 0$:边缘区域
- $|R| \sim 0$:平坦区域
我们感兴趣的是角区域,因此对局部区域(由滑窗确定)找到全部$Set(R) = {R | R > 0 }$然后对集合$Set(R)$内的点进行两步筛选:
- 选择合适阈值筛选较大的$R$
- 取上一步结果的局部最大值$R_{max}$
然后我们可以找到$R_{max}$对应的$[u,v]$从而确定$(x,y)$,找到的这个点就是一个局部Harris角点。
总结一下,Harris角点提取步骤为:
- 确定滑窗大小
- 计算滑窗内的梯度,得到$\mathbf{M}$
- 计算每个滑窗对应的$R$,并得到局部最大值$R_{max}$,记录得到该值对应的点$(x,y)$
- $(x,y)$即为Harris角点
可以看出,Harris角点本质上是基于梯度的局部特征点。
改进
Harris角点对平移、旋转、光照有较好的不变性,但是缩放不变性很差。这很好理解,对于小尺度的图像,滑窗大小可能正合适对于角点有较高敏感度;但是如果图像尺度变大,原本小图中的角点因为尺度放大,导致其变得平缓(想想微积分里化曲为直,类似的道理),再使用一样的滑窗对于角点敏感度会下降。
明显我们需要根据不同图像尺度选择不同滑窗大小。
人为选择滑窗大小显然是不现实的,我们需要一个尺度不变量(至少变化不能特别大)来动态确定滑窗大小,换句话说,滑窗大小$S$需要被定义成一个尺度不变量的函数。
平均亮度
假设我们有几张不同尺度的图像,对每张图像中位置相同的Harris角点,我们独立地计算以其为中心不同大小滑窗内的亮度均值,找到均值最大时对应的滑窗大小,即为对应尺度图像应使用的滑窗大小。
Harris-Laplacian
我们也可以不显式地找滑窗大小,而是用多个滑窗计算一组结果,使用别的方法筛选出最好的结果。计算一系列不同大小滑窗得到的Harris角点,使用Laplacian算子进行筛选得到它们中响应最强的。
步骤为:
- 选取一组不同大小滑窗值
- 计算不通滑窗下的Harris角点
- 对找到的特征点使用Laplacian算子求响应,找到最大响应
- 最大响应对应特征点即为最佳,在不同尺度图像下能保持较好不变性
SIFT特征点
SIFT特征点即Scale-Invariant Feature Transformation特征点,继承Harris角点的结果,加入一些思想实现了特征点的尺度不变性。
筛选:Scale Pyramid与Gaussian Pyramid与DoG
Harris角点出现问题即在对尺度的敏感上,SIFT在这里采用了一些方法进行特征点筛选。
首先得到Harris角点,然后建立DoG,即高斯差分金字塔。设定一组尺度,在每个尺度下对图像进行对应降采样,然后对于每个尺度,采用一组不同方差的高斯核进行平滑处理,从而在每个尺度下得到一组平滑程度不同的图像。然后在每个尺度内对相邻不同平滑程度的图像作差,得到高斯差分图像。至此,在每个尺度下都有一组高斯差分图像(DoG)。
接下来进行邻域筛选工作。对每个尺度内的每个DoG中每个像素,检查其在相邻空间与相邻DoG中一个邻域内是否为极值,如果为极值,该点加入该尺度下特征点集合。“邻域”同时定义在空域与DoG上,举个例子,如果某像素$(x,y)i$位于$\sigma_i$的DoG图中,那么其邻域为当前DoG图中的8邻域以及相邻$\sigma{i-1}$,$\sigma_{i+1}$图中的两个$3\times3$像素域,共称$(x,y)_i$的26邻域。
SIFT描述子
上述工作得到了不同尺度下特征点的集合,如何描述这些特征点?SIFT使用方向直方图构建一个128维向量作为特征点的描述子,它具有旋转、缩放、平移不变性。
对每个之前得到的特征点,取以其为中心的$16\times16$邻域,将其分为4个$4\times4$的子域,共16个子域,每个子域内以$\frac{\pi}{8}$为间隔统计灰度方向直方图作为8维向量,最后将16个邻域的8维向量按固定顺序连接得到128维向量,作为特征点描述子。