视觉SLAM/opencv特征匹配相关函数

本文详细介绍了视觉SLAM中OpenCV的特征匹配流程,包括特征提取、描述子计算、匹配方法及筛选策略。通过具体函数如ORB、SURF的使用,以及DescriptorMatcher的匹配过程,为读者提供了深入理解视觉SLAM特征匹配的技术指南。

1、提取特征FeatureDetector

1.1用法:

Ptr<FeatureDetector> detecor = ORB::create();/Ptr<ORB> detecor = ORB::create();/Ptr<SURF> detector = SURF::create( minHessian );
vector<KeyPoint> keypoints_1;
detector->detect( img_1, keypoints_1);

1.2数据结构:

在这里插入图片描述

在这里插入图片描述

1.3其中的成员函数detect的数据结构

在这里插入图片描述

1.4其中ORB::Create函数的数据结构

    CV_WRAP static Ptr<ORB> create(int nfeatures=500, float scaleFactor=1.2f, int nlevels=8, int edgeThreshold=31,
        int firstLevel=0, int WTA_K=2, int scoreType=ORB::HARRIS_SCORE, int patchSize=31, int fastThreshold=20);

1.5 KeyPoint的数据结构

在这里插入图片描述

2、计算描述子DescriptorExtractor

2.1用法

Ptr<DescriptorExtractor> descriptor = ORB::create();
Mat descriptors_1;
descriptor->compute( img_1, keypoints_1,descriptors_1 );
//在descriptors_1中每一行roll储存一个对应的关键点的描述子

2.2数据结构

在这里插入图片描述

2.3其中子函数compute的数据结构

在这里插入图片描述
在这里插入图片描述

3、另一种方法:detectAndCompute函数

3.1用法

在这里插入图片描述

3.2数据结构

在这里插入图片描述

4、匹配DescriptorMatcher

4.1 用法

Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create( "BruteForce-Hamming" );
vector<Dmatch> match;
matcher->match(descriptors_1, descriptors_2, match);

4.2DMatch的数据结构

在这里插入图片描述


调用方式:match.distance,可以与double类型的数据比较

4.3、DescriptorMatcher的数据结构(部分)

class CV_EXPORTS_W DescriptorMatcher : public Algorithm
{
public:
   enum
    {
        FLANNBASED            = 1,
        BRUTEFORCE            = 2,
        BRUTEFORCE_L1         = 3,
        BRUTEFORCE_HAMMING    = 4,
        BRUTEFORCE_HAMMINGLUT = 5,
        BRUTEFORCE_SL2        = 6
    };

5、匹配筛选

保留距离小于max(30.0,2*最小距离)的匹配

6、关于FeatureDetector与DescriptorExtractor的说明

FeatureDetector与DescriptorExtractor都是cv::Feature2D的别名,所以两者是相同的,以上分开使用是为了能体现特征提取描述子计算的步骤,第一二步可以用下面的代码来替代

cv::Ptr<cv::Feature2D> feature = cv::ORB::create();
feature->detect( img_1, keypoints_1 );
feature->compute( img_1, keypoints_1, descriptors_1);
### 使用 OpenCV 实现视觉 SLAM 的方法 要通过 OpenCV 来实现视觉 SLAM,可以遵循以下思路: #### 1. **理解基础概念** 视觉 SLAM 是一种基于计算机视觉的技术,用于实时估计相机的姿态并构建环境地图。它通常分为三个主要模块:前端(Frontend)、后端(Backend)以及回环检测(Loop Closure)。这些模块共同协作完成定位与建图的任务。 对于初学者来说,可以从简单的单目视觉里程计入手学习[^2]。这有助于掌握基本原理后再逐步扩展到完整的 SLAM 系统。 #### 2. **依赖库准备** OpenCV 提供了许多图像处理功能,适合用来提取特征点、计算光流等操作。然而仅靠 OpenCV 并不足以支持整个 SLAM 流程中的优化部分;因此还需要引入其他工具或框架辅助完成非线性最小二乘法求解等工作。例如 g2o 或 ceres solver 可被应用于轨迹优化阶段[^1]。 #### 3. **具体实现步骤** 以下是使用 OpenCV 构建简易版单目 VO/VSLAM 的一些核心环节及其对应函数调用方式: - 特征检测与匹配 利用 SIFT/SURF/ORB 方法找到每帧图片内的兴趣点,并对其进行描述以便后续配对查找相同位置对象之间的关联关系。 ```cpp cv::Ptr<cv::FeatureDetector> detector = cv::ORB::create(); std::vector<cv::KeyPoint> keypoints; cv::Mat descriptors; detector->detectAndCompute(image, cv::noArray(), keypoints, descriptors); ``` - 基础矩阵估算 当前时刻拍摄所得画面同之前某一瞬间所记录下来的数据之间存在几何约束条件——即所谓的本质方程式(Epipolar Geometry),据此可推导出摄像机相对位移信息。 ```cpp std::vector<cv::Point2f> points1, points2; // ... populate point vectors ... cv::findFundamentalMat(points1, points2, CV_FM_RANSAC); ``` - 运动恢复结构(SFM)重建初步三维坐标系 结合两幅连续视图里的对应像素分布状况推测物体实际空间方位布局情形。 ```cpp cv::Mat E = findEssentialMat(...); recoverPose(E,...); ``` 以上仅为简化版本示意代码片段,在真实项目开发过程中还需考虑诸多细节问题比如噪声过滤、尺度不确定性补偿等方面因素影响最终效果质量高低程度差异较大情况下的适应能力提升措施等等内容均需深入探讨研究才行哦! --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值