dense prediction 应该是指 pixel-wise prediction,有几种任务都属于这一类,包括:semantic / instance / panoptic segmentation、depth estimation、surface normal estimation,等等。
凸透镜可以会使光线汇聚,过焦点之后有类似小孔成像的效果,用作相机镜头以成像。光线透过凸透镜后一般会发生折射,但凸透镜中存在一点,使得通过的光线不发生折射,谓之光学中心,简称光心,可以近似将凸透镜中心看作光心的位置[1]。平行光透过凸透镜后会汇集到一点,谓之焦点(focal point)。光心到焦点的距离谓之焦距(focal length),记为 f。过凸透镜两个球面球心的直线谓之主光轴。成像最清晰的位置一般在一倍到两倍焦距之间(所以在焦点后面),参考 [2]。
图示见 [3,5,6]([6] 中有些画成左手系了,需要甄别),几个座标系的转化见 [6-8] 和后文相机成像模型。
NeRF[30] 中用到的 camera 座标是 OpenGL 式的(其代码的 README 有讲):x 还是指右,但 y 指上、z 指入,也叫视座标(eye coordinates),跟这里写的不同,不过还是右手系。而且它只考虑一个视锥(frustum,一个截头锥体,即三维梯形)范围的点,超出范围的点截断不考虑,称为 clip coordinates,然后映射到 NDC(Normalised Device Coordinates)。NDC 是个左手系,跟 OpenGL camera 座标的关系是:z 轴反向(即沿光轴指出),而 x、y 轴同向。这部分可以跟 [31] 和 NeRF 的 supplementary material 一起看。
参考 [9-14],以飞机为例,类似相机座标系,以飞机重心为原点,基于飞机自身建立右手系,三条轴介绍见 [9]。
顺各轴正向看去,顺时针转为正角,逆时针转为负角。
参考 [15,16],位姿(pose)包括位置和姿势。以世界座标系为参考系、用相机座标系代表相机,则:
相机的位置可以用相机座标系原点到世界座标系原点的偏移表示,记为偏移向量 t = ( t x , t y , t z ) \boldsymbol{t}=(t_x,t_y,t_z) t=(tx,ty,tz);
姿势表示相机相对于世界来说,是抬头还是低头、左望还是右望、正视还是歪脖,建模成相对世界座标系的旋转,即绕一个三维向量旋转一个角度,此时的座标变换用罗德里格斯(Rodrigues)旋转公式(见 [17,18])描述: u = ( cos θ ) v + ( 1 − cos θ ) ( r ⋅ v ) r + ( sin θ ) r × v \boldsymbol{u}=(\cos\theta)\boldsymbol{v}+(1-\cos\theta)(\boldsymbol{r}\cdot\boldsymbol{v})\boldsymbol{r}+(\sin\theta)\boldsymbol{r}\times\boldsymbol{v} u=(cosθ)v+(1−cosθ)(r⋅v)r+(sinθ)r×v其中 v \boldsymbol{v} v 是原向量, r = ( r x , r y , r z ) \boldsymbol{r}=(r_x,r_y,r_z) r=(rx,ry,rz) 是旋转轴(单位向量), θ \theta θ 是 v \boldsymbol{v} v 绕 r \boldsymbol{r} r 逆时针旋转的角度, u \boldsymbol{u} u 是旋转后的向量。它又可以写成矩阵形式: u = R v = v + ( sin θ ) [ r ] × v + ( 1 − cos θ ) [ r ] × 2 v \boldsymbol{u}=\boldsymbol{R}\boldsymbol{v}=\boldsymbol{v}+(\sin\theta)[\boldsymbol{r}]_{\times}\boldsymbol{v}+(1-\cos\theta)[\boldsymbol{r}]_{\times}^2\boldsymbol{v} u=Rv=v+(sinθ)[r]×v+(1−cosθ)[r]×2v其中 [ r ] × = [ 0 − r z r y r z 0 − r x − r y r x 0 ] [\boldsymbol{r}]_{\times}=\left[\begin{aligned} 0 && -r_z && r_y \\ r_z && 0 && -r_x \\ -r_y && r_x && 0\end{aligned}\right] [r]×= 0rz−ry−rz0rxry−rx0 是由 r \boldsymbol{r} r 生成的反对称阵, R = I + ( sin θ ) [ r ] × + ( 1 − cos θ ) [ r ] × 2 = ( cos θ ) I + ( sin θ ) [ r ] × + ( 1 − cos θ ) r r T \begin{aligned}\boldsymbol{R}&=\boldsymbol{I}+(\sin\theta)[\boldsymbol{r}]_{\times}+(1-\cos\theta)[\boldsymbol{r}]_{\times}^2 \\ &=(\cos\theta)\boldsymbol{I}+(\sin\theta)[\boldsymbol{r}]_{\times}+(1-\cos\theta)\boldsymbol{r}\boldsymbol{r}^T \end{aligned} R=I+(sinθ)[r]×+(1−cosθ)[r]×2=(cosθ)I+(sinθ)[r]×+(1−cosθ)rrT 是旋转矩阵。由旋转矩阵反推旋转角 θ \theta θ、旋转轴 r \boldsymbol{r} r 见 [18,19]。
相机成像即将三维世界中的景物投影到成像平面,由感光器件转成电子图像。在由前文几个座标系描述的世界观中,成像模型描述三维点从世界座标系中(的座标)变换成像素座标系(的座标)的过程,参考 [20-24]。
当世界座标系和相机座标系不是同一个座标系时,第一步需要转换视角,将三维点的位置从世界座标系下的表示改为相机座标系下的表示。这一步是刚体变换,只涉及旋转和平移:
( x c y c z c ) = R ( x w y w z w ) + t \left(\begin{aligned} x_c \\ y_c \\ z_c \end{aligned}\right)=\boldsymbol{R}\left(\begin{aligned} x_w \\ y_w \\ z_w \end{aligned}\right)+\boldsymbol{t} xcyczc =R xwywzw +t 这样写是仿射的形式,可以引入齐次座标(homogeneous coordinates)改写成线性变换(即只有矩阵乘法)的形式:
( x c y c z c 1 ) = [ R t 0 T 1 ] ( x w y w z w 1 ) \left(\begin{aligned} x_c \\ y_c \\ z_c \\ 1 \end{aligned}\right)=\left[\begin{aligned} & \boldsymbol{R} & \boldsymbol{t} \\ & \boldsymbol{0}^T & 1 \end{aligned}\right]\left(\begin{aligned} x_w \\ y_w \\ z_w \\ 1 \end{aligned}\right) xcyczc1 =[R0Tt1] xwywzw1 齐次座标的介绍见 [25-27],感觉在这里只是个简化符号的伎俩。
R \boldsymbol{R} R 和 t \boldsymbol{t} t 合称外参(extrinsic parameters),「外」是指不依赖于相机本身的属性(如:相机型号改变,并不影响这一步的座标系变换)。由 [18-20], R \boldsymbol{R} R 可以还原回旋转轴 r \boldsymbol{r} r、旋转角 θ \theta θ,又因为旋转轴只需要方向信息,故可以顺便用旋转轴的模长编码旋转角(从球座标的角度看,就是用两个角度表示旋转轴(的方向)、用极径表示旋转角),于是外参实质只有 6 个变量/自由度。
透视投影是将三维点投影到二维成像平面/光屏。由 [28],理想的成像是一个物点惟一对应一个像点,即由一个物点发出/反射的多条光线中,只有一条(或少数几条)射在光屏上(图示见 [24] Figure 1),一个光圈足够小的小孔相机(pinhole camera)可以实现,但会因为射入光线太少而成像过喑。
凸透镜可以让一个物点发出/反射的多条光线射入而又汇聚到一点,兼顾成像清晰和亮,其图示见 [2,20,24]。但是这里的「清晰」只是对部分物点,由更远、更近的物点发出/反射的光线在透镜后汇聚的位置并不恰好在光屏上。所以只有一定(前后)范围内的物点能成清晰的像,这个范围谓之景深(depth of field)。
(高斯)成像公式[29]给出透镜成像的比例关系,而由 [2] 的规律,理想成像位置在焦点后方。当:
时,可以用小孔成像的模型近似透视投影的过程,参考 [20-24]。此时成的实像是掉转的(即实像的 x’、y’ 正向与相机座标系的 x c x_c xc、 y c y_c yc 正向相反),为了方便,这一步变换一般基于实像关于光心点对称所得虚像进行描述,这个像就是正的(x、y 正向与 x c x_c xc、 y c y_c yc 正向相同),跟人看到的一样。由相似三角形(图示见 [21,22]),有: z c z = x c x = y c y \frac{z_c}{z}=\frac{x_c}{x}=\frac{y_c}{y} zzc=xxc=yyc 此处 z 指像距,在小孔相机中 z = f,在透镜相机中其实 z = f + Δ z=f+\Delta z=f+Δ,但这里忽略 Δ \Delta Δ。于是: ( x y ) = ( x c z c f y c z c f ) \left(\begin{aligned}x \\ y\end{aligned}\right) = \left(\begin{aligned}\frac{x_c}{z_c}f \\ \frac{y_c}{z_c}f\end{aligned}\right) (xy)= zcxcfzcycf 齐次座标下写成: z c ( x y 1 ) = [ f 0 0 0 0 f 0 0 0 0 1 0 ] ( x c y c z c 1 ) z_c\left(\begin{aligned}x \\ y \\ 1\end{aligned}\right) = \left[\begin{aligned}f && 0 && 0 && 0 \\ 0 && f && 0 && 0 \\ 0 && 0 && 1 && 0\end{aligned}\right] \left(\begin{aligned}x_c \\ y_c \\ z_c \\ 1\end{aligned}\right) zc xy1 = f000f0001000 xcyczc1
(虚像的)图像座标系与像素座标系有两点不同:
所以从图像座标系到像素座标系的转变包括平移和缩放: ( u v ) = ( k ⋅ x + c x l ⋅ y + c y ) = ( k f x c z c + c x l f y c z c + c y ) \left(\begin{aligned}u \\ v\end{aligned}\right) = \left(\begin{aligned}k\cdot x + c_x \\ l\cdot y + c_y\end{aligned}\right) = \left(\begin{aligned}kf\frac{x_c}{z_c} + c_x \\ lf\frac{y_c}{z_c} + c_y\end{aligned}\right) (uv)=(k⋅x+cxl⋅y+cy)= kfzcxc+cxlfzcyc+cy 其中 c x c_x cx、 c y c_y cy 是图像座标系原点相对于像素座标系原点的偏移,单位是厘米这种的;k、l 是两个方向上的分辨率,单位相应地是 p i x e l / c m pixel/cm pixel/cm。齐次座标下写成 : ( u v 1 ) = ( k f x c z c + c x l f y c z c + c y 1 ) = ( k f x c + c x ⋅ z c l f y c + c y ⋅ z c z c ) = [ k f 0 c x 0 0 l f c y 0 0 0 1 0 ] ( x c y c z c 1 ) \left(\begin{aligned}u \\ v \\ 1\end{aligned}\right) = \left(\begin{aligned}kf\frac{x_c}{z_c} + c_x \\ lf\frac{y_c}{z_c} + c_y \\ 1\end{aligned}\right) = \left(\begin{aligned}kfx_c + c_x\cdot z_c \\ lfy_c + c_y\cdot z_c \\ z_c\end{aligned}\right) = \left[\begin{aligned}kf && 0 && c_x && 0 \\ 0 && lf && c_y && 0 \\ 0 && 0&& 1 && 0\end{aligned}\right] \left(\begin{aligned}x_c \\ y_c \\ z_c \\ 1\end{aligned}\right) uv1 = kfzcxc+cxlfzcyc+cy1 = kfxc+cx⋅zclfyc+cy⋅zczc = kf000lf0cxcy1000 xcyczc1
将上式改写成: ( u v 1 ) = [ k f 0 c x 0 l f c y 0 0 1 ] ⏟ K ′ [ I 0 ] ( x c y c z c 1 ) \left(\begin{aligned}u \\ v \\ 1\end{aligned}\right) = \underbrace{\left[\begin{aligned}kf && 0 && c_x \\ 0 && lf && c_y \\ 0 && 0 && 1 \end{aligned}\right]}_{\boldsymbol{K}'} [\boldsymbol{I}\quad0] \left(\begin{aligned}x_c \\ y_c \\ z_c \\ 1\end{aligned}\right) uv1 =K′ kf000lf0cxcy1 [I0] xcyczc1 其中 K ′ \boldsymbol{K}' K′ 谓之相机矩阵(camera matrix),此时没有考虑扭曲(skewness)。扭曲指相机座标系的 x c x_c xc、 y c y_c yc 两轴不是严格的直角,记两轴所夹角度为 ϕ \phi ϕ,参考 [20,23,24],考虑扭曲校正之后的相机矩阵为: K = [ k f − k f cot ϕ c x 0 l f csc ϕ c y 0 0 1 ] \boldsymbol{K} = \left[\begin{aligned}kf && -kf\cot\phi && c_x \\ 0 && lf\csc\phi && c_y \\ 0 && 0 && 1 \end{aligned}\right] K= kf00−kfcotϕlfcscϕ0cxcy1 有 5 个自由度,即 α = k f \alpha=kf α=kf、 β = l f \beta=lf β=lf、 ϕ \phi ϕ、 c x c_x cx、 c y c_y cy,合称内参(intrinsic parameters)。
立体/双目视觉(stereo vision)、对极几何(epipolar geometry)