当将胶片直接放置在物体前方时,3D物体上的同一点会在胶片的多个位置产生成像;
因此,在物体和胶片之间放置一个带有针孔的隔板时,假设针孔大小只允许穿过一条光线,那么3D物体上的同一点只能有一条光线穿过小孔并在胶片上成像;
此处的小孔相当于就是光圈,光圈的尺寸越大,会有更多的光线穿过小孔,成像会越亮,但是同一个3D点会有多条光线穿过小孔并在胶片上的多个位置(相近)产生成像,导致物体成像模糊。光圈越小,物体成像越清晰,但是亮度也越暗;
P P P为空间3D点, P ′ P^{'} P′为成像后的像平面的2D点
将上面的三维示意图投影到二维平面( k − j k-j k−j平面,垂直于 i i i轴)后,会产生一对相似三角形:
y ′ f = y z \frac{y^{'}}{f}=\frac{y}{z} fy′=zy
进而得到:
y ′ = f y z y^{'} = f \frac{y}{z} y′=fzy
同理,若将将上面的三维示意图投影到二维平面( k − i k-i k−i平面,垂直于 j j j轴)后,会产生另一对相似三角形:
x ′ f = x z \frac{x^{'}}{f}=\frac{x}{z} fx′=zx
进而得到:
x ′ = f x z x^{'} = f \frac{x}{z} x′=fzx
- 若是采用之前的隔板+小孔的方式,在成像清晰的的情况下,由于通过光线少,图片会非常暗。
- 当增加透镜之后,透镜会将从同一3D反射的多条光线聚焦到胶片上的同一点,增加了图片的亮度;
- 所有平行于光轴的光线都会汇聚到焦点,焦点到透镜中心的距离成为焦距;
- 穿过中心的光线的方向不会发生改变;
由于过光心的直线映射关系不变,加不加镜头小孔成像模型依然成立。此时,摄像机的焦距(小孔到成像平面的距离)变为:
z ′ = f + z 0 z^{'}=f+z_0 z′=f+z0
根据折射定律:
f = R 2 ( n − 1 ) f = \frac{R}{2(n-1)} f=2(n−1)R
其中,R为透镜球面半径,n为透镜折射系数。
如上图所示:
- 3D点P在的光线穿过透镜刚好汇聚于胶片上的一点;
- 而比点P离透镜更近的一点的光线会汇聚于胶片后一点,则在胶片上就是发散的;
- 同理,比点P离透镜更远的一点的光线会汇聚于胶片前方一点,则在胶片上也是发散的;
景深:在一定景深范围内,能成清晰的相;离开景深的地方,可能形成虚像,如微距摄像:
径向畸变:图像像素点以畸变中心为中心,沿着径向产生的位置偏差,从而导致图像中所成的像发生形变。其可以分为枕形畸变和桶形畸变两种。
{ x ′ = f x z y ′ = f y z \left\{ \begin{aligned} x^{'} = f \frac{x}{z} \\\\ y^{'} = f \frac{y}{z} \end{aligned} \right. ⎩ ⎨ ⎧x′=fzxy′=fzy
{ u = f k x z + c x v = f l y z + c y \left\{ \begin{aligned} u = fk \frac{x}{z} + c_x\\\\ v = fl \frac{y}{z} + c_y \end{aligned} \right. ⎩ ⎨ ⎧u=fkzx+cxv=flzy+cy
CCD坐标系和像素坐标系存在两个不同之处:
- 坐标系原点不一致:CCD坐标系的远点在图像中心,像素坐标系的原点在左上角, c x c_x cx和 c y c_y cy就是原点的平移量;
- 度量单位不一致:CCD坐标系的单位为 m m m,像素坐标系的单位为pixel, k , l k, l k,l 分别为 x , y x,y x,y 方向的度量单位变换量,单位为 p i x e l / m pixel/m pixel/m
将 f k fk fk 和 f l fl fl 表示为 α 和 β \alpha 和 \beta α和β可得:
{ u = α x z + c x v = β y z + c y \left\{ \begin{aligned} u = \alpha \frac{x}{z} + c_x\\\\ v = \beta \frac{y}{z} + c_y \end{aligned} \right. ⎩ ⎨ ⎧u=αzx+cxv=βzy+cy
P ′ = [ u v 1 ] = [ α x + c x z β y + c y z z ] = [ α 0 c x 0 0 β c y 0 0 0 1 0 ] [ x y z 1 ] P^{'}=\begin{bmatrix} u\\ v\\ 1\\ \end{bmatrix}=\begin{bmatrix} \alpha x + c_x z\\ \beta y + c_y z\\ z\\ \end{bmatrix}= \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} P′=⎣ ⎡uv1⎦ ⎤=⎣ ⎡αx+cxzβy+cyzz⎦ ⎤=⎣ ⎡α000β0cxcy1000⎦ ⎤⎣ ⎡xyz1⎦ ⎤
P ′ = [ α − α c o t θ c x 0 0 β s i n θ c y 0 0 0 1 0 ] [ x y z 1 ] = M P = K [ I 0 ] P P^{'}= \begin{bmatrix} \alpha & -\alpha cot \theta & c_x & 0\\ 0 & \frac{\beta}{sin \theta} & c_y & 0\\ 0 & 0 & 1 & 0\\ \end{bmatrix}\begin{bmatrix} x\\ y\\ z\\ 1\\ \end{bmatrix}=MP=K\begin{bmatrix} I & 0\\ \end{bmatrix}P P′=⎣ ⎡α00−αcotθsinθβ0cxcy1000⎦ ⎤⎣ ⎡xyz1⎦ ⎤=MP=K[I0]P
K = [ α − α c o t θ c x 0 β s i n θ c y 0 0 1 ] K=\begin{bmatrix} \alpha & -\alpha cot \theta & c_x\\ 0 & \frac{\beta}{sin \theta} & c_y\\ 0 & 0 & 1\\ \end{bmatrix} K=⎣ ⎡α00−αcotθsinθβ0cxcy1⎦ ⎤
- 其中, K K K是摄像机内参数矩阵,内参数矩阵决定了摄像机坐标系下3D空间点到2D图像点的映射;
- K有个5自由度DOF;
P ′ = [ x y z ] = [ 1 0 0 0 0 1 0 0 0 0 1 0 ] [ x y z 1 ] P^{'}=\begin{bmatrix} x\\ y\\ z\\ \end{bmatrix}=\begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 0\\ \end{bmatrix}\begin{bmatrix} x\\ y\\ z\\ 1\\ \end{bmatrix} P′=⎣ ⎡xyz⎦ ⎤=⎣ ⎡100010001000⎦ ⎤⎣ ⎡xyz1⎦ ⎤
- 规范化摄像机下的3D点的欧式坐标和和像素坐标系下的2D点的齐次坐标一致;
- 此时的3D点对应2D点的欧式坐标为 [ x z y z ] \begin{bmatrix} \frac{x}{z}\\ \frac{y}{z}\\ \end{bmatrix} [zxzy]
投影矩阵有11个自由度,其中包含5个摄像机内参数+6个摄像机外参数。
略
摄像机标定:求解摄像机内、外参数矩阵 K [R T];
因为摄像机内外参数矩阵描述了三维世界到二维像素的映射关系;
- 摄像机内外参数共同构成了投影矩阵,投影矩阵共有11个未知量;
- 每对点可以列出两个方程,因此,最少需要6对对应点;
- 实际操作中通常使用多于6对点来获得更加鲁棒的结果;
- 方程个数 2 n 2n 2n 个,且 n > 6 n > 6 n>6;
- 未知参数11个;
- 这是一个超定齐次线性方程组;
M = K [ R T ] = [ K R K T ] = [ A b ] M=K[R \quad T]=[KR \quad KT]=[A \quad b] M=K[RT]=[KRKT]=[Ab]
考虑投影矩阵M求解时,假定 ∣ ∣ m ∣ ∣ = 1 ||m||=1 ∣∣m∣∣=1,因此在M前面乘了一个 ρ \rho ρ
从上式第三行可得:
∵ ρ a 3 T = r 3 T a n d ∣ r 3 ∣ = 1 ∴ ∣ ρ ∣ ∣ a 3 ∣ = 1 \begin{aligned} \because \quad &\rho a_3^T = r_3^T \quad and \quad |r_3|=1 \\ \therefore \quad & |\rho||a_3|=1 \\ \end{aligned} ∵∴ρa3T=r3Tand∣r3∣=1∣ρ∣∣a3∣=1
∴ ρ = ± 1 ∣ a 3 ∣ \therefore \quad \rho=\frac{\pm 1}{|a_3|} ∴ρ=∣a3∣±1
∵ r 1 ⋅ r 3 = 0 r 2 ⋅ r 3 = 0 r 3 ⋅ r 3 = 1 \begin{aligned} \because \quad & r_1 \cdot r_3=0 \\ \quad \quad & r_2 \cdot r_3=0 \\ \quad \quad & r_3 \cdot r_3=1 \end{aligned} ∵r1⋅r3=0r2⋅r3=0r3⋅r3=1
∴ ρ a 1 T ⋅ ρ a 3 T = ( α r 1 T − α c o t θ r 2 T + u 0 R 3 T ) ⋅ r 3 T = 0 − 0 + u 0 ρ a 2 T ⋅ ρ a 3 T = ( β s i n θ r 2 T + v 0 r 3 T ) ⋅ r 3 T = 0 + v 0 \begin{aligned} \therefore \quad & \rho a_1^T \cdot \rho a_3^T \\ & =(\alpha r_1^T-\alpha cot \theta r_2^T+u_0 R_3^T) \cdot r_3^T\\ & =0-0+u_0\\\\ & \rho a_2^T \cdot \rho a_3^T \\ & =(\frac{\beta}{sin \theta}r_2^T+v_0r_3^T) \cdot r_3^T\\ & =0+v_0 \end{aligned} ∴ρa1T⋅ρa3T=(αr1T−αcotθr2T+u0R3T)⋅r3T=0−0+u0ρa2T⋅ρa3T=(sinθβr2T+v0r3T)⋅r3T=0+v0
∴ u 0 = ρ 2 ( a 1 ⋅ a 3 ) v 0 = ρ 2 ( a 2 ⋅ a 3 ) \begin{aligned} \therefore \quad & u_0=\rho^2(a_1 \cdot a_3)\\ & v_0=\rho^2(a_2 \cdot a_3) \end{aligned} ∴u0=ρ2(a1⋅a3)v0=ρ2(a2⋅a3)
∵ r 1 × r 2 = r 3 r 1 × r 3 = r 2 r 3 × r 3 = 0 ∣ a ⃗ ∣ = a ⃗ T ⋅ a ⃗ c o t θ = c o s θ s i n θ s i n 2 θ + c o s 2 θ = 1 \begin{aligned} \because \quad & r_1 \times r_2=r_3 \\ & r_1 \times r_3=r_2 \\ & r_3 \times r_3=0\\ & |\vec a|=\sqrt{\vec a^T \cdot \vec a} \\ & cot \theta = \frac{cos \theta}{sin \theta}\\ & sin^2 \theta + cos^2 \theta=1\\ \end{aligned} ∵r1×r2=r3r1×r3=r2r3×r3=0∣a∣=aT⋅acotθ=sinθcosθsin2θ+cos2θ=1
∴ ρ 2 ( a 1 × a 3 ) = ( α r 1 T − α c o t θ r 2 T + u 0 R 3 T ) × r 3 T = α r 2 − α c o t θ r 1 ρ 2 ( a 2 × a 3 ) = ( β s i n θ r 2 T + v 0 r 3 T ) × r 3 T = β s i n θ r 1 \begin{aligned} \therefore \quad \rho^2 (a_1 \times a_3) & = (\alpha r_1^T-\alpha cot \theta r_2^T+u_0 R_3^T) \times r_3^T\\ &=\alpha r_2 - \alpha cot \theta r_1 \\ \rho^2 (a_2 \times a_3) & = (\frac{\beta}{sin \theta}r_2^T+v_0r_3^T) \times r_3^T\\ &=\frac{\beta}{sin \theta}r_1 \end{aligned} ∴ρ2(a1×a3)ρ2(a2×a3)=(αr1T−αcotθr2T+u0R3T)×r3T=αr2−αcotθr1=(sinθβr2T+v0r3T)×r3T=sinθβr1
∴ ρ 2 ∣ a 1 × a 3 ∣ = ∣ ( α r 2 − α c o t θ r 1 ) ∣ = ( α r 2 − α c o t θ r 1 ) T ⋅ ( α r 2 − α c o t θ r 1 ) = α 2 + ( α c o t θ ) 2 = α 2 ( 1 + ( c o s θ s i n θ ) 2 ) = ( α s i n θ ) 2 = ∣ α ∣ s i n θ ρ 2 ∣ a 2 × a 3 ∣ = ∣ β s i n θ r 1 ∣ = ( β s i n θ r 1 ) T ⋅ ( β s i n θ r 1 ) = ( β s i n θ ) 2 = ∣ β ∣ s i n θ \begin{aligned} \therefore \quad & \rho^2 |a_1 \times a_3|\\ & =|(\alpha r_2 - \alpha cot \theta r_1)|\\ & =\sqrt {(\alpha r_2 - \alpha cot \theta r_1)^T \cdot (\alpha r_2 - \alpha cot \theta r_1)}\\ & =\sqrt {\alpha^2 + (\alpha cot \theta)^2} \\ & =\sqrt {\alpha^2 (1+(\frac{cos \theta}{sin \theta})^2)}\\ & = \sqrt {(\frac{\alpha}{sin \theta})^2}\\ & = \frac{|\alpha|}{sin \theta}\\\\ & \rho^2 |a_2 \times a_3|\\ & = |\frac{\beta}{sin \theta}r_1|\\ & = \sqrt {(\frac{\beta}{sin \theta}r_1)^T \cdot (\frac{\beta}{sin \theta}r_1)}\\ & = \sqrt {(\frac{\beta}{sin \theta})^2}\\ & = \frac{|\beta|}{sin \theta} \end{aligned} ∴ρ2∣a1×a3∣=∣(αr2−αcotθr1)∣=(αr2−αcotθr1)T⋅(αr2−αcotθr1)=α2+(αcotθ)2=α2(1+(sinθcosθ)2)=(sinθα)2=sinθ∣α∣ρ2∣a2×a3∣=∣sinθβr1∣=(sinθβr1)T⋅(sinθβr1)=(sinθβ)2=sinθ∣β∣
∵ ρ 2 ( a 1 × a 3 ) ⋅ ρ 2 ( a 2 × a 3 ) = ( α r 2 − α c o t θ r 1 ) ⋅ ( β s i n θ r 1 ) = − α c o t θ β s i n θ = − α c o s θ s i n θ β s i n θ = − a c o s θ β s i n 2 θ ρ 2 ∣ a 1 × a 3 ∣ ⋅ ρ 2 ∣ a 2 × a 3 ∣ = ∣ α ∣ s i n θ ⋅ ∣ β ∣ s i n θ = ∣ α ∣ ∣ β ∣ s i n 2 θ \begin{aligned} \because \quad & \rho^2 (a_1 \times a_3) \cdot \rho^2 (a_2 \times a_3)\\ &=(\alpha r_2 - \alpha cot \theta r_1) \cdot (\frac{\beta}{sin \theta}r_1)\\ &=-\alpha cot \theta \frac{\beta}{sin \theta}\\ &=-\alpha \frac{cos \theta}{sin \theta} \frac{\beta}{sin \theta}\\ &=-\frac{a cos \theta \beta}{sin^2 \theta}\\\\ &\rho^2 |a_1 \times a_3| \cdot \rho^2 |a_2 \times a_3|\\ &=\frac{|\alpha|}{sin \theta} \cdot \frac{|\beta|}{sin \theta}\\ &= \frac{|\alpha||\beta|}{sin^2 \theta} \end{aligned} ∵ρ2(a1×a3)⋅ρ2(a2×a3)=(αr2−αcotθr1)⋅(sinθβr1)=−αcotθsinθβ=−αsinθcosθsinθβ=−sin2θacosθβρ2∣a1×a3∣⋅ρ2∣a2×a3∣=sinθ∣α∣⋅sinθ∣β∣=sin2θ∣α∣∣β∣
∴ ρ 2 ( a 1 × a 3 ) ⋅ ρ 2 ( a 2 × a 3 ) ρ 2 ∣ a 1 × a 3 ∣ ⋅ ρ 2 ∣ a 2 × a 3 ∣ = − a c o s θ β s i n 2 θ s i n 2 θ ∣ α ∣ ∣ β ∣ = − c o s θ \begin{aligned} \therefore \quad & \frac{\rho^2 (a_1 \times a_3) \cdot \rho^2 (a_2 \times a_3)}{\rho^2 |a_1 \times a_3| \cdot \rho^2 |a_2 \times a_3|}\\ &=-\frac{a cos \theta \beta}{sin^2 \theta} \frac{sin^2 \theta}{|\alpha||\beta|}\\ &=-cos \theta \end{aligned} ∴ρ2∣a1×a3∣⋅ρ2∣a2×a3∣ρ2(a1×a3)⋅ρ2(a2×a3)=−sin2θacosθβ∣α∣∣β∣sin2θ=−cosθ
∴ c o s θ = − ( a 1 × a 3 ) ⋅ ( a 2 × a 3 ) ∣ a 1 × a 3 ∣ ⋅ ∣ a 2 × a 3 ∣ \therefore \quad cos \theta=-\frac{ (a_1 \times a_3) \cdot (a_2 \times a_3)}{ |a_1 \times a_3| \cdot |a_2 \times a_3|} ∴cosθ=−∣a1×a3∣⋅∣a2×a3∣(a1×a3)⋅(a2×a3)
如果 θ = 9 0 o \theta=90^o θ=90o,则 c o s θ = 0 cos \theta=0 cosθ=0,所以 ( a 1 × a 3 ) ⋅ ( a 2 × a 3 ) = 0 (a_1 \times a_3) \cdot (a_2 \times a_3)=0 (a1×a3)⋅(a2×a3)=0,这正时之前提到的投影矩阵M满足零倾斜透视投影的条件;
之前(3)中推导过:
∵ ρ 2 ∣ a 1 × a 3 ∣ = ∣ α ∣ s i n θ ρ 2 ∣ a 2 × a 3 ∣ = ∣ β ∣ s i n θ \begin{aligned} \because \quad & \rho^2 |a_1 \times a_3| = \frac{|\alpha|}{sin \theta}\\\\ & \rho^2 |a_2 \times a_3|= \frac{|\beta|}{sin \theta} \end{aligned} ∵ρ2∣a1×a3∣=sinθ∣α∣ρ2∣a2×a3∣=sinθ∣β∣
∴ α = ρ 2 ∣ a 1 × a 3 ∣ s i n θ β = ρ 2 ∣ a 2 × a 3 ∣ s i n θ \begin{aligned} \therefore \quad & \alpha = \rho^2|a_1 \times a_3|sin \theta\\ & \beta = \rho^2|a_2 \times a_3|sin \theta \end{aligned} ∴α=ρ2∣a1×a3∣sinθβ=ρ2∣a2×a3∣sinθ
如果 α = β \alpha=\beta α=β,所以 ∣ a 1 × a 3 ∣ = ∣ a 2 × a 3 ∣ |a_1 \times a_3|=|a_2 \times a_3| ∣a1×a3∣=∣a2×a3∣,所以 ( a 1 × a 3 ) ⋅ ( a 1 × a 3 ) = ( a 2 × a 3 ) ⋅ ( a 2 × a 3 ) (a_1 \times a_3)\cdot(a_1 \times a_3)=(a_2 \times a_3) \cdot (a_2 \times a_3) (a1×a3)⋅(a1×a3)=(a2×a3)⋅(a2×a3),这也是前面提到的零倾斜透视投影的基础上宽高比为1的另一个条件。
∵ ρ a 3 T = r 3 T a n d ρ = ± 1 ∣ a 3 ∣ \because \quad \rho a_3^T = r_3^T \quad and \quad \rho=\frac{\pm1}{|a_3|} ∵ρa3T=r3Tandρ=∣a3∣±1
∴ r 3 = ± a 3 ∣ a 3 ∣ \therefore \quad r_3 = \frac{\pm a_3}{|a_3|} ∴r3=∣a3∣±a3
∵ ρ a 2 T × ρ a 3 T = ( β s i n θ r 2 T + v 0 r 3 T ) × r 3 T ∴ ρ 2 ( a 2 × a 3 ) = β s i n θ r 1 \begin{aligned} & \because \quad \rho a_2^T \times \rho a_3^T = (\frac{\beta}{sin \theta} r_2^T + v_0 r_3^T) \times r_3^T\\ & \therefore \quad \rho^2(a_2 \times a_3)=\frac{\beta}{sin \theta}r_1 \end{aligned} ∵ρa2T×ρa3T=(sinθβr2T+v0r3T)×r3T∴ρ2(a2×a3)=sinθβr1
因为 r 1 r_1 r1 是单位向量,且 ρ 2 , β s i n θ 为实数 \rho^2,\frac{\beta}{sin \theta}为实数 ρ2,sinθβ为实数,
∴ r 1 = ( a 2 × a 3 ) ∣ a 2 × a 3 ∣ \begin{aligned} & \therefore \quad r_1=\frac{(a_2 \times a_3)}{|a_2 \times a_3|} \end{aligned} ∴r1=∣a2×a3∣(a2×a3)
r 2 = r 3 × r 1 r_2 = r_3 \times r_1 r2=r3×r1
ρ [ A b ] = K [ R T ] = [ K R K T ] ρ b = K T K − 1 ρ b = T \begin{aligned} \rho [A \quad b]=K[R \quad T]&=[KR \quad KT]\\ \rho b &= KT\\ K^{-1}\rho b & = T \end{aligned} ρ[Ab]=K[RT]ρbK−1ρb=[KRKT]=KT=T
∴ T = ρ K − 1 b \therefore \quad T=\rho K^{-1}b ∴T=ρK−1b
如下图所示的径向畸变情况下,图像的放大率随距离光轴距离增加而减小:
对于桶形畸变来说, K p > 0 K_p>0 Kp>0,则 λ > 1 \lambda >1 λ>1;
对于桶形畸变来说, K p < 0 K_p<0 Kp<0,则 λ < 1 \lambda <1 λ<1;
∴ { u i = 1 λ m 1 P i m 3 P i v i = 1 λ m 2 P i m 3 P i ∴ { u i λ m 3 P i = m 1 P i v i λ m 3 P i = m 2 P i ∴ { m 1 P i − u i λ m 3 P i = 0 m 2 P i − v i λ m 3 P i = 0 \begin{aligned} & \therefore \quad \begin{cases} u_i = \frac{1}{\lambda}\frac{m_1P_i}{m_3P_i}\\ v_i = \frac{1}{\lambda}\frac{m_2P_i}{m_3P_i} \end{cases}\\ &\therefore \quad \begin{cases} u_i \lambda m_3 P_i=m_1P_i\\ v_i \lambda m_3 P_i=m_2P_i\\ \end{cases}\\ & \therefore \quad \begin{cases}m_1P_i-u_i \lambda m_3 P_i=0\\ m_2P_i-v_i \lambda m_3 P_i=0\\ \end{cases}\\ \end{aligned} ∴{ui=λ1m3Pim1Pivi=λ1m3Pim2Pi∴{uiλm3Pi=m1Piviλm3Pi=m2Pi∴{m1Pi−uiλm3Pi=0m2Pi−viλm3Pi=0
Q m ⃗ = 0 Q \vec m=0 Qm=0
在第一节中此处列出的公式是:
P m ⃗ = 0 P \vec m=0 Pm=0
P是由3D点 P i P_i Pi和2D图像点 p i p_i pi构成的全是已知数的矩阵, m ⃗ \vec m m为待求解的投影矩阵,所以这是一个线性方程。
而Q里面除了包含由3D点 P i P_i Pi和2D图像点 p i p_i pi构成的已知数外,还包含未知数 λ \lambda λ,所以Q不是线性方程组;
此处即然 λ \lambda λ是未知数,为啥不能把 λ \lambda λ写到待求解的 m ⃗ \vec m m里面呢,因为不同点的 λ \lambda λ是不一样的。
由于从初始解开始迭代的话,若初始解与实际相距较远,可能收敛会很慢。
因此,可以求解系统的线性部分,以找到近似解;适用该解作为整个系统的初始条件。
核心:通过比值消掉未知数 λ \lambda λ。
均匀伸缩变化如下:
相似变换由缩放变换和欧式变换合成:
相机标定后,也无法从2D图像恢复出3D场景,因为2D点与光心连线上的任意3D点都满足条件。
由于 ω \omega ω具有5个自由度,目前列出的3个方程无法求出 ω \omega ω,因此假定摄像机零倾斜且具有方形像素,则 ω 2 = 0 且 ω 1 = ω 3 \omega_2=0 且 \omega_1=\omega_3 ω2=0且ω1=ω3,此时就可以求出 ω \omega ω,进而分解出 K K K。
单视图恢复出的三维场景结构,无法恢复场景的实际比例;
由于从单幅视图恢复场景三维结构比较困难,并且,单视图2D到3D的映射具有多义性,如下图所示,从单视图中很难辨别塔是模型还是实物;
只要已知直线 l l l和 l ′ l' l′,则三维点P就是两条直线的交点。因此,只要将直线 l l l和 l ′ l' l′映射到同一坐标系下,就可以通过 P = l × l ′ P=l \times l' P=l×l′求出点 P P P的三维坐标。
此时,问题演变成了:
已知二维像素坐标 p p p 和 p ′ p' p′, K K K 和 K ′ K' K′,以及两视图之间的变换矩阵 R R R、 T T T,
求解P点的三维坐标?
此时存在两种解法:线性解和非线性解;
最小化重投影误差
- 在实际情况中,由于噪声的存在,两条直线通常不相交;
- 且上述的线性解和非线性解都需要已知 K K K 和 K ′ K' K′, R R R、 T T T;
- 然而,实际情况中,摄像机的内参 K K K 和 K ′ K' K′和两视图之间的变换矩阵 R R R、 T T T通常不可知,那么实际情况就变成了如下的问题:
- 问题1:已知 p p p和 p ′ p' p′,摄像机内参数 K K K和 K ′ K' K′,
- 求解:摄像机的 R R R、 T T T以及P点的三维坐标?
- 问题2:已知 p p p和 p ′ p' p′
- 求解:摄像机内参数 K K K和 K ′ K' K′,摄像机的 R R R、 T T T以及P点的三维坐标?
- 摄像机几何:从一张或者多张图像中求解摄像机的内、外参数;
- 场景几何:通过二至多幅图寻找3D场景坐标;
- 对应关系:已知一个图像中的 p p p点,如何在另外一个图像中找到 p ′ p' p′点;
极几何描述了同一场景或者物体的两个视点图像间的几何关系;
极几何可以将对应点搜索范围缩小到对应的极线上;
(1)极几何特例——平行视图
(2)极几何特例——前向平移(无旋转)
本质矩阵对规范化摄像机拍摄的两个视点图像间的极几何关系进行代数描述;
p ′ p' p′和 O 2 O_2 O2在 O 1 O_1 O1坐标系下的坐标为:
p ′ = R p ′ ∗ + T p ′ ∗ = R T ( p ′ − T ) = R T p ′ − R T T \begin{aligned} p' & =Rp^{'*} +T \\ p^{'*} & =R^T(p'-T) \\ & =R^Tp'-R^TT \\ \end{aligned} p′p′∗=Rp′∗+T=RT(p′−T)=RTp′−RTT
∵ O 2 = [ 0 0 0 ] T O 2 ∗ = − R T T \begin{aligned} \because O_2 & =[0 \quad 0 \quad 0 ]^T \\ O^{*}_{2} & =-R^TT \\ \end{aligned} ∵O2O2∗=[000]T=−RTT
对两个向量进行叉乘:
O 1 p ′ ∗ → × O 1 O 2 ∗ → = ( R T p ′ − R T T ) × ( − R T T ) = R T T × R T p ′ \begin{aligned} \overrightarrow{O_1 p^{'*}} \times \overrightarrow{O_1 O^{*}_2} & = (R^Tp'-R^TT) \times (-R^TT) \\ & = R^TT \times R^T p' \\ \end{aligned} O1p′∗×O1O2∗=(RTp′−RTT)×(−RTT)=RTT×RTp′
得到的向量垂直于 O 1 O 2 P O_1O_2P O1O2P 极平面,因此可得:
[ R T T × R T p ′ ] T ⋅ p = 0 [ R T ⋅ ( T × p ′ ) ] T ⋅ p = 0 ( T × p ′ ) T ⋅ R ⋅ p = 0 ( [ T × ] ⋅ p ′ ) T ⋅ R ⋅ p = 0 p ′ T ⋅ [ T × ] ⋅ R ⋅ p = 0 p ′ T ⋅ [ T × R ] ⋅ p = 0 p ′ T ⋅ E ⋅ p = 0 \begin{aligned} & [R^TT \times R^T p']^T \cdot p=0 \\ & [R^T \cdot (T \times p')]^T \cdot p=0\\ & (T \times p')^T \cdot R \cdot p=0\\ & ([T_{\times}] \cdot p')^T \cdot R \cdot p=0\\ & p^{'T} \cdot [T_{\times}] \cdot R \cdot p=0\\ & p^{'T} \cdot [T \times R] \cdot p=0\\ & p^{'T} \cdot E \cdot p=0\\ \end{aligned} [RTT×RTp′]T⋅p=0[RT⋅(T×p′)]T⋅p=0(T×p′)T⋅R⋅p=0([T×]⋅p′)T⋅R⋅p=0p′T⋅[T×]⋅R⋅p=0p′T⋅[T×R]⋅p=0p′T⋅E⋅p=0
最终,本质矩阵 E = T × R = [ T × ] R E=T \times R = [T_{\times}] R E=T×R=[T×]R
基础矩阵对一般的透视摄像机拍摄的两个视点的图像间的极几何关系进行代数描述。
推导思路:将一般相机变换到规范化相机,用本质矩阵来表达;
p = K [ I 0 ] P K − 1 p = [ I 0 ] P \begin{aligned} p & = K[I \quad 0]P \\ K^{-1}p & = [I \quad 0]P \end{aligned} pK−1p=K[I0]P=[I0]P
则规范化相机下左右两视图的像素点坐标演变为:
p c = K − 1 p p c ′ = K ′ − 1 p ′ \begin{aligned} p_c & = K^{-1}p \\ p_c^{'} & = K^{'-1}p' \\ \end{aligned} pcpc′=K−1p=K′−1p′
带入本质矩阵:
p c ′ T E p c = p c ′ T ⋅ [ T × ] R ⋅ p c = ( K ′ − 1 p ′ ) T ⋅ [ T × ] R ⋅ K − 1 p = p ′ T K ′ − T [ T × ] R K − 1 p = p ′ T F p \begin{aligned} p_c^{'T}Ep_c & = p_c^{'T} \cdot [T_{\times}] R \cdot p_c \\ & =(K^{'-1}p')^T \cdot [T_{\times}] R \cdot K^{-1}p \\ & = p^{'T}K^{'-T} [T_{\times}] R K^{-1}p \\ & = p^{'T}Fp \end{aligned} pc′TEpc=pc′T⋅[T×]R⋅pc=(K′−1p′)T⋅[T×]R⋅K−1p=p′TK′−T[T×]RK−1p=p′TFp
最终基础矩阵F为:
F = K ′ − T [ T × ] R K − 1 F=K^{'-T} [T_{\times}] R K^{-1} F=K′−T[T×]RK−1
p ′ T F p = 0 p^{'T}Fp=0 p′TFp=0
F有7个自由度,理论上7点可以解出F,但计算比较复杂;
(1)单点方程矩阵形式展开:
(2)选取八个点,列出齐次线性方程:
(3)最小二乘求解:
通常 N > 8 N>8 N>8,为超定方程组,采用最小二乘求解:
(4)满秩矩阵分解:
上述经过最小二乘估计得到的 F ^ \hat F F^通常秩为3,为满秩矩阵,但基础矩阵 F F F的秩为2。
(5)八点法求解总结
(6)八点法存在的问题
- W矩阵中各个元素的数值差异过大;
- SVD分解有数值计算问题
- 导致求解结果通常有10+pixel左右的误差;
对每幅图像施加变换T(平移与缩放),让其满足如下条件:
- 原点 = 图像上点的重心;
- 各个像点到坐标原点的均方根距离等于 2 \sqrt 2 2;
归一化八点法的计算步骤如下:
归一化八点法的精度高,推荐使用;
单应矩阵描述空间中的平面在两个摄像机下的投影几何;
由于 e ′ e' e′ 是 O 2 O_2 O2 在右视图的投影,可以列出如下等式:
给予叉乘性质(对于任何向量 α \alpha α,如果 B B B可逆,相差一个尺度情况下):
[ a × ] B = B − T [ ( B − 1 α ) × ] [a_{\times}]B=B^{-T}[(B^{-1}\alpha)_{\times}] [a×]B=B−T[(B−1α)×]
另 α = T \alpha=T α=T, B = K ′ − 1 B=K^{'-1} B=K′−1,则:
[ T × ] K ′ − 1 = K ′ T [ ( K ′ T ) × ] [ T × ] = K ′ T [ ( K ′ T ) × ] K ′ \begin{aligned} [T_\times]K^{'-1} & =K^{'T}[(K'T)_\times] \\ [T_\times] & =K^{'T}[(K'T)_\times]K' \\ \end{aligned} [T×]K′−1[T×]=K′T[(K′T)×]=K′T[(K′T)×]K′
将 [ T × ] [T_\times] [T×]带入到基础矩阵F中:
F = K ′ − T [ T × ] R K − 1 = K ′ − T K ′ T [ ( K ′ T ) × ] K ′ R K − 1 = [ ( K ′ T ) × ] K ′ R K − 1 = [ e × ′ ] K ′ R K − 1 \begin{aligned} F & =K^{'-T} [T_{\times}] R K^{-1} \\ & =K^{'-T} K^{'T}[(K'T)_\times]K' R K^{-1} \\ & = [(K'T)_\times]K' R K^{-1}\\ & = [e'_\times]K' R K^{-1} \\ \end{aligned} F=K′−T[T×]RK−1=K′−TK′T[(K′T)×]K′RK−1=[(K′T)×]K′RK−1=[e×′]K′RK−1
最终推导得到:
F = [ e × ′ ] K ′ R K − 1 F = [e'_\times]K' R K^{-1} F=[e×′]K′RK−1
在平行视图中,满足以下条件:
极线是水平的,平行于 u u u轴!
(2)平行视图对应点搜索
对应点 p p p 和 p ′ p' p′ 的 v v v 坐标是一样的;
因此, p ′ p' p′点只需要在 p p p点的 v v v坐标所在的线寻找即可;
利用三角形相似原理,可以得到
p u − p u ′ f = B Z \frac{p_u-p_u'}{f}=\frac{B}{Z} fpu−pu′=ZB
p u − p u ′ = B ⋅ f Z p_u-p_u'=\frac{B \cdot f}{Z} pu−pu′=ZB⋅f
由此可得:视差与深度Z成反比!
也就是说,物体离人眼越远,左右眼观察到的图像越相似;
“视差与深度Z成反比”这个结论可以方便我们从视差图中推导得到深度图。(如下图所示,视差图颜色越暗,距离双目摄像机越远)
在平行视图中,可以很方便利用视差获取深度图,但是,再实际构建的双目立体视觉系统中,如何保证两个视图是完全平行的呢,这就需要进行图像校正。
校正结果如下:
图像校正, p ′ p' p′点直接演着扫描线寻找即可;
相关法不适用于亮度变化明显的case;
匹配时采用的窗口大小的影响:
- 当窗口较小时,细节比较丰富,但噪声更多;
- 当噪声较大时,视差图更平滑,噪声更少,但丢失了细节;
(3)基线选择
(4)当存在同质区域或者重复模式时,相关法会失效;
三种典型的运动恢复结构任务包括:
- 欧式结构回复(摄像机内参数已知,外参数未知)
- 仿射结构恢复(摄像机为仿射像机,内外参数均未知)
- 透视结构恢复(摄像机为透视相机,内外参数均未知)
- 以左视图为参考坐标系,则左视图 [ R T ] = [ I 0 ] [R \quad T]=[I \quad 0] [RT]=[I0],并且摄像机内参数已知,那么左视图投影矩阵 M 1 M_1 M1已知;
- 当右视图的投影矩阵也已知时,便可以利用三角化(线性解或非线性解)求解得到三维点的坐标;
- 但是,我们只知道右视图的摄像机内参数,并不知道右视图相对于左视图的外参数 [ R T ] [R \quad T] [RT],因此无法直接使用三角化求解,必须先求解右视图的 [ R T ] [R \quad T] [RT]。
具体求解步骤如下:
(2)求解本质矩阵
(3)分解本质矩阵——求解 [ R T ] [R \quad T] [RT]
(4)三角化
歧义:恢复的结构与真实场景之间相差一个相似变化(旋转、平移、缩放);
度量重构:这种恢复的场景与真实场景之间仅存在相似变换的重构称为度量重构;
(1)数据中心化
(2)因式分解
D = M S = ( M H ) ( H − 1 S ) = M ∗ S ∗ D=MS=(MH)(H^{-1}S)=M^*S^* D=MS=(MH)(H−1S)=M∗S∗
仿射结构恢复分解不唯一,存在歧义,歧义可以有任意的 3 × 3 3\times 3 3×3可逆矩阵H表达;
(2)估计摄像机矩阵 M 1 M_1 M1、 M 2 M_2 M2
(3)三角化
分别对每一个图像对计算运动与结构,然后进行增量法构建:
- 在仿射变换结构恢复所采用的因式分解法中,需要假定所有3D点在所有摄像机均是可见的,因此当存在遮挡,或者建立对应点关系失败时,能够用于构建观测矩阵D的点很少,重建出来的点数就很少;
- 透视结构恢复采用代数法求解,容易出现误差的累积;
光束法平差通过最小化重投影误差来恢复运动和结构,是一种非线性解法;
Simultaneous Localization and Mapping(SLAM):同时定位和建图
- Localization:传感器的位置和姿态;
- Mapping:地图构建
- 应用场景:定位、导航、避障、重建、交互
SLAM传感器分类:
- 携带于机器人本体的,例如轮式编码器、相机、激光等;
安装于环境中的,如导轨、二维码标识等;
同时运行三个线程:
- 跟踪:确定当前帧位姿;
- 建图:完成局部地图构建;
- 回环修正:回环检测以及基于回环信息修正系统漂移;
(1)地图点
- 世界坐标系下的3D点坐标;
- 观测方向,即所有可以观测到该特征点的视图所产生的观测方向均值;
- ORB特征描述子;
- 该点能被观测到的最大距离与最小距离;
(2)关键帧
- 摄像机位姿;
- 内参数;
- 该帧中提取到的全部ORB特征描述子,以及它们和地图点之间的对应关系;
(3)共视图
一种有向无权图,节点为关键帧,如两个节点共享的地图点数量大于阈值(至少15个),则存在一条边,边的权重设置为共享地图点的个数。
(4)本质图
是共视图的子图,保留所有节点,边数量相较于共视图更少,尽量减少边,其作用是加速回环校正的计算。
本质图=生成树+共视图边权重超过100的边+回环边
跟踪(Tracking):给定当前帧,从图像提取ORB特征,根据上一帧估计当前帧姿态,估计失败时,尝试全局重定位初始化位姿,构建局部地图进一步优化位姿,并确定是否设置成关键帧。
建图(LocalMapping):完成局部地图构建。包括对关键帧的插入,验证最近生成的地图点并进行筛选,然后生成新的地图点,实用局部光束法平差(Local BA),最后再对插入的关键帧进行筛选,去除多余的关键帧。
回环修正(LoopClosing):包含闭环检测和闭环校正两步。闭环探测先使用词袋模型找到闭环图片,然后通过Sim3算法计算相似变换。闭环校正主要是闭环融合和Essential Graph的图优化。