当前位置: 首页 > article >正文

对极几何方法——2D图片特征点估计运动

引入

对极约束
如图所示,在相邻两帧图片 I 1 , I 2 I_1,I_2 I1,I2中:

  • p 1 , p 2 p_1,p_2 p1,p2是两个匹配的特征点,
  • o 1 , o 2 o_1,o_2 o1,o2是两帧图片的光心,即小孔成像的小孔,
  • 连接 o 1 p 1 o_1p_1 o1p1 o 2 p 2 o_2p_2 o2p2,相交于现实中的点p。
  • 连接 o 1 o 2 o_1o_2 o1o2与两帧图片分别交于 e 1 , e 2 e_1,e_2 e1,e2
    显然, p , p 1 , o 1 , e 1 , e 2 , o 2 , p 2 p,p_1,o_1,e_1,e_2,o_2,p_2 p,p1,o1,e1,e2,o2,p2在同一平面,这个约束就是对极几何约束

对极几何约束

由针孔相机模型可知,对于第一帧照片:
z 1 [ u 1 v 1 1 ] = K ⋅ P z_1 \begin{bmatrix} u_1 \\ v_1 \\ 1 \end{bmatrix} =K \cdot P z1 u1v11 =KP
两帧之间相机有一个旋转R和平移t运动,则对于第二帧照片:
z 2 p 2 = K ( R P + t ) z_2p_2=K(RP+t) z2p2=K(RP+t)
p 2 = [ u 2 , v 2 , 1 ] T p_2=[u_2,v_2,1]^{T} p2=[u2,v2,1]T
则有:
{ z 1 K − 1 p 1 = P z 2 K − 1 p 2 = R P + t \left\{ \begin{aligned} &z_1K^{-1}p_1=P\\ &z_2K^{-1}p_2=RP+t \end{aligned} \right. {z1K1p1=Pz2K1p2=RP+t
K − 1 p 1 = x 1 , K − 1 p 2 = x 2 K^{-1}p_1=x_1,K^{-1}p_2=x_2 K1p1=x1,K1p2=x2则有:
{ z 1 x 1 = P z 2 x 2 = R P + t \left\{ \begin{aligned} &z_1x_1=P\\ &z_2x_2=RP+t \end{aligned} \right. {z1x1=Pz2x2=RP+t
解得:
z 2 x 2 = R ( z 1 x 1 ) + t z_2x_2=R(z_1x_1)+t z2x2=R(z1x1)+t
两边同时左乘 t ∧ t^{∧} t("∧"表示向量的正交矩阵,相当于叉乘)得:
z 2 t ∧ x 2 = z 1 t ∧ R x 1 z_2t^{∧}x_2=z_1t^{∧}Rx_1 z2tx2=z1tRx1
两边左乘 x 2 T x_2^{T} x2T得:
z 2 x 2 T t ∧ x 2 = z 1 x 2 T t ∧ R x 1 z_2x_2^{T}t^{∧}x_2=z_1x_2^{T}t^{∧}Rx_1 z2x2Ttx2=z1x2TtRx1
左式中 t ∧ x 2 t^{∧}x_2 tx2与t和 x 2 x_2 x2均垂直,故再与 x 2 x_2 x2点乘结果为0。因此:
0 = x 2 T t ∧ R x 1 0=x_2^{T}t^{∧}Rx_1 0=x2TtRx1
重新代入 p 1 , p 2 p_1,p_2 p1,p2有:
0 = ( K − 1 p 2 ) T t ∧ R K − 1 p 1 0=(K^{-1}p_2)^{T}t^{∧}RK^{-1}p_1 0=(K1p2)TtRK1p1
即:
0 = p 2 T K − T t ∧ R K − 1 p 1 0=p_2^{T}K^{-T}t^{∧}RK^{-1}p_1 0=p2TKTtRK1p1
这就是对极几何约束。它的几何意义是 o 1 , P , o 2 o_1,P,o_2 o1,P,o2三者共面。
我们把中间部分记作两个矩阵:基础矩阵(Fundamental Matrix)F和本质矩阵(Essential Matrix)E,于是可以进一步简化对极约束:
{ E = t ∧ R F = K − T E K − 1 0 = x 2 T E x 1 , 0 = p 2 T F p 1 \left\{ \begin{aligned} &E=t^{∧}R\\ &F=K^{-T}EK^{-1}\\ &0=x_2^{T}Ex_1,0=p_2^{T}Fp_1 \end{aligned} \right. E=tRF=KTEK10=x2TEx1,0=p2TFp1
于是,相机位姿估计问题变为以下两步:

  1. 根据配对点的像素位置求出E或者F。
  2. 根据E或F求出R,t。

由于E和F只相差了相机内参,而内参在SLAM中通常是已知的,所以实践中往往使用形式更简单的E。因此以E为例,介绍上面两个问题如何求解。

利用对极几何约束估计相机运动

E为3×3的矩阵,有9个未知数。为了便于计算只考虑它的尺度等价性(即矩阵同时除以其中一个未知数,可以使得这个未知数变成1,这样的E也是等价的,从而可以减少一个未知数),使用8对点来估计E——这就是经典的八点法(Eight-point-algorithm)。
考虑一对匹配点,它们的归一化坐标为x1=[u1,v1,1]T,x2=[u2,v2,1]T。根据对极约束,有:
在这里插入图片描述
把矩阵E展开,写成向量的形式:
在这里插入图片描述
那么,对极约束等价于(可以自己矩阵运算一下就明白了):
在这里插入图片描述
同理,对于其他点对也有相同的表示。我们把所有点都放到一个方程中,变成线性方程组:在这里插入图片描述

如果这八个点互不相关,即系数满秩,那么E的各元素就可由上述方程解得。
对E进行奇异值分解(SVD)即可求得R和t。
奇异值分解如果不明白可以参看其他资料,这里不多赘述了。
这个方法在opencv中有成熟的代码实现。如果大家感兴趣,我也会抽空把代码和注释附上。


http://www.kler.cn/a/538198.html

相关文章:

  • 使用PyCharm进行Django项目开发环境搭建
  • 【Java基础】为什么不支持多重继承?方法重载和方法重写之间区别、Exception 和 Error 区别?
  • 计算机视觉的研究方向、发展历程、发展前景介绍
  • deepseek API开发简介
  • C# Winform怎么设计串口,客户端和相机控件界面显示
  • .NET周刊【1月第4期 2025-01-26】
  • DeepSeek大模型本地部署实战
  • 【数据结构中链表常用的方法实现过程】
  • python基于深度学习的中文情感分析系统
  • AI安全最佳实践:AI应用开发安全评估矩阵(上)
  • Spring Boot:简化 Java 开发的利器
  • 24.ppt:小李-图书策划方案【1】
  • 通过C变成语言实现一个或多个算法
  • Redis数据库篇 -- Pipeline
  • 【0404】Postgres内核 实现分配一个新的 Object ID (OID)
  • Python如何实现名称为”000-“~“999-”文件的自动生成,且后缀名可以自定义
  • 基于SeaTunnel同步数据
  • 使用Jenkins实现鸿蒙HAR应用的自动化构建打包
  • COBOL语言的云计算
  • 基于HTML、CSS 和 JavaScript 开发个人读书类网站
  • uniapp中使用uCharts折线图X轴数据间隔显示
  • 基于python多线程多进程爬虫的maa作业站技能使用分析
  • Python----Python高级(网络编程:网络基础:发展历程,IP地址,MAC地址,域名,端口,子网掩码,网关,URL,DHCP,交换机)
  • 【爬虫开发】爬虫开发从0到1全知识教程第13篇:scrapy爬虫框架,介绍【附代码文档】
  • <tauri><rust><GUI>基于rust和tauri,在已有的前端框架上手动集成tauri示例
  • RabbitMQ 消息顺序性保证