我们要知道三维空间中的点在图像中的位置,就需要提取特征与特征匹配了。

1.检测特征点

2.计算描述子

3.特征匹配

1.检测特征点

  我们用到的检测特征点的方法是FAST算法,最大的特点就是快!

  算法原理:遍历图像,找到所有的角点。我们就拿一个角点举例,例如只拿到一个角点p,设其像素灰度值为I,取这个角点以三为半径的圆上的所有像素点,能取到16个,然后设定一个阈值t,如果连续n个像素点的灰度值都大于I+t或者都小于I-t。我们则认为其为特征点。接着计算方向:特征点与重心的角度。

2.计算描述子

  描述子我们可以理解为在每一个特征点旁边有一个向量,或者说也可以理解为数组,记录着特征点周围的信息。这里用的事BRIEF描述子。BRIEF描述子是一个二进制描述子,就是在特征点周围随机取128对点对或者是256对点对p和q,若p大于q,则记为1,否则记为0。这就组成了一个128个数的[0,1,1,0.....]序列。

3.特征匹配

  此时我们得到了所有的特征点和描述子。此时进行暴力匹配,对图1中的每一个特征点分别和图像2中的特征点的描述子比较,我们用Hamming距离来度量两个描述子的相似程度,如果Hamming距离小于两倍的最小距离则认为匹配正确,否则认为匹配错误。

代码如下:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp> using namespace std;
using namespace cv; int main ( int argc, char** argv )
{
if ( argc != )
{
cout<<"usage: feature_extraction img1 img2"<<endl;
return ;
}
//-- 读取图像
Mat img_1 = imread ( argv[], CV_LOAD_IMAGE_COLOR );
Mat img_2 = imread ( argv[], CV_LOAD_IMAGE_COLOR ); //-- 初始化
std::vector<KeyPoint> keypoints_1, keypoints_2;
Mat descriptors_1, descriptors_2;
Ptr<FeatureDetector> detector = ORB::create();
Ptr<DescriptorExtractor> descriptor = ORB::create();
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create ( "BruteForce-Hamming" ); //-- 第一步:检测 Oriented FAST 角点位置
detector->detect ( img_1,keypoints_1 );
detector->detect ( img_2,keypoints_2 ); //-- 第二步:根据角点位置计算 BRIEF 描述子
descriptor->compute ( img_1, keypoints_1, descriptors_1 );
descriptor->compute ( img_2, keypoints_2, descriptors_2 ); Mat outimg1;
drawKeypoints( img_1, keypoints_1, outimg1, Scalar::all(-), DrawMatchesFlags::DEFAULT );
imshow("ORB特征点",outimg1); //-- 第三步:对两幅图像中的BRIEF描述子进行匹配,使用 Hamming 距离
vector<DMatch> matches;//matches存储特征点信息
matcher->match ( descriptors_1, descriptors_2, matches ); //-- 第四步:匹配点对筛选
double min_dist=, max_dist=; //找出所有匹配之间的最小距离和最大距离, 即是最相似的和最不相似的两组点之间的距离
for ( int i = ; i < descriptors_1.rows; i++ )
{
double dist = matches[i].distance;
if ( dist < min_dist ) min_dist = dist;
if ( dist > max_dist ) max_dist = dist;
} printf ( "-- Max dist : %f \n", max_dist );
printf ( "-- Min dist : %f \n", min_dist ); //当描述子之间的距离大于两倍的最小距离时,即认为匹配有误.但有时候最小距离会非常小,设置一个经验值30作为下限.
std::vector< DMatch > good_matches;
for ( int i = ; i < descriptors_1.rows; i++ )
{
if ( matches[i].distance <= max ( *min_dist, 30.0 ) )
{
good_matches.push_back ( matches[i] );
}
} //-- 第五步:绘制匹配结果
Mat img_match;
Mat img_goodmatch;
drawMatches ( img_1, keypoints_1, img_2, keypoints_2, matches, img_match );
drawMatches ( img_1, keypoints_1, img_2, keypoints_2, good_matches, img_goodmatch );
imshow ( "所有匹配点对", img_match );
imshow ( "优化后匹配点对", img_goodmatch );
waitKey(); return ;
}

若有错误,欢迎指正!谢谢!

SLAM算法中提取特征总结的更多相关文章

  1. 使用DeepWalk从图中提取特征

    目录 数据的图示 不同类型的基于图的特征 节点属性 局部结构特征 节点嵌入 DeepWalk简介 在Python中实施DeepWalk以查找相似的Wikipedia页面 数据的图示 当你想到" ...

  2. SIFT算法中DoG特征点的修正

    SIFT算法中,在DoG空间找到极值点后,需要对极值点进行修正,本文主要详细的讲解一下为什么需要修正,以及如何对极值点进行修正. 下图演示了二维函数离散空间得到的极值点与连续空间的极值点之间的差别 利 ...

  3. 三维重建:SLAM算法的考题总结

    参考英文维基:https://en.wikipedia.org/wiki/Slam 参考文档:视觉slam研究分析的一点认识 1. 请简单描述您对机器人的SLAM的概念理解? 答: 机器人需要在自身位 ...

  4. 机器学习中的特征缩放(feature scaling)

    参考:https://blog.csdn.net/iterate7/article/details/78881562 在运用一些机器学习算法的时候不可避免地要对数据进行特征缩放(feature sca ...

  5. SLAM: Orb_SLAM中的ORB特征

    原文链接:什么是ORB 关于Orb特征的获取:参考 最新版的OpenCV中新增加的ORB特征的使用 ORB是是ORiented Brief 的简称,对Brief的特定性质进行了改进. ORB的描述在下 ...

  6. SEPC:使用3D卷积从FPN中提取尺度不变特征,涨点神器 | CVPR 2020

    论文提出PConv为对特征金字塔进行3D卷积,配合特定的iBN进行正则化,能够有效地融合尺度间的内在关系,另外,论文提出SEPC,使用可变形卷积来适应实际特征间对应的不规律性,保持尺度均衡.PConv ...

  7. TextRank:关键词提取算法中的PageRank

    很久以前,我用过TFIDF做过行业关键词提取.TFIDF仅仅从词的统计信息出发,而没有充分考虑词之间的语义信息.现在本文将介绍一种考虑了相邻词的语义关系.基于图排序的关键词提取算法TextRank [ ...

  8. 对比几种在ROS中常用的几种SLAM算法

    在此因为要总结写一个文档,所以查阅资料,将总结的内容记录下来,欢迎大家指正! 文章将介绍使用的基于机器人操作系统(ROS)框架工作的SLAM算法. 在ROS中提供的五种基于2D激光的SLAM算法分别是 ...

  9. 转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势

    SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为“同步定位与地图构建”,它主要用于解决机器人在未知环境运动时的 ...

随机推荐

  1. Windows 窗体

    Windows系统,顾名思义,就是窗口系统,每一个程序都可以用窗口来展示,所以,为了展示窗口,需要多做一系列的工作,当然,也有纯控制台应用,就不用附带窗口了. 首先就是窗口程序的入口地址,与传统的in ...

  2. 2018-2019-2 20175126谢文航 实验二《Java面向对象程序设计》实验报告

    一.实验报告封面 课程:Java程序设计 班级:1751 班 姓名:谢文航 学号:20175126 指导教师:娄嘉鹏 实验日期:2019年4月17日 实验时间:--- 实验序号:实验二 实验名称:Ja ...

  3. MTD的认识

    MTD即内存计数设备,是linux中对ROM.NORFLASH.NAND  Flash等存储设备抽象出来的一个设备层,它向上提供统一的访问接口:读写.擦除等:屏蔽了底层硬件的操作.各类存储设备的差别. ...

  4. centos 7.4安装zabbix 3

    1.安装前准备 1)关闭防火墙 systemctl status firewalld #查看防火墙状态 systemctl stop firewalld.service #停止firewall sys ...

  5. setTimeout与Promise的区别

    1,4,3,2 Promise是一个micro task  主线程是一个task  micro task queue会在task后面执行 setTimeout返回的函数是一个新的task macro ...

  6. SQL 数据库高CPU占用语句排查

    前述 最近一个项目CPU占用非常高,在IIS内设置CPU限制后系统频繁掉线,通过任务管理器发现SQLSever数据库占用CPU达到40%--70%,对于数据库本人也就处在增删查改几个操作水平层面,这次 ...

  7. 20175234 2018-2019-2 《Java程序设计》第七周学习总结

    目录 20175234 2018-2019-2 <Java程序设计>第七周学习总结 教材学习内容总结 String类常用用法 Date类与Calendar类常用用法 Math类的常用方法 ...

  8. linux-kernel-4.4 移植 (1)启动

    开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...

  9. Python开发——目录

    Python基础 Python开发——解释器安装 Python开发——基础 Python开发——变量 Python开发——[选择]语句 Python开发——[循环]语句 Python开发——数据类型[ ...

  10. oracle自带总页数分页sql

    string strSQL = string.Format(@"select * from( with temp as (select * from * where {0} order by ...