orbslam特征点的计算和描述子的计算,汉明距离匹配

本文详细介绍了ORB(oriented fast and rotated brief)特征提取与匹配算法。包括如何使用FAST算法检测特征点,如何通过BRIEF算法计算描述子并解决旋转不变性问题,以及如何快速匹配特征点。

ORB特征是目前最优秀的特征提取与匹配算法之一,下面具体讲解一下:

 

特征点的检测


图像的特征点可以简单的理解为图像中比较显著显著的点,如轮廓点,较暗区域中的亮点,较亮区域中的暗点等。ORB采用FAST(features from accelerated segment test)算法来检测特征点。这个定义基于特征点周围的图像灰度值,检测候选特征点周围一圈的像素值,如果候选点周围领域内有足够多的像素点与该候选点的灰度值差别够大,则认为该候选点为一个特征点。


其中I(x)为圆周上任意一点的灰度,I(p)为圆心的灰度,Ed为灰度值差得阈值,如果N大于给定阈值,一般为周围圆圈点的四分之三,则认为p是一个特征点。
为了获得更快的结果,还采用了额外的加速办法。如果测试了候选点周围每隔90度角的4个点,应该至少有3个和候选点的灰度值差足够大,否则则不用再计算其他点,直接认为该候选点不是特征点。候选点周围的圆的选取半径是一个很重要的参数,这里为了简单高效,采用半径为3,共有16个周边像素需要比较。为了提高比较的效率,通常只使用N个周边像素来比较,也就是大家经常说的FAST-N。很多文献推荐FAST-9,作者的主页上有FAST-9、FAST-10、FAST-11、FAST-12,大家使用比较多的是FAST-9和FAST-12。

 


计算特征描述子


得到特征点后我们需要以某种方式描述这些特征点的属性。这些属性的输出我们称之为该特征点的描述子(Feature DescritorS).ORB采用BRIEF算法来计算一个特征点的描述子。
BRIEF算法的核心思想是在关键点P的周围以一定模式选取N个点对,把这N个点对的比较结果组合起来作为描述子。

 


步骤:
1.以关键点P为圆心,以d为半径做圆O。
2.在圆O内某一模式选取N个点对。这里为方便说明,N=4,实际应用中N可以取512.
假设当前选取的4个点对如上图所示分别标记为:


3.定义操作T

 


4.分别对已选取的点对进行T操作,将得到的结果进行组合。
假如:

 

则最终的描述子为:1011


理想的特征点描述子应该具备的属性:
在现实生活中,我们从不同的距离,不同的方向、角度,不同的光照条件下观察一个物体时,物体的大小,形状,明暗都会有所不同。但我们的大脑依然可以判断它是同一件物体。理想的特征描述子应该具备这些性质。即,在大小、方向、明暗不同的图像中,同一特征点应具有足够相似的描述子,称之为描述子的可复现性。
当以某种理想的方式分别计算描述子时,应该得出同样的结果。即描述子应该对光照(亮度)不敏感,具备尺度一致性(大小 ),旋转一致性(角度)等。
ORB并没有解决尺度一致性问题,在OpenCV的ORB实现中采用了图像金字塔来改善这方面的性能。ORB主要解决BRIEF描述子不具备旋转不变性的问题。

回顾一下BRIEF描述子的计算过程:
在当前关键点P周围以一定模式选取N个点对,组合这N个点对的T操作的结果就为最终的描述子。当我们选取点对的时候,是以当前关键点为原点,以水平方向为X轴,以垂直方向为Y轴建立坐标系。当图片发生旋转时,坐标系不变,同样的取点模式取出来的点却不一样,计算得到的描述子也不一样,这是不符合我们要求的。因此我们需要重新建立坐标系,使新的坐标系可以跟随图片的旋转而旋转。这样我们以相同的取点模式取出来的点将具有一致性。
打个比方,我有一个印章,上面刻着一些直线。用这个印章在一张图片上盖一个章子,图片上分处直线2头的点将被取出来。印章不变动的情况下,转动下图片,再盖一个章子,但这次取出来的点对就和之前的不一样。为了使2次取出来的点一样,我需要将章子也旋转同一个角度再盖章。(取点模式可以认为是章子上直线的分布情况)
ORB在计算BRIEF描述子时建立的坐标系是以关键点为圆心,以关键点和取点区域的形心的连线为X轴建立2维坐标系。

 


P为关键点。圆内为取点区域,每个小格子代表一个像素。现在我们把这块圆心区域看做一块木板,木板上每个点的质量等于其对应的像素值。根据积分学的知识我们可以求出这个密度不均匀木板的质心Q。计算公式如下。其中R为圆的半径。


我们知道圆心是固定的而且随着物体的旋转而旋转。当我们以PQ作为坐标轴时,在不同的旋转角度下,我们以同一取点模式取出来的点是一致的。这就解决了旋转一致性的问题。
BRIEF中,采用了9x9的高斯算子进行滤波,可以一定程度上解决噪声敏感问题,但一个滤波显然是不够的。ORB中提出,利用积分图像来解决:在31x31的窗口中,产生一对随机点后,以随机点为中心,取5x5的子窗口,比较两个子窗口内的像素和的大小进行二进制编码,而非仅仅由两个随机点决定二进制编码。(这一步可有积分图像完成)
特征点的匹配
ORB算法最大的特点就是计算速度快 。 这首先得益于使用FAST检测特征点,FAST的检测速度正如它的名字一样是出了名的快。再次是使用BRIEF算法计算描述子,该描述子特有的2进制串的表现形式不仅节约了存储空间,而且大大缩短了匹配的时间。
例如特征点A、B的描述子如下。
A:10101011
B:10101010
我们设定一个阈值,比如80%。当A和B的描述子的相似度大于90%时,我们判断A,B是相同的特征点,即这2个点匹配成功。在这个例子中A,B只有最后一位不同,相似度为87.5%,大于80%。则A和B是匹配的。
我们将A和B进行异或操作就可以轻松计算出A和B的相似度。而异或操作可以借组硬件完成,具有很高的效率,加快了匹配的速度。

汉明距离:


汉明距离是以理查德•卫斯里•汉明的名字命名的。在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如:
1011101 与 1001001 之间的汉明距离是 2。
2143896 与 2233796 之间的汉明距离是 3。
"toned" 与 "roses" 之间的汉明距离是 3。
给予两个任何的字码,10001001和10110001,即可决定有多少个相对位是不一样的。在此例中,有三个位不同。要决定有多少个位不同,只需将xor运算加诸于两个字码就可以,并在结果中计算有多个为1的位。例如:
10001001
Xor 10110001
00111000
两个字码中不同位值的数目称为汉明距离(Hamming distance) 。

<think>好的,用户想了解如何优化ORB-SLAM3中的特征点匹配效果。我需要先回顾ORB-SLAM3的基本原理,尤其是特征点匹配的部分。ORB特征本身是二进制描述子匹配速度快,但在低纹理或动态场景中可能效果不佳。 首先,用户提到的参考引用里,引用[1]提到了点线特征结合,这可能是一个方向。ORB-SLAM3主要用点特征,加入线特征可以增加鲁棒性。不过需要处理线特征的提取匹配,以及优化时的误差函数调整。 然后,引用[4]提到双目初始化时的立体匹配技巧,比如先粗匹配再精匹配。这可以应用到特征点匹配中,比如使用分层的匹配策略,或者改进描述子相似度度量方法,比如用汉明距离之外的方法,或者结合几何约束。 另外,特征点提取的参数调整也很重要,比如FAST角点的阈值、非极大值抑制的半径,这些会影响特征点的数量分布。更多的特征点可能提高匹配机会,但也会增加计算量,需要平衡。 还有,描述子的质量,比如使用深度学习方法训练更好的二进制描述子,但可能会影响实时性。或者改进ORB描述子的生成方式,比如在提取时考虑旋转不变性尺度不变性。 动态物体处理也是问题,比如使用语义分割剔除动态物体的特征点,这需要结合深度学习模型,但会增加系统复杂度。 参考引用[3]提到优化时的信息矩阵加权马氏距离,可能在匹配阶段加入更严格的几何校验,比如基础矩阵或本质矩阵的约束,使用RANSAC剔除误匹配。 另外,多模态数据融合,比如结合IMU或深度信息,可以提升匹配准确性,尤其在单目情况下。引用[4]中的双目初始化方法可能可以借鉴,利用立体信息进行更准确的匹配。 还有,地图管理部分,引用[2]提到地图管理对SLAM的重要性,维护高质量的地图点,可能在匹配时参考已有的地图点信息,进行更有效的投影匹配。 需要将这些方法分点整理,结合用户的引用内容,给出具体的优化技巧,比如改进描述子、几何校验、动态物体剔除、多特征融合等。同时注意回答结构清晰,引用对应的参考文献。</think>### ORB-SLAM3 特征点匹配优化方法 #### 1. **改进特征描述子质量** - **自适应阈值调整**:在提取ORB特征时,动态调整FAST角点检测的阈值,例如在低纹理区域降低阈值以提取更多特征点,在高纹理区域适当提高阈值减少冗余。结合高斯金字塔的多尺度特性增强尺度不变性[^2][^4]。 - **深度学习辅助描述子**:在保留ORB高效性的前提下,引入轻量级神经网络(如MobileNet)优化描述子生成,提升对光照变化视角变化的鲁棒性[^1]。 #### 2. **多模态几何约束** - **极线校验与RANSAC优化**:在匹配阶段增加对极几何约束,通过计算基础矩阵或本质矩阵过滤误匹配。例如: $$ \mathbf{x}_2^T \mathbf{F} \mathbf{x}_1 = 0 $$ 其中$\mathbf{F}$为基础矩阵,$\mathbf{x}_1$$\mathbf{x}_2$为匹配点对坐标。结合RANSAC迭代剔除异常值[^3]。 - **双目深度一致性校验**:在双目模式下,利用基线约束视差范围限制匹配搜索空间,减少误匹配。例如根据左目特征点坐标$(u_L,v)$,在右目仅搜索$[u_L - d_{\text{max}}, u_L - d_{\text{min}}]$范围内的候选点[^4]。 #### 3. **动态特征过滤** - **语义分割融合**:集成实时语义分割网络(如YOLO或DeepLab),识别动态物体(如行人、车辆)并剔除相关特征点,提升静态场景匹配精度[^1]。 - **运动一致性检验**:通过多帧运动估计,剔除与场景主流运动不一致的特征点(如卡方检验或光流残差分析)。 #### 4. **多特征融合策略** - **点线特征结合**:在ORB点特征基础上,增加线段特征(如LSD或EDLines检测器),利用线特征的几何约束增强匹配鲁棒性。例如: $$ \mathcal{L} = \sum \rho\left( \frac{\|\mathbf{e}_{\text{line}}\|^2}{\sigma_{\text{line}}^2} \right) + \sum \rho\left( \frac{\|\mathbf{e}_{\text{point}}\|^2}{\sigma_{\text{point}}^2} \right) $$ 其中$\rho$为鲁棒核函数,$\mathbf{e}_{\text{line}}$$\mathbf{e}_{\text{point}}$分别为线、点特征的重投影误差[^1]。 #### 5. **地图点质量维护** - **生命周期管理**:对地图点进行存活周期统计,定期剔除低观测次数或高重投影误差的地图点。维护时采用滑动窗口机制,平衡内存与精度需。 - **协方差传播优化**:在BA优化时,显式建模地图点的不确定性: $$ \mathbf{\Sigma}_i = \mathbf{J}_i \mathbf{\Sigma}_{\text{cam}} \mathbf{J}_i^T $$ 其中$\mathbf{J}_i$为投影雅可比矩阵,$\mathbf{\Sigma}_{\text{cam}}$为相机位姿协方差[^3]。 #### 6. **代码级优化示例 ```cpp // 改进的ORB匹配伪代码(增加极线约束) void FeatureMatcher::MatchWithEpipolarConstraint() { ComputeFundamentalMatrix(F); // 计算基础矩阵 for (auto &kp1 : keypoints1) { vector<cv::DMatch> candidates = FindCandidates(kp1); for (auto &m : candidates) { cv::Point2f pt1 = kp1.pt, pt2 = keypoints2[m.trainIdx].pt; if (abs(pt2.x*F[0]*pt1.x + ... ) < epipolar_threshold) { // 极线约束 refined_matches.push_back(m); } } } RANSACFilter(refined_matches); // RANSAC进一步过滤 } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值