【多视图几何】TUM 课程 第4章 同名点匹配

本文介绍了TUM课程第4章的内容,重点讲解了如何在两幅图像中匹配同名点,这是计算图像相对姿态的基础。文章涉及光流法、Lucas-Kanade方法以及特征点提取,并探讨了微小移动建模和长基线匹配的挑战。同时,提到了Harris角点检测和归一化互相关系数在长基线匹配中的应用。
摘要由CSDN通过智能技术生成

课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4。视频评论区可以找到课程所使用课件与练习题的下载地址。

课程第4章介绍了如何在两幅影像上匹配同名点,匹配同名点是计算影像相对姿态的第一步。用光流、特征点提取方法进行同名点匹配。

1. 从影像到几何

影像呈现的是色彩与亮度,但 MVG 使用匹配点或线进行三维重建,所以从影像的色彩信息中提取点或线是传统 MVG 的第一步。

为什么说是“传统 MVG ”呢?因为在以前计算资源匮乏的时代,只能通过稀疏的点与线进行三维重建。当今计算资源丰富,内存能够存储大量的信息,可以将影像的每一个像素存入内存参与计算,这种方式属于“直接法”,在课程的后半部分会讨论到。

从影像中提取同名点有存在两大挑战:1. 非刚体变化,影像中出现的非刚体在两张影像对应的两个时间点上一些特征点完全消失,无法匹配;2. 非朗博面,存在镜面反射,在不同角度观察空间位置上的同一个点存在着亮度相差特别大的问题。

在同名点匹配可以分为两种情形:
1. 微小移动,意味着基线短,两张影像中同名特征点之间的距离短,容易通过小窗口找到,同名点的寻找方向也基本一致;
2. 长基线,相机移动很大,左影像的特征点有可能在右影像的任何位置上。

对于短基线的情形,使用光流法(Optical Flow)进行特征点匹配,该方法是 Lucas 与 Kanade 于1981年提出的。

在两张影像上寻找同名点是在二维的影像平面上进行寻找,不涉及将特征点投影到三维空间进行寻找,因为这一步只是在一张影像上找到特征点,另一张影像上对应的点还没有找到,怎么投影嘛。。。

2. 微小移动建模

首先,对特征点的运动进行建模。

假设右影像相对左影像的位姿为 R,T ,于是对于左影像上一特征点(坐标为 x1 )和右影像上该特征点对应的坐标 x2 之间的关系为

x2=h(x1)=1λ2(X)(Rλ1(X)x1+T)

X 是特征点的三维坐标, λ1(X) 是特征点在左影像上的景深, λ2(X) 是特征点在右影像上的景深。

对这个公式进行简化,用较为简单的形式对 x1,x2 的这种关系建模。

位移模型:

h(x)=x+b

仿射变换模型:

h(x)=Ax+b

仿射变换模型也可以写成如下的形式

h(x)=x+u(x)

其中

u(x)=S(x)p=[x0y0100x0y01][p1p2p3p4p5p6]T

3. Lucas-Kanade 方法

Lucas-Kanade 方法建立在一个假设(assumption)之上,这个假设是“同一特征点在不同影像上保持亮度不变”。(当然在当下的语境下,应该是“色彩保持不变”,当时主要使用灰度影像嘛。)

该假设希望特征点对应的物体表示是朗博面,漫反射的成分远远大于镜面反射的成分,这样更容易达到在不同角度下拍摄亮度不变的条件。

在该假设的基础上建立数学模型。亮度保持假设的数学表达为:

I(x(t),t
要绘制TUM数据集中的多条轨迹,你可以按照以下步骤进行操作: 1. 首先,你需要安装Python的绘图库matplotlib。你可以通过运行以下命令来安装它: ``` pip install matplotlib ``` 2. 确保你已经获取了TUM数据集的轨迹数据。每条轨迹通常以一个文本文件的形式提供,其中包含时间戳、位置和姿态信息。 3. 在Python脚本中导入matplotlib库: ```python import matplotlib.pyplot as plt ``` 4. 读取每条轨迹的数据文件,并将其存储为一个列表。假设你有两条轨迹,分别为"trajectory1.txt"和"trajectory2.txt": ```python trajectory_files = ["trajectory1.txt", "trajectory2.txt"] trajectories = [] for file in trajectory_files: # 读取轨迹文件并解析数据 # 将数据存储为一个列表 # 根据数据格式进行解析,以下示例假设每行数据格式为"x y z" with open(file, 'r') as f: data = f.readlines() trajectory = [[float(value) for value in line.strip().split()] for line in data] trajectories.append(trajectory) ``` 5. 绘制每条轨迹的x、y坐标。假设x坐标在列表的第1列,y坐标在列表的第2列: ```python for trajectory in trajectories: x = [pose[0] for pose in trajectory] y = [pose[1] for pose in trajectory] plt.plot(x, y) ``` 6. 添加标题、坐标轴标签等图形元素,并显示绘制的轨迹: ```python plt.title("TUM Trajectories") plt.xlabel("X") plt.ylabel("Y") plt.grid(True) plt.legend(["Trajectory 1", "Trajectory 2"]) plt.show() ``` 这样就可以绘制出多条TUM数据集中的轨迹。你可以根据实际情况调整数据的解析方式和图形元素的设置。希望对你有帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值