CVDL-3D Vision 1

2025-04-16

CVDL

人的视觉不是显示地表达 3D 信息的,而只是两个眼镜的观测形成双目图(Stereo Image),通过双眼的视差来感知到立体的结构. 这是一种基于 2D 的 3D 的表征. 也可以在相机中通过将多视角图缝合成一张图,形成全景图. 而因为隐式的,所以人眼没法精确感觉绝对的距离,只能相对地知道远近. 并且人的观察是连续的,所以可以通过视觉来完成一系列动作.

通过计算机去做出真 3D. 真 3D 视觉可以给出非常精准的信息.

3D 的信息有很多不同的 Representation. 有 Regular form 的比如多视图,深度信息,以及体素(和像素对应);而也有 Irregular 的表面网格,以及点云表达.

从 3D 得到 2D 的投影的建模就是相机模型. 即从 3D 中的 \((x,y,z)\) 打到 \((x,y)\) 的函数.

最简单的是直接小孔成像,这样就能通过这个小孔来形成真实世界与相纸的一一对应. 这样就形成了一个 Pinhole Camera. 中心通过的线形成了 Optical Axis. 令 \(P=[x,y,z]\),成像的点是 \(P'\),则 \(x'=f\frac{x}{z}\)\(y'=f\frac{y}{z}\).

但如果 aperture 开太大就很模糊,开太小就很暗.

考虑加透镜来解决这样的问题. 一个点发出的,所有经过凸透镜的光线会聚集于一个点. 这个的局限是一旦在交平面之外就会出现模糊.

通过所有平行光线皆经过焦点. 对于近轴的光线,【???】\(x'=f\frac{x}{z'}\),令 \(z'=f+z_0\).

仿射变换会让平行的线不平行,平行线会交于一点.

相机的内在参数 (Intrinsics,相机本身的东西,无法改变)和外在参数(Extrinsics,在世界坐标系中相机的位置等,可以改变).

考虑 Pinhole Camera 的内在参数.

Retina Plane 的坐标系和相纸的 Pixel 坐标系不一样. 并且其中所有的单位都是现实世界中的单位(比如 \(m\)). 令光轴交相纸的点在相纸的 Pixel 是 \((c_x,c_y)\),则需要 \(x\to fk\frac{x}{z}+c_x\)\(y\to fl\frac{y}{z}+c_y\),其中 \(k,l\) 的量纲为 \(pixel/m\). 令 \(\alpha=fk\)\(\beta=fl\),则得到 \((x,y,z)\to (\alpha\frac{x}{z}+c_x,\beta\frac{y}{z}+c_y)\),称为投影变换. 注意其不是线性变换,所以无法直接表达成矩阵形式. 但是我们发现如果同时乘一个 \(z\) 就是线性变换了.

于是引入齐次(Homogeneous)坐标系统. 从 \(E\to H\) 就是再加一个 \(1\),即 \((x,y)\to [x\ y\ 1]^T\)\((x,y,z)\to [x \ y \ z \ 1]^T\). 而 \(H\to E\) 就是 \([x\ y \ z]^{T}\to (x/z,y/z)\). 准确来说就是容许一个对所有维度的同时乘 / 除.

于是我们就可以 \([x\ y\ z \ 1]^T\to [\alpha x+c_xz\quad \beta y +c_yz\quad z]^T\). 这个线性变换就是左乘 \(\left(\begin{matrix}\alpha & 0 & c_x & 0 \\ 0 & \beta & c_y & 0\\0 & 0 & 1 & 0\end{matrix}\right)\).

而相机的内在参数全在前 \(3\times 3\) 的矩阵内. 称这个矩阵为相机的内在参数 \(K\),于是就有 \(P'=K[I \quad 1]P\). 我们还可以对一些角度 \(\theta\) 的歪曲进行修正,也可以融入矩阵 \(K\).

考虑外在参数.

我们其实可以发现之前的 \((x,y,z)\) 都是以光心为轴的坐标系的坐标,并非世界坐标系.

平动变换:假如我们要让 \(x\to x+T_x\),令 \(T=[T_x\ T_y\ T_z]^{T}\),则可以利用 \(T\) 写成一个 \(4\times 4\) 的对齐次坐标系统的矩阵作为变换.

旋转变换:我们可以利用三维的旋转矩阵 \(R\) 也写成一个 \(4\times 4\) 的矩阵操作. 注意一个旋转矩阵只有 \(3\) 个自由度.

运用上面两种变换,令 \(P_c\) 为相机坐标系的坐标,\(P_w\) 为世界坐标系的坐标,则可以写成 \(P_c=RP_w+T\). 于是全部串在一起就有 \(P'_{3\times 1}=K_{3\times 3}[R\ T]_{3\times 4}P_{w\ 4\times 1}\).

可以用这个式子来证明线还会映成线,并且产生近大远小(因为 \(/z\)).

上面的模型称为 Perspective Camera.

\(z\) 可以看成常数(物体深度差相比于 \(z\) 很小),那么就不用齐次坐标了,称为弱投影模型. 纯线性,不用除 \(z\).

还有一种方式叫正交投影(三视图那样). 每个点用和相纸垂直的平行光投影到平面. 其好处是完全真实反应了物理世界的东西,因为它是保距的同态. 但就一点距离信息都没有了.


Camera Calibration

Camera Calibration 的目标是从拍到的图片求解出外在 & 内在的参数.

使用 Calibration Rig,即一个三维的架子,上面画着棋盘格. 我们以这个架子为世界坐标系. 这个 架子上的每一个棋盘格点我们都知道它在世界坐标下的坐标. 我们又能拍照片知道它在相纸上对应的坐标.

注意到自由度是 \(11\). 所以至少需要 \(11\) 个方程,即 \(6\) 个对应关系(一个 pixel 的 \(x,y\) 可以列两个方程).

最后可以列成一个 \(Pm=0\). 于是限定 \(|m|=1\) 求解方程. 所以还是一个 constraint minimize problem. 求得解 \(\tilde M\) 之后,我们想要 unnormalize 它. 反正都很复杂.

注意,一个棋盘不够,必须是一个架子.

\(K\)\(\alpha,\beta\) 参数决定了摄像机射出的光线的夹角. 即 Field of View. \(K\) 可以决定光线间隔多大. 而 \(T\) 又是一个近大远小. 如果所有采样点都在一个平面,那么 \(K,T\) 可以不同而造就同一个图.(对于任意一组 \((K,T)\)\(T\) 近一点,然后角度放大一点,图就一样了).

给一张有 Radial Distortion 的时候(比如鱼眼相机),就要引入对畸变的修正. 我们就需要拟合一个非线性的 mapping. 这在现实中是很常见的.

如何判断好不好呢?考虑通过 Reproduction Errors:我们先推断出 Projection Matrix 之后,再用这个 Matrix 去推断在相纸上的投影.

实际上并不用做成一个 grid. 可以拍很多张不同视角的棋盘的照片,或者固定相机随便动棋盘(移动都是相对的,等价于固定棋盘移动相机).


深度图像是一个 2.5D 的表达.

Ray Depth:光线距离

Z Depth:深度图记录的深度

有了深度图,有了 \(K\),就可以通过深度图上的 \((u,v,z)\) 推断出其真实坐标 \((x,y,z)\). 直接运用 \(P\)\(P'\) 的关系就行了. 这个过程称为 depth backprojection,形成 depth pointcloud.