Dense Prediction
dense prediction 应该是指 pixel-wise prediction,有几种任务都属于这一类,包括:semantic / instance / panoptic segmentation、depth estimation、surface normal estimation,等等。
Background of Camera
凸透镜可以会使光线汇聚,过焦点之后有类似小孔成像的效果,用作相机镜头以成像。光线透过凸透镜后一般会发生折射,但凸透镜中存在一点,使得通过的光线不发生折射,谓之光学中心,简称光心,可以近似将凸透镜中心看作光心的位置[1]。平行光透过凸透镜后会汇集到一点,谓之焦点(focal point)。光心到焦点的距离谓之焦距(focal length),记为 f。过凸透镜两个球面球心的直线谓之主光轴。成像最清晰的位置一般在一倍到两倍焦距之间(所以在焦点后面),参考 [2]。

4 Coordinate Systems
- 世界座标系:world coordinate system,参考 [3-6],好像是自己在空间中任意找一点做原点建立空间直角座标系。由 [6] 的评论来看,应该要建成右手系(right-handed coordinate system),即右手拇指为 x、食指为 y、中指为 z。座标可用「 w _w w 」标记: ( x w , y w , z w ) (x_w,y_w,z_w) (xw,yw,zw)。
- 相机座标系:[5] 称 camera view coordinate system。也是右手系,光心为原点,z 轴沿光轴指出,x、y 分别平行于图像的两轴(假设图像是矩形),参照下面图 2 的方式指定 x 指右、y 指下。座标可用「 c _c c 」标记: ( x c , y c , z c ) (x_c,y_c,z_c) (xc,yc,zc)。
- 图像座标系:[7] 称之为「图像物理座标系」。此处「图像」是指 3D 景象在相机中小孔成像得到的像,而不是像素形式的电子相。相机中应该有一个平面装置用于成像?类似视网膜,谓之光屏或成像平面(image/retinal plane)。此座标轴的原点是光轴与成像平面的交点,谓之 principal point。x、y 轴与相机座标系的 x、y 轴平行且同向,即也是 x 指右、y 指下。座标记为: ( x , y ) (x,y) (x,y)。
- 像素座标系:[5] 称 screen coordinate system,[11] 称图像像素坐标系。前三个座标系单位都是长度单位,而此座标系单位是像素。与相机座标系同在成像平面,只是换了原点位置和单位。原点在图像左上角,横轴称 u 轴,指右;纵轴称 v 轴,指下。座标记为: ( u , v ) (u,v) (u,v)。
图示见 [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 一起看。
3 Angles
参考 [9-14],以飞机为例,类似相机座标系,以飞机重心为原点,基于飞机自身建立右手系,三条轴介绍见 [9]。

- yaw:yaw 轴是立轴(vertical axis),重力方向是正向。沿 yaw 轴旋转的角称 yaw 角 / 偏航角。
- roll:roll 轴是纵轴(longitudinal axis),正向向机头指出。沿 roll 轴旋转的角称 roll 角 / 翻滚角 / 滚动角。
- pitch:pitch 轴是横轴(transverse / lateral axis),正向指右。沿 pitch 轴旋转的角称 pitch 角 / 俯仰角。
顺各轴正向看去,顺时针转为正角,逆时针转为负角。
Camera Pose
参考 [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]。
Camera Imaging
相机成像即将三维世界中的景物投影到成像平面,由感光器件转成电子图像。在由前文几个座标系描述的世界观中,成像模型描述三维点从世界座标系中(的座标)变换成像素座标系(的座标)的过程,参考 [20-24]。
rigid transformation
当世界座标系和相机座标系不是同一个座标系时,第一步需要转换视角,将三维点的位置从世界座标系下的表示改为相机座标系下的表示。这一步是刚体变换,只涉及旋转和平移:
(
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 个变量/自由度。
perspective projection / projective transformation
透视投影是将三维点投影到二维成像平面/光屏。由 [28],理想的成像是一个物点惟一对应一个像点,即由一个物点发出/反射的多条光线中,只有一条(或少数几条)射在光屏上(图示见 [24] Figure 1),一个光圈足够小的小孔相机(pinhole camera)可以实现,但会因为射入光线太少而成像过喑。
凸透镜可以让一个物点发出/反射的多条光线射入而又汇聚到一点,兼顾成像清晰和亮,其图示见 [2,20,24]。但是这里的「清晰」只是对部分物点,由更远、更近的物点发出/反射的光线在透镜后汇聚的位置并不恰好在光屏上。所以只有一定(前后)范围内的物点能成清晰的像,这个范围谓之景深(depth of field)。
(高斯)成像公式[29]给出透镜成像的比例关系,而由 [2] 的规律,理想成像位置在焦点后方。当:
- 假装焦距和像距相等(物距充分大,成像公式中物距倒数那项充分小,可以忽略)
- 假装所有物点都理想成像,即发出的光线在透镜后恰好在光屏上汇聚
- (暂时)假装没有变形(distortion)(参考 [20,23,24],一种常见变形是径向变形(radial distortion),其又可细分为枕型(pincushion)和桶型(barrel))
时,可以用小孔成像的模型近似透视投影的过程,参考 [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
digitalisation
(虚像的)图像座标系与像素座标系有两点不同:
- 原点:图像座标系原点在成像平面中心(与光轴的交点),记为 ( c x , c y ) (c_x, c_y) (cx,cy);像素座标系的在左上角;
- 单位:图像座标系的长度单位是厘米等物理长度单位,像素座标系的单位是像素。
所以从图像座标系到像素座标系的转变包括平移和缩放: ( 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
camera matrix
将上式改写成: ( 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)。
TODO
立体/双目视觉(stereo vision)、对极几何(epipolar geometry)
References
- 光心
- 凸透镜成像规律
- 世界坐标系,相机坐标系,图像坐标系,像素坐标系
- 世界坐标系
- Cameras
- 计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换
- (四十)通俗易懂理解——相机坐标转换
- 世界坐标系,相机坐标系,图像坐标系,像素坐标系的转换
- Aircraft principal axes
- Pitch, yaw, and roll
- Roll, Pitch, and Yaw
- 无人机的偏航角,滚动角,俯仰角解释
- 坐标系和yaw, pitch, roll等基础概念
- 简单理解3D系统中pitch/yaw/roll 的基本概念
- 当我们说相机的位姿的时候,我们在说什么?
- 什么是相机的位姿 ?
- 罗德里格斯旋转公式(Rodrigues’ rotation formula)推导
- 三维空间下的 Rodrigues 旋转公式
- 图像处理——罗德里格斯公式反推旋转角度和旋转向量
- 相机的那些事儿 (二)成像模型
- SLAM入门之视觉里程计(2):相机模型(内参数,外参数)
- 相机成像的几何描述
- Camera Models and Imaging
- CS231A Course Notes 1: Camera Models
- Homogeneous Coordinates(译文:关于齐次坐标的理解(经典))
- 从零开始一起学习SLAM | 为什么要用齐次坐标?
- 齐次坐标的理解
- 凸透镜成像和小孔成像的原理分别是什么?有哪些区别和联系?
- 成像公式
- (ECCV 2020) NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis - ecva, supplementary, code, pytorch 复现
- OpenGL Projection Matrix
- 视差Disparity与深度图
- 立体匹配入门指南(8):视差图、深度图、点云
- 三维激光点云到二维图像的投影
- 深度图与3D点云互转
- 处理点云数据(四):点云到图像平面的投影
- 基于深度学习的单目深度估计综述
- 单目深度估计
- 单目视觉深度估计测距的前生今世
- 单目深度估计综述: Monocular Depth Estimation survey
- NeRF代码解读-相机参数与坐标系变换