OpenCV3之——基于ORB的多特征融合算法改进

一、原始ORB算法

 1.原始FAST角点检测

 2、原始BRIEF特征点描述子

 

 3、O-FAST 角点检测 

        ORB 的特征点检测部分采用的是 FAST 算子,并在针对其不具备方向性这一缺点进行改进。FAST 算子以其角点提取准确、高效、快速性能,在并行追踪和视频拼接等实时性要求高的场合应用广泛。
 

 

 

4、 R-BRIEF 特征描述 

 

 

 

 

    OpenCV3代码示例:

#include<iostream>
#include<vector>

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/features2d/features2d.hpp>
using namespace std;
using namespace cv;

int main() {
	Mat reSize = Mat::zeros(640, 360,CV_8UC3);
	Mat srcImage1 = imread("2222.jpg");
	Mat srcImage2 = imread("1111.jpg");
	resize(srcImage1, srcImage1, reSize.size()*3/4);
	resize(srcImage2, srcImage2, reSize.size());


	//检测SIFT特征点并在图像中提取物体描述符
	//参数定义
	Ptr<ORB> orb = ORB::create();
	vector<KeyPoint> keyPoints1,keyPoints2;
	Mat description1, description2;
	orb->detectAndCompute(srcImage1, Mat(), keyPoints1, description1);
	orb->detectAndCompute(srcImage2, Mat(), keyPoints2, description2);

	//可视化,显示关键点
	Mat ShowKeyPoints1, ShowKeyPoints2;
	drawKeypoints(srcImage1, keyPoints1, ShowKeyPoints1);
	drawKeypoints(srcImage2, keyPoints2, ShowKeyPoints2);
	imshow("Keypoints1", ShowKeyPoints1);
	imshow("Keypoints2", ShowKeyPoints2);

	waitKey(0);

	//Matching
	vector<DMatch> matches;
	Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce");
	matcher->match(description1, description2, matches);

	cout << "find out total " << matches.size() << "matches" << endl;

	//可视化
	Mat ShowMatches;
	drawMatches(srcImage1, keyPoints1, srcImage2, keyPoints2, matches, ShowMatches);
	imshow("matches", ShowMatches);
	waitKey(0);

	return 0;
	
}

 运行结果:

 

 

 二、基于ORB的多特征融合算法改进

         1、简介:图像匹配作为图像处理的关键技术,已成为图像处理的研究热点。广泛应用于人脸识别、文本匹配、目标跟踪、图像拼接、目标识别等领域。SIFT算法[1]是Lowe在1999年正式提出的基于尺度空间的特征点检测方法,在2004年得到改进。SIFT算法在理论上具有完整的尺度不变性,对光照、噪声、旋转、缩放、遮挡、甚至仿射变换具有良好的抗干扰能力,是目前性能最好的算法之一。然而,基于尺度空间极值的特征点检测和基于梯度直方图的特征描述严重限制了SIFT特征提取的计算效率。基于梯度直方图特征描述生成的128维浮点特征向量使得特征匹配花费了大量的时间和内存。针对SIFT算法的不足,Rublee提出了ORB快速旋转匹配算法。ORB算法的效果与SIFT算法相似,计算速度比SIFT算法高出约100倍[2][3]。在特征点检测和描述中,ORB算法使用了快速(来自加速段测试的特征)算法[4]和简单(二进制鲁棒独立基本特征)算法[5][6]。ORB算法充分利用了这两种算法的实时性优势,提高了计算效率。同时,ORB算法对这两种算法进行了改进和优化,获得了旋转不变性和噪声抑制特性。在特征点描述中,ORB算法将特征向量从256字节减少到32字节,大大减少了计算量。在特征匹配中,ORB算法采用了基于二进制编码字符串的汉明距离匹配,比基于128维浮点特征向量的欧氏距离匹配快得多。但是如果直接使用ORB算法进行图像匹配,会出现图像分布不均匀、匹配不匹配程度高、匹配精度差的问题。高斯模糊滤波虽然在一定程度上缓解了这些问题,但会造成图像有用信息的丢失,对结果的准确性造成不利影响。为了提高ORB算法的匹配精度,对ORB算法的步骤进行了改进。在特征点检测中,采用多尺度快速角点检测算法,找出具有尺度不变性的特征点。在特征描述中,提取特征点的闩锁特征[7]和改进的LBP特征[8],将这两个特征串联,形成一个新的二进制闩锁/LBP特征向量。然后,结合重心法,改进的闩锁/LBP特征可以获得较强的鲁棒性。

         2、特征检测:在特征点检测中,ORB算法采用多尺度快速角点检测算法提取特征点。快速角点检测算法的原理是计算选取的像素在其邻域有足够像素的像素值差。当像素值差大于某一阈值时,将所选像素视为特征点。ORB算法使用性能最好的FAST-9算法(半径为9像素)。如图所示,通过选取的像素点和周围的16个像素点[4]计算出16个像素点的差值。如果这16个差值中有9个超过了某个阈值,则认为所选像素点为特征点。

       快速算法对尺度变化敏感,无法获得特征描述所需要的局部区域的主要方向分量。因此,球体采用重心法来测量特征点的方向。重心法假设点的灰度强度与其中心偏移,该向量可用于估算方向[9]。以一个特征点p为中心的patch S的矩定义为:

 其中f(x, y)为点(x, y)的灰度值,p, q确定灰度矩阶。patch S质心C的坐标如下:

ORB构造一个向量OC,从特征点p的中心到质心C。特征点p与质心C连线与横坐标之间的角度定义为快速特征点的方向 :

         3、LATCH 特征描述: 算法在原有的局部二进制描述的基础上,将两个像素点的比较改为三个像素块,从而提高了局部二进制描述符的准确性。首先选取一定尺寸的图像窗口W,检测到的特征点为中心。在检测窗口W中设置有序样本坐标集合如下:

 其中分别为图像窗口W中所选样本点的坐标。

每个像素对齐的二进制结果可以由以下公式得到:

 其中分别为经过高斯滤波后的图像窗口W的采样点, 的值。

根据公式(5),通过比较窗口W中的所有像素对,最终形成特征点的二进制字符串W b,定义如下:

        这种简单的像素值直接比较方法对噪声和图像局部变化非常敏感。针对这一缺陷,将三像素块的比较方法应用到锁存器算法中,在一定程度上解决了噪声的影响,提高了匹配精度。

        首先选取一定尺寸的图像窗口W,检测到的特征点为中心。然后在图像窗口W中定义T样本,每个样本包含三个像素块。窗口中设置的像素块如下:

 其中分别为三个像素块中心点的坐标。

然后计算像素块之间的F范数来评估相似度。二进制串中对应位的值由下式确定:

 其中是主要的像素块,是它的伴随像素块。

根据式(8),通过对窗口W中的三个像素块样本进行比较,最终形成特征点的二进制字符串W b,定义如下:

 4、LBP 特征描述:LBP特征描述是描述纹理特征的一种有效方法,可用于测量和提取局部相邻区域的纹理信息。近几十年来,LBP特征描述[8]在纹理分类、图像检索、人脸图像分析等领域得到了广泛的应用。原始LBP算法的原理如图2所示。首先,在图像的每个像素周围定义一个3x3的局部图像窗口。然后将局部图像窗口中每个像素的灰度值与中心像素的灰度值进行比较。如果像素的灰度值小于中心像素的灰度值,则对应的位置为0,反之为1。图像中的每个像素都可以得到一个二进制编码字符串,并将二进制编码字符串转换为十进制数,那么十进制数就是像素的LBP码。图像中所有像素的LBP代码的直方图作为图像的LBP特征。

 

                                                                                      纠注:顺时针读出bit:

 LBP特征描述符的定义定义如下:

 其中N R分别是当地的像素数量和大小的地方形象窗口,N t是当地图像像素的灰度值,c t是中心像素的灰度值,s(x)是灰度值的函数,量化本地图像像素与中心像素之间的关系。

 

改进的LBP(局部二进制模式)算法:与传统的特征描述算法相比,LBP特征描述算法具有特征提取准确、光照精细、不变性等优点。但也存在一些不足,LBP特征对图像中的噪声太敏感。为了解决这一问题,本文采用图像块的方法,用图像块代替像素生成LBP特征描述。

在生成闩锁特征描述符时,我们使用48*48像素大小的特征点邻域窗口,所以我们也使用48*48像素大小的图像窗口来生成特征点的LBP描述符。如图3所示,围绕feature point的48*48像素大小的图像窗口被划分为4*4个主块,每个主块大小为12*12像素。然后将每个主块进一步划分为3*3个二级块,每个二级块大小为4*4像素。以尽量减少对噪音的敏感性,LBP特征描述是用二次块而不是像素点生成的。首先计算每个次要块的灰度均值,然后根据次要块的灰度均值计算每个主要块的LBP特征描述符。最后,通过对所有主块的LBP描述的串联,形成特征点的改进LBP特征描述符。

5、特征融合: 在特征描述符的生成过程中,采用灰度质心法对特征点周围的固定尺寸图像块进行旋转。然后提取特征点的闩锁描述符和改进的LBP描述符。然后连接锁存器和改进的LBP来生成新的描述符,闩锁/LBP描述符。

         特征融合的过程如图4所示。参考[7]中的闩锁描述采用48*48像素大小提取窗口和7*7像素大小块。尺寸的选择兼顾了计算和精度。闩锁描述是一个256位的二进制字符串。在特征点周围的48*48像素大小的邻域窗口中,根据每个次要块的灰度均值,我们可以将每个主要块的LBP特征计算为8位二进制字符串。然后,将特征点邻域窗口中的所有8位二进制字符串串联起来,形成一个新的128位二进制字符串,作为特征点的改进LBP特征。在特征融合中,256位闩锁特征和128位改进的LBP特征串联起来,生成一个新的384位二进制字符串作为特征点的闩锁/LBP描述符。

5、特征匹配:由于本文的描述符是一个二进制字符串,因此可以使用汉明距离来评估描述符的相似性,计算起来非常有效。建立匹配可以理解为将点对分类为匹配或不匹配,这取决于汉明距离[5]的值。利用改进的ORB算法提取两个图像的特征点和描述符,找到两个关键点之间的最短距离和第二最短距离。当两个汉明距离的比值小于0.8,汉明距离小于50时,认为这两个关键点是匹配的。

在前一节中,获得了384位二进制锁存/LBP描述符,假设K1、K2是两个描述符:

两个描述符的相似性用汉明距离是两个描述符的所有位的XOR之和。定义为:

 较小的 D(K1, K2) r代表较高的相似度,较大的D(K1, K2)代表较低的相似度。

6、实验结果与分析:

 

 

 

 

7、总结:多特征融合解决了大误差和高不匹配的问题。首先,在原有的二进制描述的基础上,利用闩锁特征描述将两个像素点的比较改为三个像素块的比较,提高了二进制描述的准确性。其次,通过将图像分割成块,提高了LBP算法的抗噪声能力。最后,利用多特征融合方法,将这两个特征描述符有效地结合起来,生成一个新的特征描述符作为闩锁/LBP描述符。实验结果表明,与基于统计直方图的特征描述方法相比,本文提出的改进ORB算法大大缩短了计算时间。同时,与传统的二进制字符描述方法相比,本文提出的改进ORB算法可以有效提高匹配精度,减少误匹配,从而有效提高原始ORB匹配性能。 

 

三、参考文献:(论文标题)

【1】An Improved ORB Algorithm Based on Multi-feature Fusion

【2】 基于 ORB 算法的双目视觉测量与跟踪研究 
 

<think>嗯,用户让我介绍一下如何复现ORB-SLAM3,或者介绍一下这个系统。首先,我需要确定他们的需求是什么。他们可能是一个研究者,或者是做项目的学生,想要在自己的环境中运行ORB-SLAM3,或者了解其原理以便改进或应用。 ORB-SLAM3是一个比较复杂的SLAM系统,支持单目、双目和RGB-D相机,还有惯性传感器。复现它可能涉及到多个步骤,比如环境配置、依赖安装、数据集准备、编译运行,以及可能的调试。用户可能已经有一定的SLAM基础,但需要具体的指导步骤。 首先,我应该先简要介绍ORB-SLAM3的主要特点,这样用户能有一个整体认识。然后分步骤说明复现的流程。可能需要提到系统要求,比如Ubuntu版本,ROS是否必要,依赖库如OpenCV、Eigen、Pangolin等。然后从源码下载开始,编译步骤,数据集下载,运行示例,以及可能遇到的问题。 另外,用户可能遇到的常见问题,比如依赖版本不兼容,编译错误,或者数据集路径设置不正确。这时候需要给出一些提示,比如检查CMakeLists中的路径,确保所有依赖正确安装,或者推荐使用Docker镜像来避免环境问题。 还需要考虑用户的应用场景,如果他们是想在自己的数据上运行,可能需要说明如何修改代码适配新的传感器或数据格式。但如果是初次接触,可能更关注如何成功运行官方示例。 另外,是否要比较ORB-SLAM3和其他SLAM系统的区别?可能用户对此也有兴趣,但问题主要集中在复现步骤,所以可能暂时不需要深入比较。 需要确保步骤清晰,分点列出,语言简洁。例如,分环境准备、安装依赖、下载源码、编译、运行测试等步骤。同时,给出官方GitHub链接,方便用户直接访问。 可能用户在实际操作中会遇到问题,比如Pangolin的安装错误,或者OpenCV版本问题。这时候可以建议查看issue部分,或者社区讨论。另外,推荐使用Docker可能是一个好的补充,尤其是对于环境配置不熟悉的用户。 总之,回答需要结构清晰,步骤详细,同时预见到用户可能遇到的问题并提供解决方案。此外,强调官方文档的重要性,因为这是最准确的资源。最后,如果有余力的话,可以简要介绍ORB-SLAM3算法框架,比如特征提取、地图构建、回环检测等,但主要重点还是复现步骤。</think>以下是关于复现 **ORB-SLAM3** 的详细介绍和步骤指南: --- ### **1. ORB-SLAM3 简介** ORB-SLAM3 是西班牙萨拉戈萨大学团队开发的视觉 SLAM 系统,支持 **单目、双目、RGB-D 相机** 以及 **惯性传感器(IMU)**。其核心特点包括: - **多传感器融合**:支持纯视觉、视觉-惯性融合的 SLAM。 - **多地图系统**:长期运行的鲁棒性,支持场景重识别和地图重用。 - **高效特征提取**:基于 ORB 特征,兼顾速度与精度。 - **开源**:代码公开于 GitHub,依赖主流库(如 OpenCV、Eigen 等)。 --- ### **2. 复现环境准备** #### **系统要求** - **操作系统**:推荐 Ubuntu 18.04/20.04(官方测试环境)。 - **依赖库**: - **C++11** 编译器(如 gcc 9+) - **OpenCV**(3.4+ 或 4.x,需与代码版本匹配) - **Eigen3**(线性代数库) - **ROS**(可选,如需实时摄像头输入) #### **安装依赖** ```bash # 基础工具 sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config # Eigen3 sudo apt-get install libeigen3-dev # OpenCV(若未安装,推荐 OpenCV 4.5+) sudo apt-get install libopencv-dev # Pangolin git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin && mkdir build && cd build cmake .. && make -j4 sudo make install ``` --- ### **3. 获取 ORB-SLAM3 源码** 从官方仓库克隆代码: ```bash git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git cd ORB_SLAM3 ``` -- ### **4. 编译与安装** #### **编译步骤** ```bash # 进入代码目录 chmod +x build.sh ./build.sh # 编译主程序 # (可选)编译 ROS 接口 export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:$(pwd)/Examples/ROS chmod +x build_ros.sh ./build_ros.sh ``` #### **常见问题** - **依赖版本冲突**:确保 OpenCV 版本与代码兼容(如 ORB-SLAM3 默认配置可能需要修改 `CMakeLists.txt`)。 - **Pangolin 安装失败**:检查是否安装了 GLUT、Glew 等依赖。 --- ### **5. 运行示例** #### **数据集准备** - **EuRoC MAV Dataset**(视觉-惯性数据集):[下载链接](https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets) - **KITTI**(双目数据集):[下载链接](http://www.cvlibs.net/datasets/kitti/eval_odometry.php) - **TUM RGB-D**:[下载链接](https://vision.in.tum.de/data/datasets/rgbd-dataset) #### **运行命令示例** ```bash # 单目示例(EuRoC数据集) ./Examples/Monocular/mono_euroc \ Vocabulary/ORBvoc.txt \ Examples/Monocular/EuRoC.yaml \ PATH_TO_DATASET_FOLDER/MH_01_easy \ Examples/Monocular/EuRoC_TimeStamps/MH01.txt # 双目+IMU 示例 ./Examples/Stereo-Inertial/stereo_inertial_euroc \ Vocabulary/ORBvoc.txt \ Examples/Stereo-Inertial/EuRoC.yaml \ PATH_TO_DATASET_FOLDER/MH_01_easy \ Examples/Stereo-Inertial/EuRoC_TimeStamps/MH01.txt ``` --- ### **6. 复现关键点** 1. **参数配置**:根据传感器类型调整配置文件(如 `EuRoC.yaml`)。 2. **时间同步**:IMU 与图像数据需严格时间对齐。 3. **特征匹配优化**:ORB 特征的提取和匹配是系统实时性的关键。 4. **回环检测**:DBoW2 词袋模型用于场景重识别。 --- ### **7. 调试与优化** - **可视化工具**:使用 Pangolin 观察轨迹和地图点。 - **性能分析**:通过 `--timing` 参数输出各模块耗时。 - **代码修改**:建议从 `Examples` 目录下的示例入手,逐步深入核心算法。 --- ### **8. 参考资源** - **官方 GitHub**:https://github.com/UZ-SLAMLab/ORB_SLAM3 - **论文**:["ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM"](https://arxiv.org/abs/2007.11898) - **社区支持**:GitHub Issues 和 ROS 论坛。 --- 通过以上步骤,你可以成功复现 ORB-SLAM3 并运行官方示例。如需适配自己的传感器或数据集,需进一步修改参数和接口。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

衣带渐宽人憔悴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值