本文主要是介绍计算机视觉之三维重建, 写给所有试图研究三维重建的初学者,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
网络上关于三维重建的相关博客有很多,但是我觉得那些大都不适合初学者进行学习,往往是直接讲解某个知识点,当我们对于前面的支撑知识不够了解的话,看起来可能是相当费劲的(我就是刚入门的菜鸡). 因此我在B站上找到了一门非常好的课程, 学完之后对笔记进行了整理, 这门课讲的非常易懂, 同时也补充了计算机视觉的相关基础知识. 强烈建议初学者都学一学, 非常好的课程!
欢迎从事三维重建的小伙伴找我交流:
QQ: 37477422
VX: k374774222
请注明来意!
学习资源
北邮鲁鹏: 计算机视觉之三维重建篇
课程资料 PPT 代码
鲁鹏老师团队网站, 包含各种课程资源
鲁鹏老师实验室B站主页
- 所有的SFM系统中,都是将重建时的第一幅图像的坐标系当作世界坐标系的
计算机视觉之三维重建
https://www.bilibili.com/video/BV1DP41157dB?p=1&vd_source=0bb90ee46c8cfcdb66c93f2f5a3ae085

1.摄像机几何
1.摄像机和透镜

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

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



2.摄像机几何

k 和 l k和l k和l为相机感光元器件的参数,用于将以
米
为单位的像平面坐标转换为以像素
为单位的像素平面坐标f k fk fk和 f l fl fl可以分别用 α \alpha α和 β \beta β替换,并作为相机的内参

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

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

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

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

内参矩阵K有5个自由度

此相机中, θ = 9 0 ° \theta=90^{\degree} θ=90°,cx=cy=0
在规范化摄像机中,摄像机坐标系下三维点的欧式(非齐次)坐标 = 图像点的齐次坐标,如上图所示,在4.2节可以找到应用

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



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

3.其他摄像机模型

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



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

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

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


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

2.摄像机标定
摄像机标定
:求解摄像机的内、外参数矩阵内外参数描述了三维世界到二维世界的映射关系
1.针孔模型 和 透镜摄像机标定问题

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

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

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


将内外参数的求解,建模成一个超定齐次线性方程组问题
实际的求解过程是:首先自己将P矩阵写好,然后调用SVD包进行分解
但是要注意,此时求出的投影矩阵M和真实的M之间还差一个比例系数||m||,这个比例系数||m||需要在后续确定
默认比例系数m的模长为1,即||m||=1
注意事项:
- 向量的模 = 向量的转置 ∗ 向量本身 向量的模=\sqrt{向量的转置*向量本身} 向量的模=向量的转置∗向量本身
- 旋转矩阵R中的旋转向量r1, r2, r3之间的关系,点乘r1·r2=0, r1·r3=0, r2·r3=0 叉乘r1xr2=r3, r1xr3=r2, r2xr3=r1

上述过程只是将投影矩阵M求解了出来(投影矩阵由内外参数矩阵组成)
**注意 V 是 V T V是V^T V是VT**的转置

旋转矩阵R
中,三个向量r1、r2、r3是互不相关的,即 r 1 ⋅ r 2 = 0 , r 1 ⋅ r 3 = 0 r1· r2=0, r1·r3=0 r1⋅r2=0,r1⋅r3=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表示行向量

等式右侧中,左半部分是一个3x3的矩阵,右侧是一个3x1的矩阵
奇异值分解出来的投影矩阵M 与 真实的投影矩阵M’ 之间相差一个系数 ρ ,即 ρ M = M ′ \rho,即\rho M = M' ρ,即ρM=M′

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

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(a1⋅a3),v0=ρ2(a2⋅a3),进而求出u0和v0


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−αcotθr1ρ2(a2×a3)=sinθβr1}3.两边取模得到{ρ2∣a1×a3∣=sinθ∣α∣ρ2∣a2×a3∣=sinθ∣β∣}4.将ρ2(a1×a3)和ρ2(a2×a3)点乘得到−αcotθsinθβ5.将ρ2∣a1×a3∣和ρ2∣a2×a3∣点乘得到sin2θ∣αβ∣6.ρ2(a1×a3)点乘ρ2(a2×a3)和ρ2∣a1×a3∣点乘ρ2∣a2×a3∣的比值为−cosθ


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)和ρ2∣a2×a3∣做除法,可得r14.因为r1,r2,r3三个向量两两垂直,已经求出r1和r3,故而r1×r3=r2

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


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

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

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

因为 λ \lambda λ不是一个常数
因此径向畸变不能建模为线性方程组,因此不能按照奇异值分解的方式求得相应系数
可以使用迭代的方法求解相应的解

3. 2D平面上的变换

等距变换:指A和B两个点在变换之后,A’和B‘两个点之间的距离和原来的保持一致
欧式变换:指旋转+平移的等距变换
镜像变换:即字面意思发生镜像变换且距离不变


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

4. 3D平面上的变换


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

没有先验知识,世界坐标P可以在射线上的任意位置
1.无穷远点、无穷远线和无穷远平面
无穷远点、无穷远线和无穷远平面的概念是针对单视图重建提出的,而多视图重建用不到这些知识

l l l表示直线的参数


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


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



2.影消点和影消线

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


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

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

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

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

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

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

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

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

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


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

1.三维重建基础

单视图恢复比较困难,因为:
- 单视图2D到3D具有多义性,也就是无法确定深度

视点o1和o2在两幅图像上的对应点分别为p和p’,并且形成两条射线l和l’,且相交于世界坐标系点P,通过将o2转换为o1的坐标系下,便可以求得点P的世界坐标,这一过程叫做
三角化
但通常情况下,空间中两条直线难以相交,因此产生另外两种解法:线性解法,非线性解法

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

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

在实际应用中,通常会有其他的限制条件
已知p和p’,摄像机内参数K和K’,这是一种欧式结构恢复问题,真实值和解之间相差一个缩放因子
仅知道p和p’,这是一种 透视结构恢复问题,真实值和解之间相差一个可逆矩阵

摄像机几何:解决摄像机
内外参数标定
的问题,在第2节已经解决场景几何:根据
三角化
求得3D场景坐标对应关系:使用
极几何
找到两幅图像的对应点摄像机几何–>场景几何<–对应关系
2.极几何及基础矩阵
极几何是一种描述视点关系的工具,基础矩阵是其数学表达形式
极几何
:描述了同一场景或物体的两个视点图像间的几何关系



上图中的极线为 l 和 l ′ l和l' l和l′,极点为 e 和 e ′ e和e' e和e′
多个极平面都与基线相交,且他们
对应的极线都相交于极点
视点o1和o2在图像上的对应点p和p’均在极平面Po1o2上,且p在o2图像上的投影在极线 l ′ l' l′上,p’在o1图像上的投影在极线 l l l上

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

本质矩阵
:对规范化摄像机拍摄的两个视点图像间的极几何关系进行代数描述
规范化相机
:旋转矩阵为单位阵,平移向量为0
在规范化摄像机中,摄像机坐标系下三维点的欧式(非齐次)坐标 = 图像点的齐次坐标,如上图所示

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

假设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(p′−T)=RTp′−RTT 旋转矩阵R的逆=R的转置 R − 1 = R T R^{-1}=R^T R−1=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∗=RT0−RTT=−RTT
因为 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∣∣b∣sinθ,贡献夹角为0或180,因此共线的向量外积=01.首先将向量o1p′和o1o2进行外积,得到RTT×(RTp′−RTT)=RTT×RTp′2.由外积的几何性质可知,两个向量外积的结果垂直于这两个向量,也就是垂直于极平面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=0p′T[T×]TRp=0−p′T[T×]Rp=0p′T[T×R]p=0这样就可以建立两幅视图中两个点之间的联系,其中[T×R]则为规范相机模型下的本质矩阵

p ′ 和 p p'和p p′和p表示
规范化相机
下的其在对应坐标系下的空间坐标,这个空间坐标可以由其像素坐标
得到三维点的欧式(非齐次)坐标 = 图像点的齐次坐标,eg: 空间点p在o1坐标系下的非齐次坐标为(u, v, 1)

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因为l′Tp′=0(p′Tl′=0),且p′TEp=0,故l′=Ep2.同理,p′投影到o1视图上的极线l=ETp′3.Ee=0与e′TE=0因为lTe=0,且l=ETp′,故(ETp′)Te=p′TEe=0因为p′!=0,所以Ee=0
基础矩阵
:对一般的透视摄像机
拍摄的两个视点的图像间的极几何关系进行代数描述

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的逆的方式,将一般相机模型变换到规范化相机模型K−1p=K−1K[I,0]P=[I,0]P,即pc=[I,0]P=K−1ppc即为规范化相机模型下的图像坐标从而可以套用之前的本质矩阵的性质pc′TEpc=0,带入上式得到:(K′−1p′)TEK−1p=p′TK′−1TEK−1p=0进而得到基础矩阵F=K′−1TEK−1


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


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





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


真正要用的方法
归一化八点法
:将像素点平移到以坐标原点为中心的位置,然后对坐标进行缩放得到变换矩阵T
可以理解为将像素点缩放到以坐标原点为中心, 半径=1的圆形区域内
然后再通过八点法估计基本矩阵Fq,最后再还原出为归一化之前的基本矩阵F

4.单应矩阵

单应矩阵应对的情况,当
要估计的世界坐标系下的点都处于同一个平面
使用
基础矩阵则无法估计相机的内外参数
,这时候只能使用单应矩阵

由单应矩阵可以直接建立两幅视图中像素点的对应关系 p ′ = H p p'=Hp p′=Hp
通过观察单应矩阵, 发现两副视图的对应点是一一对应的, 而基础矩阵 p ′ T F p = 0 {p'}^TFp=0 p′TFp=0 则不是

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

当场景中的点都位于同一个平面,那么
只能
由单应矩阵
估计相机内外参数
基础矩阵
:用于一般的成像条件


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

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


原点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]T将e′代入[(K′T)×]K′RK−1=[e×′]K′RK−1=F
使用叉乘的性质,可以得到基础矩阵F的另一种表达, F = [ e × ′ ] K ′ R K − 1 F=[e'_{\times}]K'RK^{-1} F=[e×′]K′RK−1,其中 [ e × ′ ] [e'_{\times}] [e×′]为基点像素坐标

在平行视图中,假设两个相机的内参一样 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×′]K′RK−1 化简可得** F = [ e × ′ ] F=[e'_{\times}] F=[e×′]然后将向量展开为矩阵**

将线段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=Bpu−pu′,化简得 p u − p u ′ = B f z p_u-p_{u'}=\frac{Bf}{z} pu−pu′=zBf,进而可得三维深度 z = B f p u − p u ′ z=\frac{Bf}{p_u-p_{u'}} z=pu−pu′Bf
其中
f为摄像机的焦距
,B为摄像机基线的距离, z为物体三维点到相机的深度

2.图像校正


补充:
1.找到八对匹配点,根据八点发求得基础矩阵F
2.
构建超定齐次线性方程组,使用最小二乘计算极点坐标(奇异值分解)
3.
依次构建T, R, G三个矩阵,并带入上述3中的公式得到透视变换矩阵 H ′ H' H′, 这是一种固定的构造, 没有可解释性, 记住就行
T − 1 T^{-1} T−1的作用是将坐标由频域映射回源域

平行视图指的不是两幅图片的平行,而是图片中的同一物体在视觉上看起来是平行的
3.对应点搜索

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


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





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


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

平滑性约束,相邻点之间的深度差距不会太大
6.多视图几何
前置知识

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



向量性质:向量 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的模长等于与其自身转置的乘积∣∣A∣∣2=ATA1.将最小二乘写成矩阵的形式Y=XB2.进而得到能量函数E=∣∣Y−XB∣∣2=(Y−XB)T(Y−XB)=YTY−2(XB)TY+(XB)T(XB)4.因为梯度为0的地方即为能量函数E的最低点,根据向量性质,因此有dBdE=2XTXB−2XTY=05.化简得XTXB=XTY,移项得B=(XTX)−1XTY
最小二乘
度量的是点到直线y轴方向的距离
注意
:最小二乘不能用于求解垂直线的情况,因为y和x不是一一对应的

全最小二乘
度量的是点到直线的垂直距离
点到直线距离公式 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+by−d∣,假设a2+b2=1,则d=∣ax+by−d∣1.求解所有点到直线距离和的最小值,并建立能量函数E2.先对d求偏导,化简得到d的值,并代回E中3.将E写成矩阵乘法的形式E=(UN)T(UN)5.再对N求偏导得到dNdE=2(UTU)N=06.根据特征值和特征向量的知识可知,必有2(UTU)N=λN=0,因此特征值λ=0,因此找到是的2(UTU)这个矩阵的0特征值对应的N向量

鲁棒的全最小二乘
指的是将全最小二乘的经过在经过一个函数的变换,使得最终的结果只在一定范围内变换, 超过这个范围则变化不明显,类似于 激活函数 的思想上图中 r i r_i ri为全最小二乘的结果, ρ \rho ρ为经过一个函数变换,该函数要选择适当的超参数 σ \sigma σ才有助于解决问题
鲁棒的最小二乘
只能用迭代法去估计参数,且该方法只适用于有限的噪声点的情况

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

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

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

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.(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)
上图表格展示了不同 外点率 和 初始点个数 下的 采样次数 关系

设定一个阈值 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时,可以选出多条直线

自适应决定采样次数
设p=0.99
- 首先随即采样几个点,拟合直线,并求出内点数
- 根据内点数求出外点率 e e e
- 根据e求出对应的采样次数N
- 采样计数sample_count+=1
- 如果N>sample_count说明上一部采样的直线还不够好,仍需要继续采样
重复1-4步骤,当N<=sample_count时,说明此时采样的直线为最佳的直线了举个例子,尽管在循环执行sample_count=100次时,才计算得到N=80<=sample_cout,但是多迭代的20次对于计算机的开销是可以被接受的

RANSAC在实际使用时,首先根据上述的迭代方法找到最优直线的所有内点(右图绿色点),
然后再对所有的内点做一次全最小二乘,得到最终的拟合的直线,得到更好的线(
Refine
)

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


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

欧式结构恢复有6个未知参数,仿摄像机有8个未知参数,透视相机有11个未知参数
欧式结构恢复(使用的最多)


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

重点是如何
分解本质矩阵


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

对本质矩阵进行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过程中可以求得

因为要保证旋转矩阵行列式的值为正数
, 上面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)

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



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

仿射结构恢复

场景深度可以理解为
鼻子和脸的距离d
,当d的距离远小于物体与摄像机的距离z时,则可以将物体上的所有点都看作在同一个平面上![]()
当近似为弱投影相机时, f ′ z = m \frac{f'}{z}=m zf′=m即可认为是一个定值m
因此就可以认为,真实物体和成像点坐标之间仅差了一个缩放系数m,而m是一个定值。

根据弱透视投影相机的矩阵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 xE和XE都是欧式坐标



假设世界坐标在图像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点的质心作为世界坐标中心

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

D是一个观测矩阵,假设一共有3张图片,他们都可以看到三维空间物体上的100个点
这100个点映射到图片上可以得到不同的像素坐标,每个映射点的像素坐标 减去 这张图片上所有映射点的坐标的均值 即为 x ^ i j \hat{x}_{ij} x^ij
进而可以得到观测矩阵D



因为观测矩阵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,但是两者求出来的对应的三维形态是不一样的


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

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

有m个图像,对应m个相机,对应m个投影矩阵M,每个投影矩阵对应11个参数
有n个三维点,每个三维点有3个坐标值
因此一共要求解的未知量的个数为 11 m + 3 n 11m+3n 11m+3n

求解出来的解 和 真实的解 之间相差一个4x4的可逆矩阵,而这个可逆矩阵无法求出,
因此就可以构造出来一个 M ∗ M^* M∗使得其形式比较简单,便于求解

代数方法(通过基础矩阵)


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

上途中的 X ^ 、 x ′ 和 x \hat{X}、x'和x X^、x′和x均为
非真实
的世界坐标点 和 像素坐标点
对于一些公式的补充说明 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,因此有x′T(x′×b)=0

反对称矩阵A的性质
A T = A − 1 A = − A T A^T=A^{-1} \\ A = -A^T AT=A−1A=−AT
提醒
:上图中 [ b × ] [ b × ] = b b T − ∣ b 2 ∣ I [b_\times][b_\times]=bb^T-|b^2|I [b×][b×]=bbT−∣b2∣I ,且 ∣ ∣ b ∣ ∣ = 1 ||b||=1 ∣∣b∣∣=1
捆绑调整(Bundle Adjustment, BA)


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

4.PnP问题




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.通过等式两边乘以K−1的方式得到:K−1a=[I,0]Pa,也就是得到像素点a对应的相机坐标系下三维点坐标3.因为此时在该图像对应坐标系下计算,因此可以得到oa,ob,oc三个像素点三维坐标的向量4.进而可以求出他们之间的夹角

5.模型拟合之RANSAC




7.运动恢复结构(sfm)系统解析——以openmvg为例
所有的SFM系统中,都是将重建时的第一幅图像的坐标系当作世界坐标系的



实际在sfm系统设计的过程中,我们需要考虑如何获取相机的内参数,以及m张图像中对应点的像素坐标
对于相机内参数
:可以读取相片的EXIF信息 获得
对于像素坐标
:这点我们无从得知
1.sfm系统(两视图)


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

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

计算距离比 d 1 d 2 \frac{d_1}{d_2} d2d1小于某个阈值的作用时筛选调右图中一个点对应作图中两个点的情况
在找到匹配点后,还需要考虑
如何消除错误匹配点对基础矩阵F估计的影响

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



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

轨迹 Tracks
:可以简单的理解为,图像中的某个特征点在所有图像中出现过的次数大于某个阈值,这个一个点就被称为一条轨迹track
如果某个特征点的track<=2,则该特征点就会被剔除,因为track太小该特征点不太稳定
轨迹t 可以理解为所有视图中的特征点,哪些是需要重建的
边e 表示当前重建的两副视图中,哪些点可以重建,也就是说两副视图中的匹配点存在噪声点
t ∩ e t\cap e t∩e表示最后需要重建的鲁棒的点,也就是去除噪声点后的点

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

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

每选择一条边,在经过估计出新添加视图的外参数后,使用BA对所有的图像的外参数再次进行微调
从而使得每次估计后的结果越来越精确
8.SLAM系统解析——以ORB-SLAM为例
1.词袋模型



将所有的纹理基元排列在一起,然后统计每个纹理基元在不同图像中出现的次数,从而形成直方图
然后算两个直方图的相似度,进而进行图相匹配


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


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


词频因子 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在
文档中
出现频率越高
,其重要性就越高

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

可以通过提前将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=1∑V∑j=1Vtij2∑j=1Vtqj2tij×tqj因此对于数据库中的一幅图像,可以将其中单词的TF值提前算出来∑j=1Vtij2tij,也就是上图中的0.40.4的真实含义是:图像1中的第2个单词的TF值=0.4同理,可以将文档中某个单词的IDF值提前算出来,方便后面∑j=1Vtqj2tqj的计算
索引表格中可以存储各种有用的特征 来方便查询但是这种按图像编号建立索引仍然避免不了查询图像与所有的图像都进行一次比较,当图片非常多的时候,比较起来就很费时间

倒排索引的思想是:根据数据库中所有的单词建立索引
假设查询图像中含有2,4号单词,且索引表格中2,4号单词中均有1号图片(换句话说1号图像含有2,4号单词)
那就将1号图像对应的2,4号单词与查询图像的2,4号单词计算得到的sim相似度累加起来
如果2号图像也有2,4号单词,那么也要与查询图像的2,4号单词计算sim,然后比较两个sim值哪个更大,那么查询图像就与哪个图像匹配


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

位姿优化
:仅优化位姿R,T
全局优化
:对所有点
进行优化,R,T,X都需要优化
局部优化
:对部分点
进行优化,R,T,X都需要优化
4.生成树

生成树不是唯一的
5.SLAM介绍——同时定位和建图

6.传感器


7.地图

SLAM使用的是 3D点云地图

8.ORB-SLAM

数据结构与数据库


视觉词典
:这个词典是从大型数据集中提前学好的
关键帧词袋数据库
:只有当系统运行时才会用,根据关键帧建立倒排索引检索中的 重拍结果 还包含了两张图像特征点的对应关系


系统工作流程

跟踪




重定位的思想简单来说就是,将当前帧与数据库中的关键帧进行特征匹配找到最相似的关键帧,可以得到当前帧与关键帧哪些特征点能够匹配上
然后建立能够匹配的世界3D点与当前帧像素点的映射关系,根据PnP问题求解当前帧的位姿
最后将剩下的所有世界3D点都投影到当前帧下,最后再利用当前帧下所有的世界3D点和投影像素点根据PnP问题再次求解当前帧位姿(相当于修正以下结果)




建图
核心功能
:完成局部地图构建
回环修正
核心功能
:修正累计误差

这篇关于计算机视觉之三维重建, 写给所有试图研究三维重建的初学者的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!