计算机视觉之三维重建, 写给所有试图研究三维重建的初学者

前言

网络上关于三维重建的相关博客有很多,但是我觉得那些大都不适合初学者进行学习,往往是直接讲解某个知识点,当我们对于前面的支撑知识不够了解的话,看起来可能是相当费劲的(我就是刚入门的菜鸡). 因此我在B站上找到了一门非常好的课程, 学完之后对笔记进行了整理, 这门课讲的非常易懂, 同时也补充了计算机视觉的相关基础知识. 强烈建议初学者都学一学, 非常好的课程!

欢迎从事三维重建的小伙伴找我交流:
QQ: 37477422
VX: k374774222
请注明来意!

学习资源

由于笔记的图片过多, CSDN无法转存图片, 因此我将markdown笔记上传到百度网盘, 需要的请自行下载: Markdown笔记, PDF和课程实验代码

北邮鲁鹏: 计算机视觉之三维重建篇

课程资料 PPT 代码
在这里插入图片描述

鲁鹏老师团队网站, 包含各种课程资源
在这里插入图片描述

鲁鹏老师实验室B站主页
在这里插入图片描述

  1. 所有的SFM系统中,都是将重建时的第一幅图像的坐标系当作世界坐标系的

计算机视觉之三维重建

https://www.bilibili.com/video/BV1DP41157dB?p=1&vd_source=0bb90ee46c8cfcdb66c93f2f5a3ae085

image-20240227210635434

1.摄像机几何

1.摄像机和透镜

image-20240227205824710

针孔摄像机中的 f f f表示针孔到胶片的距离

image-20240227205713775

这里的 f f f表示透镜的焦距

image-20240227211032840 image-20240227210214452 image-20240227210259954

2.摄像机几何

image-20240227211444649

k 和 l k和l kl为相机感光元器件的参数,用于将以为单位的像平面坐标转换为以像素为单位的像素平面坐标

f k fk fk f l fl fl可以分别用 α \alpha α β \beta β替换,并作为相机的内参

image-20240227211603480

P P P P ′ P' P不是一个线性变换

image-20240227211926349

齐次坐标变欧式坐标不是一一对一的关系

image-20240227212321337

通过齐次坐标系,将投影变换转换为一个线性变换

image-20240227212655094

在摄像机偏斜的情况下,像素不是方形的,而是存在夹角 θ \theta θ,因此需要在相机模型中建模进去

image-20240227213344635

内参矩阵K有5个自由度

image-20240227213711369

此相机中, θ = 9 0 ° \theta=90^{\degree} θ=90°,cx=cy=0

在规范化摄像机中,摄像机坐标系下三维点的欧式(非齐次)坐标 = 图像点的齐次坐标,如上图所示,在4.2节可以找到应用

image-20240227214130030

旋转矩阵R具有以下性质:

  1. 正交性质:R的每一列都是单位向量且两两正交,即R^T * R = I,其中R^T表示R的转置,I表示单位矩阵。
  2. 行列式为正:det® = 1,即R是一个特殊正交群SO(n)中的元素。
  3. 保持长度和夹角不变:R作用于向量时,保持向量的长度和夹角不变。
  4. 旋转特性:R可以描述空间中的旋转变换,因此称为旋转矩阵。
image-20240227214220624 image-20240227214417285 image-20240227214933272

Det(A)表示求A矩阵的行列式

image-20240227215124564

3.其他摄像机模型

image-20240227215849012

当相对场景深度d远小于物体与相机的距离z0时,可以将物体都近似在一个平面上

image-20240227220219928 image-20240227220309153 image-20240227220355874

4.线性方程组的最小二乘解

image-20240227220659948

p表示方程的格式,q表示要求解的未知数的个数

image-20240227220928664

5.齐次线性方程组的最小二乘解

image-20240227221157437 image-20240227221339240

再求齐次线性方程组的解时,需要添加一个约束,即求出的x的模为1,因此实际的x应该与估计的x之间相差一个放大倍数

6.非线性方程组的最小二乘解

image-20240227221825347

2.摄像机标定

摄像机标定:求解摄像机的内、外参数矩阵

内外参数描述了三维世界到二维世界的映射关系

1.针孔模型 和 透镜摄像机标定问题

image-20240303134618001

默认 p表示像素坐标,P表示世界坐标

image-20240303135209545

由n对点求解摄像机的内外参数

image-20240303135314105

m i m_i mi表示投影矩阵的参数

image-20240303135423416 image-20240303135804365

将内外参数的求解,建模成一个超定齐次线性方程组问题

实际的求解过程是:首先自己将P矩阵写好,然后调用SVD包进行分解

但是要注意,此时求出的投影矩阵M和真实的M之间还差一个比例系数||m||,这个比例系数||m||需要在后续确定

默认比例系数m的模长为1,即||m||=1

注意事项:

  1. 向量的模 = 向量的转置 ∗ 向量本身 向量的模=\sqrt{向量的转置*向量本身} 向量的模=向量的转置向量本身
  2. 旋转矩阵R中的旋转向量r1, r2, r3之间的关系,点乘r1·r2=0, r1·r3=0, r2·r3=0 叉乘r1xr2=r3, r1xr3=r2, r2xr3=r1
image-20240303140651670

上述过程只是将投影矩阵M求解了出来(投影矩阵由内外参数矩阵组成)

**注意 V 是 V T V是V^T VVT**的转置

image-20240303141423639

旋转矩阵R中,三个向量r1、r2、r3是互不相关的,即 r 1 ⋅ r 2 = 0 , r 1 ⋅ r 3 = 0 r1· r2=0, r1·r3=0 r1r2=0,r1r3=0三个向量的内积=0,三个向量的外积 r 1 × r 2 = r 3 r1\times r2=r3 r1×r2=r3,即三个向量两两垂直

旋转矩阵R中三个列向量r1, r2, r3均为单位向量,模长均=1

在表示向量时不带转置符号T,则表示向量 r r r默认为一个列向量, r T r^T rT表示行向量

image-20240303142602825

等式右侧中,左半部分是一个3x3的矩阵,右侧是一个3x1的矩阵

奇异值分解出来的投影矩阵M 与 真实的投影矩阵M’ 之间相差一个系数 ρ ,即 ρ M = M ′ \rho,即\rho M = M' ρ,即ρM=M

image-20240303143042723

将求得的投影矩阵M写成[A b]的形式,则可以得到 ρ A = K R \rho A=KR ρA=KR ρ b = K T \rho b=KT ρb=KT的结论

image-20240303144111455

1. 令 ρ a 3 T = r t T 2. 然后两边取模 , 因为 ∣ r 3 T ∣ = 1 ,则有 ρ ∣ a 3 T ∣ = 1 ,进而有 ρ = + − 1 ∣ a 3 ∣ 3. 根据前面的内外机性质,则有 ρ a 1 T ⋅ ρ a 2 T = 0 , ρ a 2 T ⋅ ρ a 3 T = 0 4. 化简则有 u 0 = ρ 2 ( a 1 ⋅ a 3 ) , v 0 = ρ 2 ( a 2 ⋅ a 3 ) , 进而求出 u 0 和 v 0 1.令\rho a_3^T = r_t^T \\ 2.然后两边取模,因为|r_3^T|=1,则有\rho|a_3^T|=1,进而有\rho=\frac{+-1}{|a_3|} \\ 3.根据前面的内外机性质,则有\rho a_1^T·\rho a_2^T=0, \rho a_2^T·\rho a_3^T=0 \\ 4.化简则有 u_0=\rho^2(a_1·a_3), v_0=\rho^2(a_2·a_3),进而求出u_0和v_0 1.ρa3T=rtT2.然后两边取模,因为r3T=1,则有ρa3T=1,进而有ρ=a3+13.根据前面的内外机性质,则有ρa1Tρa2T=0,ρa2Tρa3T=04.化简则有u0=ρ2(a1a3),v0=ρ2(a2a3),进而求出u0v0

image-20240303145406935 image-20240303150824473

P S : 一个向量和自身叉乘的结果 = 0 ,即 r 3 × r 3 = 0 1. 根据上面外积的性质有, ρ a 1 T × ρ a 2 T = ρ a 3 T 2. 从而得到等式 , { ρ 2 ( a 1 × a 3 ) = α r 2 − α c o t θ r 1 ρ 2 ( a 2 × a 3 ) = β s i n θ r 1 } 3. 两边取模得到 { ρ 2 ∣ a 1 × a 3 ∣ = ∣ α ∣ s i n θ ρ 2 ∣ a 2 × a 3 ∣ = ∣ β ∣ s i n θ } 4. 将 ρ 2 ( a 1 × a 3 ) 和 ρ 2 ( a 2 × a 3 ) 点乘得到 − α c o t θ β s i n θ 5. 将 ρ 2 ∣ a 1 × a 3 ∣ 和 ρ 2 ∣ a 2 × a 3 ∣ 点乘得到 ∣ α β ∣ s i n 2 θ 6. ρ 2 ( a 1 × a 3 ) 点乘 ρ 2 ( a 2 × a 3 ) 和 ρ 2 ∣ a 1 × a 3 ∣ 点乘 ρ 2 ∣ a 2 × a 3 ∣ 的比值为 − c o s θ PS: 一个向量和自身叉乘的结果=0,即r_3\times r_3=0 \\ 1.根据上面外积的性质有,\rho a_1^T\times \rho a_2^T=\rho a_3^T \\ 2.从而得到等式, \begin{Bmatrix} \rho^2(a_1\times a_3)=\alpha r_2-\alpha cot\theta r_1 \\ \rho^2(a_2\times a_3)=\frac{\beta}{sin\theta}r_1 \end{Bmatrix} \\ 3.两边取模得到 \begin{Bmatrix} \rho^2|a_1\times a_3|=\frac{|\alpha|}{sin\theta} \\ \rho^2|a_2\times a_3|=\frac{|\beta|}{sin\theta} \end{Bmatrix} \\ 4.将\rho^2(a_1\times a_3)和\rho^2(a_2\times a_3)点乘得到-\alpha cot\theta \frac{\beta}{sin\theta} \\ 5.将\rho^2|a_1\times a_3|和\rho^2|a_2\times a_3|点乘得到\frac{|\alpha \beta|}{sin^2{\theta}} \\ 6.\rho^2(a_1\times a_3)点乘\rho^2(a_2\times a_3)和\rho^2|a_1\times a_3|点乘\rho^2|a_2\times a_3|的比值为-cos\theta PS:一个向量和自身叉乘的结果=0,即r3×r3=01.根据上面外积的性质有,ρa1T×ρa2T=ρa3T2.从而得到等式,{ρ2(a1×a3)=αr2αcor1ρ2(a2×a3)=sinθβr1}3.两边取模得到{ρ2a1×a3=sinθαρ2a2×a3=sinθβ}4.ρ2(a1×a3)ρ2(a2×a3)点乘得到αcosinθβ5.ρ2a1×a3ρ2a2×a3点乘得到sin2θαβ6.ρ2(a1×a3)点乘ρ2(a2×a3)ρ2a1×a3点乘ρ2a2×a3的比值为cosθ

image-20240303225514255 image-20240303231132110

1. 因为 ρ a 3 = r 3 , 且前面已经求得 ρ = + − 1 ∣ a 3 ∣ 2. 故 r 3 = + − a 3 ∣ a 3 ∣ 3. 将 ρ 2 ( a 2 × a 3 ) 和 ρ 2 ∣ a 2 × a 3 ∣ 做除法,可得 r 1 4. 因为 r 1 , r 2 , r 3 三个向量两两垂直,已经求出 r 1 和 r 3 ,故而 r 1 × r 3 = r 2 1.因为\rho a_3=r_3, 且前面已经求得\rho=\frac{+-1}{|a_3|} \\ 2.故r_3=\frac{+-a_3}{|a_3|} \\ 3.将\rho^2(a_2\times a_3)和\rho^2|a_2\times a_3|做除法,可得r_1 \\ 4.因为r1,r2,r3三个向量两两垂直,已经求出r1和r3,故而r1\times r3=r2 1.因为ρa3=r3,且前面已经求得ρ=a3+12.r3=a3+a33.ρ2(a2×a3)ρ2a2×a3做除法,可得r14.因为r1,r2,r3三个向量两两垂直,已经求出r1r3,故而r1×r3=r2

image-20240303232059735

因为 ρ b = K T , 故而  T = ρ K − 1 b \rho b = KT, 故而\ T=\rho K^{-1}b ρb=KT,故而 T=ρK1b

image-20240303232530431 image-20240303232633538

因为3个点可以确定一个平面,如果取的至少6个点中在一个平面上,则会通过线性关系求得其他的点,这样就没有意义了

image-20240304025044629

2.径向畸变的摄像机标定

image-20240303233435328

λ < 1 时 \lambda<1时 λ<1建模为枕形畸变,当 λ > 1 时 \lambda>1时 λ>1建模为桶形畸变

image-20240303233939939

因为 λ \lambda λ不是一个常数

因此径向畸变不能建模为线性方程组,因此不能按照奇异值分解的方式求得相应系数

可以使用迭代的方法求解相应的解

image-20240303234330775

3. 2D平面上的变换

image-20240303234929362

等距变换:指A和B两个点在变换之后,A’和B‘两个点之间的距离和原来的保持一致

欧式变换:指旋转+平移的等距变换

镜像变换:即字面意思发生镜像变换且距离不变

image-20240303235422726 image-20240303235613436

仿射变换中的角度会发生变化

image-20240303235748787

4. 3D平面上的变换

image-20240303235948545

image-20240304000222637

image-20240304000301114

摄像机的成像过程也是透视变换(3D->2D),但和3D空间中的透视变换(3D->3D)有区别

3.单视图几何

image-20240304025343739

没有先验知识,世界坐标P可以在射线上的任意位置

1.无穷远点、无穷远线和无穷远平面

无穷远点、无穷远线和无穷远平面的概念是针对单视图重建提出的,而多视图重建用不到这些知识

image-20240304030004242

l l l表示直线的参数

image-20240304030130603 image-20240304030459970

结论:已知直线的方向,那么他的无穷远点则为[a, b, 0],推广到三维空间则为[a, b, c, 0]

image-20240304030819865 image-20240304030921999

π \pi π表示空间中的面,类比2D空间的线

image-20240304031155275 image-20240304031242921 image-20240304031458594

2.影消点和影消线

image-20240304031900500

透视变换:无穷远点投影之后不是无穷远点

仿射变换:无穷远点投影之后还是无穷远点

image-20240304032329204 image-20240304032624046

透视变换:无穷远线投影之后不是无穷远线

仿射变换:无穷远线投影之后还是无穷远线

image-20240304032938854

影消点是二维空间中的一个确定的点,无穷远点是世界坐标,影消点是像素坐标

image-20240304033402284

已知相机内参K和影消点的像素坐标,就可以求得3D空间中影消点对应一组平行线的方向

image-20240304033852014

影消线为像素坐标,无穷远线为世界坐标

image-20240304034134028

真实世界中的一个平面就对应一条影消线(比如两条铁轨在一个平面上,而周围的树木则在另一个平面上),平面上的所有平行线都相交于影消线上

image-20240304034923956
  1. v = K d v=Kd v=Kd 将3D空间中线的方向与像素空间中的影消点建立了联系
  2. n = K T l h n=K^Tl_h n=KTlh 将3D空间中的平面法向量与像素空间的影消线建立了联系

3.单视重构

image-20240304035703537

一张图像中,两组平行线L1和L2分别相较于影消点v1和v2,已知相机内参矩阵K和影消点,便可以求得世界坐标系下L1和L2两组平行线的方向,进而可以求得两组平行线的夹角

image-20240304040125314

image-20240311141715207

在图像中找到三组平行线(其中三组平行线在世界坐标下是两两垂直的),对应得到三个影消点

根据上面的结论,当两组平行线的夹角为90度时,则有 v 1 T ω v 2 = 0 v_1^T\omega v_2=0 v1Tωv2=0 ,因此三组平行线可以得到三个方程,但因为 ω \omega ω 有5个自由度,因此设定两个假设减少2个自由度,便可以通过影消点实现对 相机内参矩阵的求解

image-20240304041158423

上面的图片中可以得到3个互相垂直的平面,因此可以分别找到3个平面对应的影消线,进而得到每个平面的法向量

image-20240304041458650 image-20240304041700020

4.三维重建基础和极几何

image-20240304042234301

1.三维重建基础

image-20240304102441022

单视图恢复比较困难,因为:

  1. 单视图2D到3D具有多义性,也就是无法确定深度
image-20240304102943897

视点o1和o2在两幅图像上的对应点分别为p和p’,并且形成两条射线l和l’,且相交于世界坐标系点P,通过将o2转换为o1的坐标系下,便可以求得点P的世界坐标,这一过程叫做三角化

但通常情况下,空间中两条直线难以相交,因此产生另外两种解法:线性解法,非线性解法

image-20240304103529763

假设第一个相机的坐标系为世界坐标系在三维重建中都是将第一个相机的坐标系作为世界坐标系,则有式子 p = M P = K [ I , 0 ] P p=MP=K[I,0]P p=MP=K[I,0]P,即第一个式子由世界坐标得到像素坐标

第二个相机的P点可以由R,T转换到像素坐标

image-20240304104125174

非线性化方法的思路:

  1. 将世界坐标系下的点分别投影到多个平面上,得到MP*和M’P*
  2. 然后计算投影点和真实点p,p’之间的距离
  3. 然后用迭代法优化投影点和真实点之间的距离,使之距离越来越小,从而得到近似解
image-20240304104838211

在实际应用中,通常会有其他的限制条件

已知p和p’,摄像机内参数K和K’,这是一种欧式结构恢复问题,真实值和解之间相差一个缩放因子

仅知道p和p’,这是一种 透视结构恢复问题,真实值和解之间相差一个可逆矩阵

image-20240304105057696

摄像机几何:解决摄像机内外参数标定的问题,在第2节已经解决

场景几何:根据三角化求得3D场景坐标

对应关系:使用极几何找到两幅图像的对应点

摄像机几何–>场景几何<–对应关系

2.极几何及基础矩阵

极几何是一种描述视点关系的工具,基础矩阵是其数学表达形式

极几何:描述了同一场景或物体的两个视点图像间的几何关系

image-20240304105847656 image-20240304110512009 image-20240304110530785

上图中的极线为 l 和 l ′ l和l' ll,极点为 e 和 e ′ e和e' ee

多个极平面都与基线相交,且他们对应的极线都相交于极点

视点o1和o2在图像上的对应点p和p’均在极平面Po1o2上,且p在o2图像上的投影在极线 l ′ l' l上,p’在o1图像上的投影在极线 l l l

image-20240304111149544

在平行视图中,极点在无穷远处,此种情况下的三角化过程更加简单,具体应用为机器人的双目视觉系统

image-20240304111442063

本质矩阵:对规范化摄像机拍摄的两个视点图像间的极几何关系进行代数描述

规范化相机:旋转矩阵为单位阵,平移向量为0

image-20240304111850667

在规范化摄像机中,摄像机坐标系下三维点的欧式(非齐次)坐标 = 图像点的齐次坐标,如上图所示

image-20240304112355064

容易搞混:p和p’点 表示在各自相机坐标下对应像素点的三维坐标

image-20240304113917943

假设o1为世界坐标p'为o2相机坐标系下的三维点坐标设p'的世界坐标为P*,世界坐标o1转换到o2相机坐标系下的外参数为R,T

由于三维空间点的变换为刚体变换,只涉及R,T,则p’与P*的关系为: p ′ = R P ∗ + T p'=RP^*+T p=RP+T

进行代换之后则有 P ∗ = R T ( p ′ − T ) = R T p ′ − R T T P^*=R^T(p'-T)=R^Tp'-R^TT P=RT(pT)=RTpRTT 旋转矩阵R的逆=R的转置 R − 1 = R T R^{-1}=R^T R1=RT

因为o2为其所在相机坐标系下的原点,因此其坐标为p’(0,0,0),因此o2转换到世界坐标系o1下的坐标为 P ∗ = R T 0 − R T T = − R T T P*=R^T0-R^TT=-R^TT P=RT0RTT=RTT

image-20240304115649388

因为 R T T × R T T 共线,根据 a × b = ∣ a ∣ ∣ b ∣ s i n θ ,贡献夹角为 0 或 180 ,因此共线的向量外积 = 0 1. 首先将向量 o 1 p ′ 和 o 1 o 2 进行外积 , 得到 R T T × ( R T p ′ − R T T ) = R T T × R T p ′ 2. 由外积的几何性质可知,两个向量外积的结果垂直于这两个向量,也就是垂直于极平面 3. 因此 R T T × R T p ′ 与向量 o 1 p 垂直,则有 [ R T T × R T p ′ ] ⋅ p = 0 反对称阵的转置 [ T × ] T = − [ T × ] 4. 对 3 中的式子进行化简: { [ R T ( T × p ′ ) ] T p = 0 ( T × p ′ ) T R p = 0 ( [ T × ] p ′ ) T R p = 0 p ′ T [ T × ] T R p = 0 − p ′ T [ T × ] R p = 0 p ′ T [ T × R ] p = 0 这样就可以建立两幅视图中两个点之间的联系,其中 [ T × R ] 则为规范相机模型下的本质矩阵 因为R^TT\times R^TT共线,根据a\times b=|a||b|sin\theta,贡献夹角为0或180,因此共线的向量外积=0 \\ 1.首先将向量o1p'和o1o2进行外积,得到R^TT\times(R^Tp'-R^TT)=R^TT\times R^Tp' \\ 2.由外积的几何性质可知,两个向量外积的结果垂直于这两个向量,也就是垂直于极平面 \\ 3.因此R^TT\times R^Tp'与向量o1p垂直,则有[R^TT\times R^Tp']·p=0 \\ \\ 反对称阵的转置[T_\times]^T=-[T_\times] \\ 4.对3中的式子进行化简: \left\{\begin{matrix} & [R^T(T\times p')]^Tp=0 \\ & (T\times p')^TRp=0 \\ & ([T_{\times}]p')^TRp=0 \\ & p'^T[T_{\times}]^TRp=0 \\ & -p'^T[T_\times]Rp=0 \\ & p'^T[T\times R]p=0 \end{matrix}\right. \\ 这样就可以建立两幅视图中两个点之间的联系,其中[T\times R]则为规范相机模型下的本质矩阵 因为RTT×RTT共线,根据a×b=a∣∣bsinθ,贡献夹角为0180,因此共线的向量外积=01.首先将向量o1po1o2进行外积,得到RTT×(RTpRTT)=RTT×RTp2.由外积的几何性质可知,两个向量外积的结果垂直于这两个向量,也就是垂直于极平面3.因此RTT×RTp与向量o1p垂直,则有[RTT×RTp]p=0反对称阵的转置[T×]T=[T×]4.3中的式子进行化简: [RT(T×p)]Tp=0(T×p)TRp=0([T×]p)TRp=0pT[T×]TRp=0pT[T×]Rp=0pT[T×R]p=0这样就可以建立两幅视图中两个点之间的联系,其中[T×R]则为规范相机模型下的本质矩阵

image-20240304122121966

p ′ 和 p p'和p pp表示规范化相机下的其在对应坐标系下的空间坐标,这个空间坐标可以由其像素坐标得到

三维点的欧式(非齐次)坐标 = 图像点的齐次坐标,eg: 空间点p在o1坐标系下的非齐次坐标为(u, v, 1)

image-20240304123129043

1. p 投影到 o 2 视图上的极线 l ′ = E p 因为 l ′ T p ′ = 0 ( p ′ T l ′ = 0 ) , 且 p ′ T E p = 0 , 故 l ′ = E p 2. 同理, p ′ 投影到 o 1 视图上的极线 l = E T p ′ 3. E e = 0 与 e ′ T E = 0 因为 l T e = 0 , 且 l = E T p ′ , 故 ( E T p ′ ) T e = p ′ T E e = 0 因为 p ′ ! = 0 , 所以 E e = 0 1.p投影到o2视图上的极线l'=Ep \\ 因为l'^Tp'=0(p'^Tl'=0),且p'^TEp=0,故l'=Ep \\ 2.同理,p'投影到o1视图上的极线l=E^Tp' \\ 3.Ee=0 与 e'^TE=0 \\ 因为l^Te=0,且l=E^Tp',故(E^Tp')^Te=p'^TEe=0 \\ 因为p'!=0,所以Ee=0 1.p投影到o2视图上的极线l=Ep因为lTp=0(pTl=0),pTEp=0,l=Ep2.同理,p投影到o1视图上的极线l=ETp3.Ee=0eTE=0因为lTe=0,l=ETp,(ETp)Te=pTEe=0因为p!=0,所以Ee=0

基础矩阵:对一般的透视摄像机拍摄的两个视点的图像间的极几何关系进行代数描述

image-20240304124530125

1. 通过在 p = K [ I , 0 ] P 两边同乘内参矩阵 K 的逆的方式,将一般相机模型变换到规范化相机模型 K − 1 p = K − 1 K [ I , 0 ] P = [ I , 0 ] P , 即 p c = [ I , 0 ] P = K − 1 p p c 即为规范化相机模型下的图像坐标 从而可以套用之前的本质矩阵的性质 p c ′ T E p c = 0 ,带入上式得到: ( K ′ − 1 p ′ ) T E K − 1 p = p ′ T K ′ − 1 T E K − 1 p = 0 进而得到基础矩阵 F = K ′ − 1 T E K − 1 1.通过在p=K[I,0]P两边同乘内参矩阵K的逆的方式,将一般相机模型变换到规范化相机模型 \\ K^{-1}p=K^{-1}K[I,0]P=[I,0]P, 即p_c=[I,0]P=K^{-1}p \\ p_c即为规范化相机模型下的图像坐标 \\ 从而可以套用之前的本质矩阵的性质p'^T_cEp_c=0,带入上式得到: \\ (K'^{-1}p')^TEK^{-1}p=p'^TK'^{-1T}EK^{-1}p=0 \\ 进而得到基础矩阵F=K'^{-1T}EK^{-1} 1.通过在p=K[I,0]P两边同乘内参矩阵K的逆的方式,将一般相机模型变换到规范化相机模型K1p=K1K[I,0]P=[I,0]P,pc=[I,0]P=K1ppc即为规范化相机模型下的图像坐标从而可以套用之前的本质矩阵的性质pcTEpc=0,带入上式得到:(K1p)TEK1p=pTK1TEK1p=0进而得到基础矩阵F=K1TEK1

image-20240304125711992 image-20240304130058570

基础矩阵的秩为2, 因此在用八点法估计F时, 要满足秩为2的约束

image-20240304130208807 image-20240304130238363

3.基础矩阵估计

估计基础矩阵,进而可以求出摄像机的内、外参数矩阵即K, R, T

image-20240304130510930 image-20240304130817189 image-20240304130951017 image-20240304131228474 image-20240304131321618

执行秩2约束,指的是对第2步估计出来的基础矩阵F’再使用依次奇异值分解,并将分解后的中间矩阵的第三个维度化简为0

image-20240304131722378 image-20240304131926529

真正要用的方法归一化八点法:将像素点平移到以坐标原点为中心的位置,然后对坐标进行缩放得到变换矩阵T

可以理解为将像素点缩放到以坐标原点为中心, 半径=1的圆形区域内

然后再通过八点法估计基本矩阵Fq,最后再还原出为归一化之前的基本矩阵F

image-20240304132327777

4.单应矩阵

image-20240304132825437

单应矩阵应对的情况,当要估计的世界坐标系下的点都处于同一个平面

使用基础矩阵则无法估计相机的内外参数,这时候只能使用单应矩阵

image-20240304134928388

由单应矩阵可以直接建立两幅视图中像素点的对应关系 p ′ = H p p'=Hp p=Hp

通过观察单应矩阵, 发现两副视图的对应点是一一对应的, 而基础矩阵 p ′ T F p = 0 {p'}^TFp=0 pTFp=0 则不是

image-20240304135026431

仍然可以通过公式 p ′ = H p p'=Hp p=Hp 建立两幅视图之间对应点之间的联系, 然后将方程化简为齐次方程, 使用SVD分解得到H

image-20240304135429781

当场景中的点都位于同一个平面,那么只能单应矩阵估计相机内外参数

基础矩阵:用于一般的成像条件

image-20240304140815903 image-20240304141150695

5.双目立体视觉

1.基于平行视图的双目立体视觉

image-20240304141437912

在平行视图中,所有的极线也都相互平行,并在齐次坐标系下,相交于无穷远点

image-20240304141647652 image-20240304143937976

原点o1的在世界坐标系下的齐次坐标为[0, 0, 0, 1],经过R和T变换到o2坐标系下,极平面o1o2P上所有的点都可投影到极线 l ′ l' l上,故而o1可以投影到 e ′ e' e K ’ K’ K为o2坐标系下的内参矩阵

o1的世界坐标为[0,0,0,1]经过R, T转换到o2相机坐标系下, 然后再经过o2的相机内参数K’就可以得到o1投影到e’的坐标
e ′ = K ′ [ R   T ] [ 0 , 0 , 0 , 1 ] T 将 e ′ 代入 [ ( K ′ T ) × ] K ′ R K − 1 = [ e × ′ ] K ′ R K − 1 = F e'=K'[R\ T][0,0,0,1]^T \\ 将e'代入 [(K'T)_\times]K'RK^{-1}=[e'_\times]K'RK^{-1}=F e=K[R T][0,0,0,1]Te代入[(KT)×]KRK1=[e×]KRK1=F
使用叉乘的性质,可以得到基础矩阵F的另一种表达, F = [ e × ′ ] K ′ R K − 1 F=[e'_{\times}]K'RK^{-1} F=[e×]KRK1,其中 [ e × ′ ] [e'_{\times}] [e×]为基点像素坐标

image-20240304145122022

在平行视图中,假设两个相机的内参一样 K = K ′ K=K' K=K,两个视图之间没有旋转,只有平移则有: R = I , T = [ T , 0 , 0 ] R=I,T=[T,0,0] R=I,T=[T,0,0]

因而将上述条件带入 F = [ e × ′ ] K ′ R K − 1 F=[e'_{\times}]K'RK^{-1} F=[e×]KRK1 化简可得** F = [ e × ′ ] F=[e'_{\times}] F=[e×]然后将向量展开为矩阵**

image-20240304145833494

image-20240311112415532

将线段o2P平移到o1处与基线u'相交的点坐标为 p u ′ p_{u'} pu, 上图中绿色的点

上图中 黄色三角形 和 蓝色三角形相似, 根据相似三角形则有 f z = p u − p u ′ B \frac{f}{z}=\frac{p_{u}-p_{u'}}{B} zf=Bpupu,化简得 p u − p u ′ = B f z p_u-p_{u'}=\frac{Bf}{z} pupu=zBf,进而可得三维深度 z = B f p u − p u ′ z=\frac{Bf}{p_u-p_{u'}} z=pupuBf

其中f为摄像机的焦距B为摄像机基线的距离, z为物体三维点到相机的深度

image-20240304151649557

2.图像校正

image-20240304152006815 image-20240304153057243

补充:

1.找到八对匹配点,根据八点发求得基础矩阵F

2.image-20240304153153395image-20240304153205733

构建超定齐次线性方程组,使用最小二乘计算极点坐标(奇异值分解)

3.image-20240304153701435image-20240304153716499image-20240304153731316

依次构建T, R, G三个矩阵,并带入上述3中的公式得到透视变换矩阵 H ′ H' H, 这是一种固定的构造, 没有可解释性, 记住就行

T − 1 T^{-1} T1的作用是将坐标由频域映射回源域

image-20240304154304178

平行视图指的不是两幅图片的平行,而是图片中的同一物体在视觉上看起来是平行的

3.对应点搜索

image-20240304154838269

注意是沿扫描线在右图每个位置建立一个窗口(也就是卷积窗口),然后计算左右两个窗口的相似度,相似度最高的作为一对匹配点

image-20240304155137853 image-20240304155210945

归一化相关匹配,可以去除两幅图像中因为光照导致像素值差异过大的问题

image-20240304155349617 image-20240304155731008 image-20240304160025939 image-20240304160134138 image-20240304160156390

引入更多的约束解决对应点问题

image-20240304160703517 image-20240304160758987

物体存在遮挡的情况下,可能会违反顺序约束,一般情况下不会违反顺序约束

image-20240304160856493

平滑性约束,相邻点之间的深度差距不会太大

6.多视图几何

前置知识

image-20240307131627609

1.拟合(RANSAC 随机采样一致性 这是一种框架)

image-20240306121551873 image-20240306121755995 image-20240306123512980

向量性质:向量 A 的模长等于与其自身转置的乘积 ∣ ∣ A ∣ ∣ 2 = A T A 1. 将最小二乘写成矩阵的形式 Y = X B 2. 进而得到能量函数 E = ∣ ∣ Y − X B ∣ ∣ 2 = ( Y − X B ) T ( Y − X B ) = Y T Y − 2 ( X B ) T Y + ( X B ) T ( X B ) 4. 因为梯度为 0 的地方即为能量函数 E 的最低点,根据向量性质,因此有 d E d B = 2 X T X B − 2 X T Y = 0 5. 化简得 X T X B = X T Y ,移项得 B = ( X T X ) − 1 X T Y 向量性质:向量A的模长等于与其自身转置的乘积 ||A||^2= A^TA \\ 1.将最小二乘写成矩阵的形式 Y=XB \\ 2.进而得到能量函数E=||Y-XB||^2=(Y-XB)^T(Y-XB)=Y^TY-2(XB)^TY+(XB)^T(XB) \\ 4.因为梯度为0的地方即为能量函数E的最低点,根据向量性质,因此有\frac{dE}{dB}=2X^TXB-2X^TY=0 \\ 5.化简得 X^TXB=X^TY,移项得 B=(X^TX)^{-1}X^TY 向量性质:向量A的模长等于与其自身转置的乘积∣∣A2=ATA1.将最小二乘写成矩阵的形式Y=XB2.进而得到能量函数E=∣∣YXB2=(YXB)T(YXB)=YTY2(XB)TY+(XB)T(XB)4.因为梯度为0的地方即为能量函数E的最低点,根据向量性质,因此有dBdE=2XTXB2XTY=05.化简得XTXB=XTY,移项得B=(XTX)1XTY

最小二乘度量的是点到直线y轴方向的距离

注意:最小二乘不能用于求解垂直线的情况,因为y和x不是一一对应的

image-20240306130329938

全最小二乘度量的是点到直线的垂直距离
点到直线距离公式 d = ∣ a x + b y − d ∣ a 2 + b 2 ,假设 a 2 + b 2 = 1 ,则 d = ∣ a x + b y − d ∣ 1. 求解所有点到直线距离和的最小值,并建立能量函数 E 2. 先对 d 求偏导,化简得到 d 的值,并代回 E 中 3. 将 E 写成矩阵乘法的形式 E = ( U N ) T ( U N ) 5. 再对 N 求偏导得到 d E d N = 2 ( U T U ) N = 0 6. 根据特征值和特征向量的知识可知,必有 2 ( U T U ) N = λ N = 0 ,因此特征值 λ = 0 ,因此找到是的 2 ( U T U ) 这个矩阵的 0 特征值对应的 N 向量 点到直线距离公式d=\frac{|ax+by-d|}{\sqrt{a^2+b^2}},假设a^2+b^2=1,则d=|ax+by-d| \\ 1.求解所有点到直线距离和的最小值,并建立能量函数E \\ 2.先对d求偏导,化简得到d的值,并代回E中 \\ 3.将E写成矩阵乘法的形式E=(UN)^T(UN) \\ 5.再对N求偏导得到\frac{dE}{dN}=2(U^TU)N=0 \\ 6.根据特征值和特征向量的知识可知,必有2(U^TU)N=\lambda N=0,因此特征值\lambda=0,因此找到是的2(U^TU)这个矩阵的0特征值对应的N向量 点到直线距离公式d=a2+b2 ax+byd,假设a2+b2=1,则d=ax+byd1.求解所有点到直线距离和的最小值,并建立能量函数E2.先对d求偏导,化简得到d的值,并代回E3.E写成矩阵乘法的形式E=(UN)T(UN)5.再对N求偏导得到dNdE=2(UTU)N=06.根据特征值和特征向量的知识可知,必有2(UTU)N=λN=0,因此特征值λ=0,因此找到是的2(UTU)这个矩阵的0特征值对应的N向量

image-20240306135141755

鲁棒的全最小二乘指的是将全最小二乘的经过在经过一个函数的变换,使得最终的结果只在一定范围内变换, 超过这个范围则变化不明显,类似于 激活函数 的思想

上图中 r i r_i ri为全最小二乘的结果, ρ \rho ρ为经过一个函数变换,该函数要选择适当的超参数 σ \sigma σ才有助于解决问题

鲁棒的最小二乘只能用迭代法去估计参数,且该方法只适用于有限的噪声点的情况

image-20240306140752733

RANSAC 随机选取一致性

  1. 首先在所有的点中随机选取几个点
  2. 使用选取的点拟合成一条直线
  3. 从剩下的点中选取哪些点离拟合的直线更近(人为设置一个阈值),哪些点更远,并记录下来
  4. 重复1-3的过程,看所有的选取的点拟合的直线中,哪条得分最高,就保留这条直线
image-20240306141303666

在第3个步骤中,需要设置一个阈值,用于判断哪些点距离直线是较近的,哪些点是较远的

image-20240306141506888

RANSAC不仅可以拟合直线,还可以适用于其他的情况

image-20240306142103830
RANSAC的主要思想,公式的理解

p = 0.99 表示选取的这条线的可信度 ( 正确率 ) 为 99 % , e 表示一个点的外点率 1. ( 1 − e ) 表示内点率, ( 1 − e ) s 表示该次采样选取 s 个初始点拟合直线的总内点率 ( 正确率 ) 2. ( 1 − ( 1 − e ) s ) 表示该次采样的外点率 ( 错误率 ) , ( 1 − ( 1 − e ) s ) N 表示连续采样 N 次的总外点率 ( 错误率 ) 4. ( 1 − ( 1 − e ) s ) N = 1 − p ,因而可以通过错误率建立等是两边联系 5. 化简得 N = l o g ( 1 − p ) / l o g ( 1 − ( 1 − e ) s ) p=0.99表示选取的这条线的可信度(正确率)为99\%,e表示一个点的外点率 \\ 1.(1-e)表示内点率,(1-e)^s表示该次采样选取s个初始点拟合直线的总内点率(正确率) \\ 2.(1-(1-e)^s)表示该次采样的外点率(错误率),(1-(1-e)^s)^N表示连续采样N次的总外点率(错误率) \\ 4.(1-(1-e)^s)^N=1-p,因而可以通过错误率建立等是两边联系 \\ 5.化简得N=log(1-p)/log(1-(1-e)^s) p=0.99表示选取的这条线的可信度(正确率)99%e表示一个点的外点率1.(1e)表示内点率,(1e)s表示该次采样选取s个初始点拟合直线的总内点率(正确率)2.(1(1e)s)表示该次采样的外点率(错误率)(1(1e)s)N表示连续采样N次的总外点率(错误率)4.(1(1e)s)N=1p,因而可以通过错误率建立等是两边联系5.化简得N=log(1p)/log(1(1e)s)

上图表格展示了不同 外点率 和 初始点个数 下的 采样次数 关系

image-20240306163240610

设定一个阈值 T d T_d Td,用于限定满足 T d T_d Td个点在拟合的直线的范围内,则该直线为最优直线

记录每条拟合直线对应有多少个点 d d d 在直线的范围内

d m a x > T d d_{max} > T_d dmax>Td时,可以选出一条直线;当 d > T d d>T_d d>Td时,可以选出多条直线

image-20240306164315009
自适应决定采样次数

设p=0.99

  1. 首先随即采样几个点,拟合直线,并求出内点数
  2. 根据内点数求出外点率 e e e
  3. 根据e求出对应的采样次数N
  4. 采样计数sample_count+=1
  5. 如果N>sample_count说明上一部采样的直线还不够好,仍需要继续采样
    重复1-4步骤,当N<=sample_count时,说明此时采样的直线为最佳的直线了

举个例子,尽管在循环执行sample_count=100次时,才计算得到N=80<=sample_cout,但是多迭代的20次对于计算机的开销是可以被接受的

image-20240306165118092

RANSAC在实际使用时,首先根据上述的迭代方法找到最优直线的所有内点(右图绿色点),

然后再对所有的内点做一次全最小二乘,得到最终的拟合的直线,得到更好的线(Refine

image-20240306165810242

上图为A B为两个指纹,上面的小方框表示指纹的特征点,指纹匹配也可以借鉴RANSAC的思路

  1. 假设A上的指纹可以经过某种变换T与B指纹进行映射,可以建立一个旋转和平移的矩阵T,含有6个变量
  2. 因此需要3对6个点来求解T的参数
  3. 首先在A中随机选取3个点,然后在B中随机选择3个点,代入方程,求解T
  4. 将B中剩余的点代入方程,得到其在A中的映射点C
  5. 记录C能够与A中点匹配的点数(相当于内点率),进而得到外点率e
  6. 使用自适应确定最优采样次数确定N
  7. 根据N,重新进行迭代,得到能够另p=0.99的所有采样点,
  8. 进而求出内点率,当内点率大于阈值时,表示A和B两个指纹能够匹配

2.运动恢复结构问题

image-20240306174224815 image-20240306175118707

3.三种典型的运动恢复结构任务

image-20240306175343432

欧式结构恢复有6个未知参数,仿摄像机有8个未知参数,透视相机有11个未知参数

欧式结构恢复(使用的最多)
image-20240306175755518 image-20240306180630605

因为不知道R和T,因此不能直接使用三角化的方法恢复出物体的三维结构

image-20240306180825413

重点是如何分解本质矩阵

image-20240306181118462 image-20240306181427453

只需要记住 [ T × ] = k U Z U T [T_{\times}]=kUZU^T [T×]=kUZUT是一个已知的性质, 在估计时先不考虑尺度, 故k=1

image-20240306182154809

对本质矩阵进行SVD分解,可以得到 E = U d i a g ( 1 , 1 , 0 ) V T = U d i a g ( 1 , 1 , 0 ) ( W U T R ) E=Udiag(1,1,0)V^T=Udiag(1,1,0)(WU^TR) E=Udiag(1,1,0)VT=Udiag(1,1,0)(WUTR)

故而可知 V T = W U T R V^T=WU^TR VT=WUTR,进而求出 R = U W T V T R=UW^TV^T R=UWTVT

U U U的值在SVD过程中可以求得

image-20240306183452557

因为要保证旋转矩阵行列式的值为正数, 上面SVD分解得到的R还要乘以自身的行列式才是正确的R
将上面 S V D 分解得到的 U 代入 向量和自身作外积结果 = 0 ,因此有 T × T = [ T × ] T = 0 1. 套用前面的定义,则有 T × T = [ T × ] T = U Z U T T = 0 2. 因为 [ T × ] 是一个方阵,因此对 [ T × ] 进行本征矩阵分解,分解的结果左右特征矩阵形状相同 3. 因此 T = + − u 3 ( U 的第三列元素即为 T ) 将上面SVD分解得到的U代入 \\ 向量和自身作外积结果=0,因此有T\times T=[T_{\times}]T=0 \\ 1.套用前面的定义,则有T\times T=[T_{\times}]T=UZU^TT=0 \\ 2.因为[T_{\times}]是一个方阵,因此对[T_{\times}]进行本征矩阵分解,分解的结果左右特征矩阵形状相同 \\ 3.因此T=+-u_3 (U的第三列元素即为T) 将上面SVD分解得到的U代入向量和自身作外积结果=0,因此有T×T=[T×]T=01.套用前面的定义,则有T×T=[T×]T=UZUTT=02.因为[T×]是一个方阵,因此对[T×]进行本征矩阵分解,分解的结果左右特征矩阵形状相同3.因此T=+u3(U的第三列元素即为T)

image-20240306184636258

在求出R和T之后,再使用三角化对结构进行恢复,并与实际情况进行分解

image-20240306185037263 image-20240307132542939 image-20240306185545734

当我们知道场景下某个真实物体的绝对尺度时,就可以将整个场景的绝对尺度恢复出来

image-20240306185840554
仿射结构恢复
image-20240307105056628

场景深度可以理解为鼻子和脸的距离d,当d的距离远小于物体与摄像机的距离z时,则可以将物体上的所有点都看作在同一个平面上

image-20240307105737521

当近似为弱投影相机时, f ′ z = m \frac{f'}{z}=m zf=m即可认为是一个定值m

因此就可以认为,真实物体和成像点坐标之间仅差了一个缩放系数m,而m是一个定值。

image-20240307105655741

根据弱透视投影相机的矩阵M,可知 M = [ m 1 , m 2 , m 3 ] M=[m_1, m_2, m_3] M=[m1,m2,m3]其中 m 3 = [ 0 , 0 , 0 , 1 ] m_3=[0,0,0,1] m3=[0,0,0,1]

进而可以得到世界坐标到像素坐标更简单的投影公式: x E = A X E + b x^E=AX^E+b xE=AXE+b

其中 x E x^E xE为像素坐标(2x1), X E X^E XE为世界坐标(3x1), x E 和 X E x^E和X^E xEXE都是欧式坐标

image-20240307111147745 image-20240307111242967 image-20240307112109946

假设世界坐标在图像1对应的坐标系上,通过将像素坐标减去像素坐标均值的方式,化简可得: x ^ i j = A i X j ^ \hat{x}_{ij}=A_i\hat{X_j} x^ij=AiXj^

通过该式子可以发现,像素坐标的均值 与 世界坐标系的均值 仅通过矩阵 A i A_i Ai进行联系,而 b i b_i bi则被消掉了

因此如果设定 3D点的质心 == 世界坐标系的中心,那么就有理由认为 x ^ i j = A i X j ^ = A i X j \hat{x}_{ij}=A_i\hat{X_j}=A_i X_j x^ij=AiXj^=AiXj
在 x i j 中, i 表示第几个摄像机, j 表示三维空间中的第几个点 在x_{ij}中,i表示第几个摄像机,j表示三维空间中的第几个点 xij中,i表示第几个摄像机,j表示三维空间中的第几个点
在后面的求解中,都是将 3D点的质心作为世界坐标中心

image-20240307113459808

其中 A i A_i Ai表示第几个摄像机(有m个相机), X j X_j Xj表示三维空间中的第几个点(有n个三维点)

image-20240307123456255

D是一个观测矩阵,假设一共有3张图片,他们都可以看到三维空间物体上的100个点

这100个点映射到图片上可以得到不同的像素坐标,每个映射点的像素坐标 减去 这张图片上所有映射点的坐标的均值 即为 x ^ i j \hat{x}_{ij} x^ij

进而可以得到观测矩阵D

image-20240307124825181 image-20240307125425742 image-20240307125623762

因为观测矩阵D的秩=3,无论分解的结果如何, U , W , V T U,W,V^T U,W,VT都只取前三个向量

进而将分解结果组合成D

PS: D = U 3 ( W 3 V 3 T ) = M S D=U_3(W_3V^T_3)=MS D=U3(W3V3T)=MS,也可以有 D = ( U 3 W 3 ) V M T S D=(U_3W_3)V^T_MS D=(U3W3)VMTS,但是两者求出来的对应的三维形态是不一样的

image-20240307125243018 image-20240307130225498

仿射距离和欧式距离之间相差一个3x3的可逆矩阵,但这个矩阵没有办法求解出来

image-20240307130548968

相机的个数m 和 三维空间中可观测点的个数n,只有满足 2 m n ≥ 8 m + 3 n − 8 2mn \ge 8m+3n-8 2mn8m+3n8 的关系时,才能够对观测矩阵D进行求解

透视结构恢复
image-20240307130839927

有m个图像,对应m个相机,对应m个投影矩阵M,每个投影矩阵对应11个参数

有n个三维点,每个三维点有3个坐标值

因此一共要求解的未知量的个数为 11 m + 3 n 11m+3n 11m+3n

image-20240307133947732

求解出来的解 和 真实的解 之间相差一个4x4的可逆矩阵,而这个可逆矩阵无法求出

因此就可以构造出来一个 M ∗ M^* M使得其形式比较简单,便于求解

image-20240307134214614
代数方法(通过基础矩阵)
image-20240307134402020 image-20240307134604327

求解出来的解 和 真实的解 之间相差一个4x4的可逆矩阵,而这个可逆矩阵无法求出

image-20240307135841140

上途中的 X ^ 、 x ′ 和 x \hat{X}、x'和x X^xx均为非真实的世界坐标点 和 像素坐标点
对于一些公式的补充说明 x ′ × b = ( A x + b ) × b = A x × b + b × b = A x × b + 0 = A x × b x ′ × b 叉乘得到的向量和这两个向量中的任意一个点乘的结果都为 0 ,因此有 x ′ T ( x ′ × b ) = 0 对于一些公式的补充说明 \\ x'\times b = (Ax+b)\times b = Ax\times b + b\times b= Ax\times b + 0 = Ax\times b \\ x'\times b 叉乘得到的向量和这两个向量中的任意一个点乘的结果都为0,因此有 x'^T(x'\times b)=0 对于一些公式的补充说明x×b=(Ax+b)×b=Ax×b+b×b=Ax×b+0=Ax×bx×b叉乘得到的向量和这两个向量中的任意一个点乘的结果都为0,因此有xT(x×b)=0

image-20240307142501595

反对称矩阵A的性质

A T = A − 1 A = − A T A^T=A^{-1} \\ A = -A^T AT=A1A=AT

提醒:上图中 [ b × ] [ b × ] = b b T − ∣ b 2 ∣ I [b_\times][b_\times]=bb^T-|b^2|I [b×][b×]=bbTb2I ,且 ∣ ∣ b ∣ ∣ = 1 ||b||=1 ∣∣b∣∣=1

捆绑调整(Bundle Adjustment, BA)
image-20240307143533002 image-20240307143858998

BA的思想是:将多个点投影到多个摄像机坐标下,然后求解投影点和真实点之间的距离,并使得这个距离最小

image-20240307144407221

4.PnP问题

image-20240307145004144 image-20240307145523046 image-20240307145658781 image-20240307150623906

1. 首先 a = K [ I , 0 ] P a ,其中 P a 为摄像机坐标下空间点的坐标 2. 通过等式两边乘以 K − 1 的方式得到: K − 1 a = [ I , 0 ] P a ,也就是得到像素点 a 对应的相机坐标系下三维点坐标 3. 因为此时在该图像对应坐标系下计算,因此可以得到 o a , o b , o c 三个像素点三维坐标的向量 4. 进而可以求出他们之间的夹角 1.首先 a=K[I,0]P_a,其中P_a为摄像机坐标下空间点的坐标 \\ 2.通过等式两边乘以K^{-1}的方式得到:K^{-1}a=[I,0]P_a,也就是得到像素点a对应的相机坐标系下三维点坐标 \\ 3.因为此时在该图像对应坐标系下计算,因此可以得到oa,ob,oc三个像素点三维坐标的向量 \\ 4.进而可以求出他们之间的夹角 1.首先a=K[I,0]Pa,其中Pa为摄像机坐标下空间点的坐标2.通过等式两边乘以K1的方式得到:K1a=[I,0]Pa,也就是得到像素点a对应的相机坐标系下三维点坐标3.因为此时在该图像对应坐标系下计算,因此可以得到oa,ob,oc三个像素点三维坐标的向量4.进而可以求出他们之间的夹角

image-20240307151937058

5.模型拟合之RANSAC

image-20240307152358741 image-20240307152422809 image-20240307152736242 image-20240307152911412

7.运动恢复结构(sfm)系统解析——以openmvg为例

所有的SFM系统中,都是将重建时的第一幅图像的坐标系当作世界坐标系的

image-20240307154656556 image-20240307155120038 image-20240307155409570

实际在sfm系统设计的过程中,我们需要考虑如何获取相机的内参数,以及m张图像中对应点的像素坐标

对于相机内参数:可以读取相片的EXIF信息 获得

对于像素坐标:这点我们无从得知

1.sfm系统(两视图)

image-20240307163009933 image-20240307160629243

SIFT特征由一种SIFT特征提取器 提取出来,在提取特征时是独立提取的,即在提取A图特征时不关心B图,提取B图时不关心A图

image-20240307161001455
  1. 提取完特征后,首先要将两个特征的区域缩放到同一尺寸
  2. 计算特征中所有像素点的总梯度方向,将两个特征的总梯度方法归一化到同一方向
  3. 计算特征中相邻像素之间的梯度变化,作为特征表示描述符,从而缓解两副图像因为亮度不同对特征匹配准确率的影响
  4. 最终将提取出的SIFT特征表示为128维的向量
image-20240307161828334

计算距离比 d 1 d 2 \frac{d_1}{d_2} d2d1小于某个阈值的作用时筛选调右图中一个点对应作图中两个点的情况

在找到匹配点后,还需要考虑如何消除错误匹配点对基础矩阵F估计的影响

image-20240307162628663

2.基于增量法的sfm系统——以OpenMVG为例(多视图)

image-20240307163305840 image-20240307163339742 image-20240307163522777

非常重要

  1. 连通图构建阶段,假设找到了1000条track,也就是最终要对1000个点进行重构
  2. 两视图重构初始点云阶段,因为两张视图只能实现对部分点的重建,假设有30个点被重建
  3. 增加视图到系统实现多视图重构阶段
    1. 满足 t r a c k ( e ) ∩ 已重建 3 D 点 track(e)\cap {已重建3D点} track(e)已重建3D 最大化的含义是,在上述步骤2中已经重建了30个初始点,那么在剩下边e组成的两对视图中找包含这30个初始点的所有边e,并取包含数量最大的边e进行进一步重建
    2. 因为已知重建好的30个初始点3D坐标,并且也可以知道这30个点中的哪些在新的图像中对应的像素点坐标,因此可以用PnP方法估计R T,并把新的图像中的其他特征点给重建出来,并添加到原有已重建的3D点中,假设新增图像后 3D点增加到45个
    3. 重复1-5步骤,直到所有图片均被重建完
image-20240307163900758

轨迹 Tracks:可以简单的理解为,图像中的某个特征点在所有图像中出现过的次数大于某个阈值,这个一个点就被称为一条轨迹track

如果某个特征点的track<=2,则该特征点就会被剔除,因为track太小该特征点不太稳定

轨迹t 可以理解为所有视图中的特征点,哪些是需要重建的

边e 表示当前重建的两副视图中,哪些点可以重建,也就是说两副视图中的匹配点存在噪声点

t ∩ e t\cap e te表示最后需要重建的鲁棒的点,也就是去除噪声点后的点

image-20240307164538618

当两副图像之间能够匹配的特征点的个数大于阈值T,则这两副图像在联通图中就连接一条边 e e e

image-20240307165254902
  1. 计算所有摄像机的相机中心
  2. 选取两张匹配的图像A和B
  3. 将相机中心与两幅图像中的特征点连接形成射线
  4. 计算两副图像中相互匹配的特征点对应的两条射线的夹角 θ i \theta_i θi
  5. 计算所有夹角的均值 θ ^ = 1 n ∑ i = 1 n θ i \hat{\theta}=\frac{1}{n}\sum^{n}_{i=1}{\theta_i} θ^=n1i=1nθi
  6. 3 ≤ θ ^ ≤ 60 3\le\hat{\theta}\le 60 3θ^60时,就选取这组图像A和B之间的连线作为一条边
image-20240307172651295

每选择一条边,在经过估计出新添加视图的外参数后,使用BA对所有的图像的外参数再次进行微调

从而使得每次估计后的结果越来越精确

8.SLAM系统解析——以ORB-SLAM为例

1.词袋模型

image-20240307174602875 image-20240307174716678 image-20240307174745335

将所有的纹理基元排列在一起,然后统计每个纹理基元在不同图像中出现的次数,从而形成直方图

然后算两个直方图的相似度,进而进行图相匹配

image-20240307175242600 image-20240307175523557

大致流程为:

  1. 在图像上提取多个SIFT特征,并得到这些特征的中心点
  2. 将这些SIFT特征表示为128向量
  3. 对这些SIFT特征进行聚类,具体聚成多少类(n类),由人为设定。聚类的数目n,即为视觉词汇的个数
  4. 计算每个类别的中心点,作为对应的视觉词汇
  5. 统计图像中每个词汇的出现次数
image-20240307180129685 image-20240307180227857

2.基于词袋模型的图像检索(核心 TF-IDF)

image-20240307180325916 image-20240307180724281

词频因子 T F = n i j n i 逆文档频率因子 I D F = l o g N n j 词频因子TF=\frac{n_{ij}}{n_i} \\ 逆文档频率因子IDF=log{\frac{N}{n_j}} \\ 词频因子TF=ninij逆文档频率因子IDF=lognjN

该方法是将 单词本身在文档里的重要程度,与在数据库中的重要程度 合并起来

TF-IDF考虑了数据库中每个词汇的重要性

简单来说,数据库中单词 j j j在所有文档中出现的频率越高,其重要性就越低

数据库中的单词 j j j文档中出现频率越高,其重要性就越高

image-20240307180840572

使用TF-IDF将原来的词频向量 转换为 加权后的词频向量

image-20240307181640720

可以通过提前将sim(di, q)中部分参数算出来并储存起来降低匹配时的计算量
s i m ( d i , q ) = ∑ j = 1 V t i j × t q j ∑ j = 1 V t i j 2 ∑ j = 1 V t q j 2 上面中使用可以重写为: s i m ( d i , q ) = ∑ j = 1 V t i j × t q j ∑ j = 1 V t i j 2 ∑ j = 1 V t q j 2 因此对于数据库中的一幅图像,可以将其中单词的 T F 值提前算出来 t i j ∑ j = 1 V t i j 2 ,也就是上图中的 0.4 0.4 的真实含义是:图像 1 中的第 2 个单词的 T F 值 = 0.4 同理,可以将文档中某个单词的 I D F 值提前算出来,方便后面 t q j ∑ j = 1 V t q j 2 的计算 sim(d_i, q)=\frac{\sum_{j=1}^{V}{t_{ij}\times t_{qj}}}{\sqrt{\sum_{j=1}^{V}{t_{ij}^2}}\sqrt{\sum_{j=1}^{V}{t_{qj}^2}}} \\ 上面中使用可以重写为:sim(d_i, q)=\sum_{j=1}^{V}\frac{{t_{ij}\times t_{qj}}}{\sqrt{\sum_{j=1}^{V}{t_{ij}^2}}\sqrt{\sum_{j=1}^{V}{t_{qj}^2}}} \\ 因此对于数据库中的一幅图像,可以将其中单词的TF值提前算出来 \frac{t_{ij}}{\sqrt{\sum_{j=1}^{V}{t_{ij}^2}}},也就是上图中的0.4 \\ 0.4的真实含义是:图像1中的第2个单词的TF值=0.4 \\ 同理,可以将文档中某个单词的IDF值提前算出来,方便后面\frac{t_{qj}}{\sqrt{\sum_{j=1}^{V}{t_{qj}^2}}}的计算 \\ sim(di,q)=j=1Vtij2 j=1Vtqj2 j=1Vtij×tqj上面中使用可以重写为:sim(di,q)=j=1Vj=1Vtij2 j=1Vtqj2 tij×tqj因此对于数据库中的一幅图像,可以将其中单词的TF值提前算出来j=1Vtij2 tij,也就是上图中的0.40.4的真实含义是:图像1中的第2个单词的TF=0.4同理,可以将文档中某个单词的IDF值提前算出来,方便后面j=1Vtqj2 tqj的计算
索引表格中可以存储各种有用的特征 来方便查询

但是这种按图像编号建立索引仍然避免不了查询图像与所有的图像都进行一次比较,当图片非常多的时候,比较起来就很费时间

image-20240307181918906

倒排索引的思想是:根据数据库中所有的单词建立索引

假设查询图像中含有2,4号单词,且索引表格中2,4号单词中均有1号图片(换句话说1号图像含有2,4号单词)

那就将1号图像对应的2,4号单词与查询图像的2,4号单词计算得到的sim相似度累加起来

如果2号图像也有2,4号单词,那么也要与查询图像的2,4号单词计算sim,然后比较两个sim值哪个更大,那么查询图像就与哪个图像匹配

image-20240307181942087 image-20240307182047186

只需要将左右两副图像都映射成单词,那么两副图像中相同的单词就可以构成一对匹配

3.优化问题

image-20240308132726227

位姿优化:仅优化位姿R,T

全局优化:对所有点进行优化,R,T,X都需要优化

局部优化:对部分点进行优化,R,T,X都需要优化

4.生成树

image-20240308133206870

生成树不是唯一的

5.SLAM介绍——同时定位和建图

image-20240308133518937

6.传感器

image-20240308133658089 image-20240308133845887

7.地图

image-20240308134001248

SLAM使用的是 3D点云地图

image-20240308134108566

8.ORB-SLAM

image-20240308134205531
数据结构与数据库
image-20240308134602450 image-20240308135128566

视觉词典:这个词典是从大型数据集中提前学好的

关键帧词袋数据库:只有当系统运行时才会用,根据关键帧建立倒排索引

检索中的 重拍结果 还包含了两张图像特征点的对应关系

image-20240308140303992

image-20240308143116968

image-20240308143042219

image-20240308143054053
系统工作流程
image-20240308143904133
跟踪
image-20240308144823307 image-20240308144912805 image-20240308145051966 image-20240308145301612

重定位的思想简单来说就是,将当前帧与数据库中的关键帧进行特征匹配找到最相似的关键帧,可以得到当前帧与关键帧哪些特征点能够匹配上

然后建立能够匹配的世界3D点与当前帧像素点的映射关系,根据PnP问题求解当前帧的位姿

最后将剩下的所有世界3D点都投影到当前帧下,最后再利用当前帧下所有的世界3D点和投影像素点根据PnP问题再次求解当前帧位姿(相当于修正以下结果)

image-20240308150646678 image-20240308150731882 image-20240308151324639 image-20240308151625256
建图

核心功能:完成局部地图构建

image-20240308152026227

image-20240308152433755

image-20240308152547086

image-20240308152610639

回环修正

核心功能:修正累计误差

image-20240308152756981

image-20240308153112935

image-20240308153302539

image-20240308153733726

image-20240308153903532

  • 16
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值