当相机为单目时,只知道2D的像素坐标,根据两组2D点估计相机的运动,用对极几何来解决。
两个相机之间的变换为 T 12 \ T_{12} T12: p 1 = T 12 ⋅ p 2 \ p_1=T_{12}·p_2 p1=T12⋅p2,即:通过 P 2 \ P_2 P2的坐标乘以 T 12 \ T_{12} T12,即可求得 P 1 \ P_1 P1的坐标 。
在实践中:
设P在图1的相机坐标系下,坐标为: P = [ X , Y , Z ] T P=[X,Y,Z]^T P=[X,Y,Z]T
p 1 \ p_1 p1, p 2 \ p_2 p2的像素坐标(单位像素): s 1 p 1 = K P , s 2 p 2 = K ( R P + t ) s_1p_1=KP,s_2p_2=K(RP+t) s1p1=KP,s2p2=K(RP+t)
K \ K K为相机的内参矩阵, R , t \ R,t R,t为两个坐标系的相机运动。
使用齐次坐标,上式乘以非零常数都成立: p 1 = K P , p 2 = K ( R P + t ) p_1=KP,p_2=K(RP+t) p1=KP,p2=K(RP+t)
其归一化平面坐标(单位米): x 1 = K − 1 p 1 , x 2 = K − 1 p 2 x_1=K^{-1}p_1,x_2=K^{-1}p_2 x1=K−1p1,x2=K−1p2
得到: x 2 = R x 1 + t x_2=Rx_1+t x2=Rx1+t
这里的 x 1 , x 2 \ x_1,x_2 x1,x2是齐次坐标,等式表达了一个齐次关系。
两边同时左乘 t \ t t^,即:两侧同时与 t \ t t做外积,即,与 t \ t t作叉乘: t × x 2 = t × R x 1 + t × t t×x_2=t×Rx_1+t×t t×x2=t×Rx1+t×t
t \ t t与 t \ t t作叉乘,夹角为0,则结果为0,即: t × t = 0 \ t×t=0 t×t=0,上式化简为: t × x 2 = t × R x 1 t×x_2=t×Rx_1 t×x2=t×Rx1
两侧同时左乘 x 2 T \ x_2^T x2T: x 2 T t × x 2 = x 2 T t × R x 1 x_2^Tt×x_2=x_2^Tt×Rx_1 x2Tt×x2=x2Tt×Rx1
左式中, t × x 2 \ t×x_2 t×x2是一个与 t \ t t 和 x 2 \ x_2 x2都垂直的向量,把它再和 x 2 \ x_2 x2做内积时,将得到0。
所以得到对极约束, x 1 , x 2 为 归 一 化 坐 标 \ x_1,x_2为归一化坐标 x1,x2为归一化坐标: x 2 T t × R x 1 = 0 x_2^Tt×Rx_1=0 x2Tt×Rx1=0
重新带入 p 1 , p 2 \ p_1,p_2 p1,p2, p 1 , p 2 为 像 素 坐 标 \ p_1,p_2为像素坐标 p1,p2为像素坐标: p 2 T K − T t × R K − 1 p 1 = 0 p_2^TK^{-T}t×RK^{-1}p_1=0 p2TK−Tt×RK−1p1=0
上面两式子为对极约束,几何意义是: O 1 , P , O 2 \ O_1,P,O_2 O1,P,O2三者共面。
定义本质矩阵 E \ E E(Essential Matrix)和基础矩阵 F \ F F(Fundamental Matrix): E = t × R , F = K − T E K − 1 E=t×R,F=K^{-T}EK{-1} E=t×R,F=K−TEK−1
所以对极约束简写为: x 2 T E x 1 = p 2 T F p 1 = 0 x_2^TEx_1=p_2^TFp_1=0 x2TEx1=p2TFp1=0
根据对极约束,相机位姿估计问题变为以下两步,即估计 R , t \ R,t R,t的方法为:
1.根据匹配点的位置,求出 E \ E E或者 F \ F F。
2.根据 E \ E E或者 F \ F F,求出 R , t \ R,t R,t。
本质矩阵长什么样子:
· E = t × R \ E=t×R E=t×R, E \ E E是一个3×3的矩阵,内有9个未知数。
· E \ E E在不同尺度下是等价的( E \ E E具有尺度等价性):由于对极约束是等式为零的约束,所以对 E \ E E 乘以任意非零常数后,对极约束依然满足。
· 平移和旋转各有3个自由度,所以 t × R \ t×R t×R共6个自由度。由于 E \ E E具有尺度等价性,这是由于对极约束 的性质,其乘任意非零向量依然满足,即增加一个约束条件,所以6个自由度中可以去掉一个, 所以 E \ E E实际有5个自由度。
· E \ E E具有5个自由度,最少使用5对点来求解 E \ E E。但是, E \ E E具有一种非线性性质,在求解线性方程时会 很麻烦。
· 把 E \ E E当成一个3×3的普通矩阵,共9个自由度,由于 E \ E E的尺度等价性, E \ E E具有8个自由度,使用8对点 来估计 E \ E E,这就是“八点法”。
一对匹配点,它们的归一化坐标为 x 1 = [ u 1 , v 1 , 1 ] T , x 2 = [ u 2 , v 2 , 1 ] T \ x_1=[u_1,v_1,1] ^ T,x_2=[u_2,v_2,1]^T x1=[u1,v1,1]T,x2=[u2,v2,1]T,根据对极约束,有:
[ u 1 , v 1 , 1 ] [ e 1 e 2 e 3 e 4 e 5 e 6 e 7 e 8 e 9 ] [ u 2 v 2 1 ] = 0 [u_1,v_1,1] \left[ \begin{matrix} e_1 & e_2 & e_3 \\ e_4 & e_5 & e_6 \\ e_7 & e_8 & e_9 \end{matrix} \right] \left[ \begin{matrix} u_2 \\ v_2 \\ 1 \end{matrix} \right]=0 [u1,v1,1]⎣⎡e1e4e7e2e5e8e3e6e9⎦⎤⎣⎡u2v21⎦⎤=0
把 E \ E E展开,写成向量的形式:
e = [ e 1 , e 2 , e 3 , e 4 , e 5 , e 6 , e 7 , e 8 , e 9 ] T e=[e_1,e_2,e_3,e_4,e_5,e_6,e_7,e_8,e_9]^T e=[e1,e2,e3,e4,e5,e6,e7,e8,e9]T
把对极约束写成与 e \ e e有关的线性形式:
[ u 1 u 2 , u 1 v 2 , u 1 , v 1 u 2 , v 1 v 2 , v 1 , u 2 , v 2 , 1 ] e = 0 [u_1u_2,u_1v_2,u_1,v_1u_2,v_1v_2,v_1,u_2,v_2,1]e=0 [u1u2,u1v2,u1,v1u2,v1v2,v1,u2,v2,1]e=0
同理,对于其他店对也有相同的表示。把所有点都放在一个方程中,变成线性方程组( u i , v i \ u^i,v^i ui,vi表示第 i \ i i个特征点):
[ u 1 1 u 2 1 u 1 1 v 2 1 u 1 1 v 1 1 u 2 1 v 1 1 v 2 1 v 1 1 u 2 1 v 2 1 1 u 1 2 u 2 2 u 1 2 v 2 2 u 1 2 v 1 2 u 2 2 v 1 2 v 2 2 v 1 2 u 2 2 v 2 2 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . u 1 8 u 2 8 u 1 8 v 2 8 u 1 8 v 1 8 u 2 8 v 1 8 v 2 8 v 1 8 u 2 8 v 2 8 1 ] [ e 1 e 2 e 3 e 4 e 5 e 6 e 7 e 8 e 9 ] = 0 \left[ \begin{matrix} {u_1}^1{u_2}^1&{u_1}^1{v_2}^1&{u_1}^1&{v_1}^1{u_2}^1&{v_1}^1{v_2}^1&{v_1}^1&{u_2}^1&{v_2}^1&1\\ {u_1}^2{u_2}^2&{u_1}^2{v_2}^2&{u_1}^2&{v_1}^2{u_2}^2&{v_1}^2{v_2}^2&{v_1}^2&{u_2}^2&{v_2}^2&1 \\ ...&...&...&...&...&...&...&...&...\\ {u_1}^8{u_2}^8&{u_1}^8{v_2}^8&{u_1}^8&{v_1}^8{u_2}^8&{v_1}^8{v_2}^8&{v_1}^8&{u_2}^8&{v_2}^8&1 \end{matrix} \right]\left[ \begin{matrix} e_1 \\ e_2 \\ e_3 \\ e_4 \\ e_5 \\ e_6 \\ e_7 \\ e_8 \\ e_9 \end{matrix} \right]=0 ⎣⎢⎢⎡u11u21u12u22...u18u28u11v21u12v22...u18v28u11u12...u18v11u21v12u22...v18u28v11v21v12v22...v18v28v11v12...v18u21u22...u28v21v22...v2811...1⎦⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡e1e2e3e4e5e6e7e8e9⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=0
由上式可以求得 E \ E E,根据 E \ E E求取相机的运动 R , t \ R,t R,t。
根据 E \ E E求取相机的运动 R , t \ R,t R,t,对 E \ E E进行奇异值分解( S V D \ SVD SVD):
设 E \ E E的SVD分解为:
E = U Σ V T E=U\Sigma{V^T} E=UΣVT
其中 U , V \ U,V U,V为正交阵, Σ \ \Sigma Σ为奇异值矩阵。根据本质矩阵 E \ E E的内在性质, E \ E E的奇异值必定为 [ σ , σ , 0 ] T \ [\sigma,\sigma,0]^T [σ,σ,0]T, 所以 Σ = d i a g [ σ , σ , 0 ] \ \Sigma=diag[\sigma,\sigma,0] Σ=diag[σ,σ,0]
在 S V D \ SVD SVD分解中,对于任意一个 E \ E E,存在两个可能的 t , R \ t,R t,R与它对应:
t 1 Λ = U R Z ( π 2 ) Σ U T , R 1 = U R Z T ( π 2 ) V T t_1^{\Lambda}=UR_Z(\frac{π}{2}){\Sigma}U^T,R_1=UR_Z^T(\frac{π}{2})V^T t1Λ=URZ(2π)ΣUT,R1=URZT(2π)VT
t 2 Λ = U R Z ( − π 2 ) Σ U T , R 2 = U R Z T ( − π 2 ) V T t_2^{\Lambda}=UR_Z(-\frac{π}{2}){\Sigma}U^T,R_2=UR_Z^T(-\frac{π}{2})V^T t2Λ=URZ(−2π)ΣUT,R2=URZT(−2π)VT
其中 R Z T ( π 2 ) \ R_Z^T(\frac{π}{2}) RZT(2π)表示沿 Z \ Z Z轴旋转 9 0 ∘ \ 90^\circ 90∘得到的旋转矩阵。
由于 − E \ -E −E和 E \ E E等价,所以任意一个 t \ t t取负号,也会得到相同的结果。因此,从 E \ E E分解到 t , R \ t,R t,R时,一共存在4个可能的解。
(1) P \ P P在 O 1 , O 2 \ O_1,O_2 O1,O2两个相机的前面,深度都为正。
(2) P \ P P在 O 1 , O 2 \ O_1,O_2 O1,O2两个相机的后面,深度都为负。
(3) P \ P P在 O 1 \ O_1 O1相机的后面,深度为负;在 O 2 \ O_2 O2相机的前面,深度为正。
(4) P \ P P在 O 1 \ O_1 O1相机的前面,深度为正;在 O 2 \ O_2 O2相机的后面,深度为负。
假设一共有N个特征点,则列出如下线性方程组:
(1)用于单目SLAM的初始化
一开始,相机在运动时,只知道图像与图像之间的关系,只知道第一帧图像的特征点与第二帧图像的特征点之间的匹配关系,只能得到 2 D − 2 D \ 2D-2D 2D−2D之间的关系。
当初始化之后,可以得到 3 D \ 3D 3D的点。当知道这两帧图像之间相机的运动,并计算出图像中点的深度值,这样就有 3 D \ 3D 3D的点,之后使用 3 D − 2 D \ 3D-2D 3D−2D的 P n P \ PnP PnP算法求解。
(2)尺度不确定性:归一化或特征点的平均深度
一开始,
当初始化之后,
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' |
‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" |
“Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash |
– is en-dash, — is em-dash |
一个具有注脚的文本。1
Markdown将文本转换为 HTML。
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::
这将产生一个流程图。:
我们依旧会支持flowchart的流程图:
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎