今天要整理记录的是OpenCV中BRISK特征提取描述算法的运用。

BRISK特征提取描述算法全称为 Binary Robust Invariant Scalable Keypoints(二进制鲁棒不变可扩展关键点)。BRISK算法也是SIFT算法的一种改进型,主要是针对于旋转不变性、鲁棒性、运算速度等方面做了优化,其大致流程如下:

(1)在提取特征点阶段与SIFT算法类似(可参阅《OpenCV4学习笔记(38)》,同样是先构造多尺度图像金字塔,再从每一层图像组的多尺度空间中找到最大特征点(非极大值抑制);

(2)再通过亚像素插值得到最大特征点的精确坐标位置,也即把最大特征点从其它层的坐标映射到金字塔最底层的坐标位置,从而完成对最大特征点的定位。

(3)在描述特征点阶段,使用特征点邻域同心圆采样法,在每个特征点的邻域中选择一个同心圆,在这个同心圆上均匀采样,并对所有采样点进行高斯模糊以消除重复采样带来的影响,并以采样点中的短距离点对的灰度值比较结果,来构建二进制描述子(类似BRIEF特征二进制描述算法,可参阅《OpenCV4学习笔记(39)》)。

(4)再以每个特征点的方向特征、也就是梯度来进行方向归一化,强化了BRISK特征描述子的旋转不变性。

通过上述步骤即可得到BRISK特征的二进制描述子,总的来说BRISK特征算法是一种效果比较好的特征算法,主要优点在于它的检测速度,相比SIFT等特征算法而言要明显更快,可以用于实时处理中。

在OpenCV中同样封装好了BRISK算法的特征检测器,下面是调用BRISK算法的代码演示:

 Mat tem_image = imread("D:\\opencv_c++\\opencv_tutorial\\data\\images\\tem.jpg");Mat dected_image = imread("D:\\opencv_c++\\opencv_tutorial\\data\\images\\miao.jpg");resize(tem_image, tem_image, Size(160,120));resize(dected_image, dected_image, Size(600, 800));auto brisk = BRISK::create();vector<KeyPoint> keyPoints_tem, keyPoints_dected;Mat descriptors_tem, descriptors_dected;brisk->detectAndCompute(tem_image, Mat(), keyPoints_tem, descriptors_tem, false);brisk->detectAndCompute(dected_image, Mat(), keyPoints_dected, descriptors_dected, false);auto matcher = DescriptorMatcher::create(DescriptorMatcher::MatcherType::BRUTEFORCE);vector<DMatch> matches;matcher->match(descriptors_tem, descriptors_dected, matches);float maxdist = matches[0].distance;for (int i = 0; i < matches.size(); i++){if (maxdist < matches[i].distance){maxdist = matches[i].distance;}}float thresh = 0.45;vector<DMatch> good_Matches;vector<Point2f> temPoints, dectedPoints;for (int j = 0; j < matches.size(); j++){if (matches[j].distance < thresh * maxdist){good_Matches.push_back(matches[j]);temPoints.push_back(keyPoints_tem[matches[j].queryIdx].pt);dectedPoints.push_back(keyPoints_dected[matches[j].trainIdx].pt);}}if (0 == good_Matches.size()){cout << "不存在最佳匹配特征点" << endl;return 0;}Mat result;drawMatches(tem_image, keyPoints_tem, dected_image, keyPoints_dected, good_Matches, result, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);imshow("result", result);

演示效果如下图:

在运行BRISK算法和SIFT等算法对同一张图像进行特征点提取时,可以明显的感受到二者的速度差距,可以说BRISK是一种高速的特征点检测和特征描述子生成以及高速匹配的算法。

而且BRISK特征提取描述算法在很大程度上还保留了旋转不变性和尺度不变性,实现了较高检测质量的同时仍然具有较快的运行速度,有效降低了计算成本,更适合用于实时特征提取的工作中。

好的,今天的笔记整理到此结束,谢谢阅读。

PS:本人的注释比较杂,既有自己的心得体会也有网上查阅资料时摘抄下的知识内容,所以如有雷同,纯属我向前辈学习的致敬,如果有前辈觉得我的笔记内容侵犯了您的知识产权,请和我联系,我会将涉及到的博文内容删除,谢谢!

OpenCV4学习笔记(47)——BRISK特征提取描述算法相关推荐

  1. OpenCV4学习笔记(41)——ORB特征提取描述算法

    今天要整理记录的笔记内容是特征算法中比较常用的一种--ORB特征提取描述算法,顾名思义,ORB算法包含了对特征点的提取和描述这两个部分.而在上次的博文<OpenCV4学习笔记(39)>中, ...

  2. OpenCV4学习笔记(57)——基于GrabCut图像分割算法实现背景替换与背景虚化效果

    在上一篇笔记<OpenCV4学习笔记(56)>中,整理了关于在OpenCV中使用GrabCut图像分割算法的相关内容,那么本次笔记就以GrabCut算法为基础来实现对图像的背景替换和背景虚 ...

  3. OpenCV4学习笔记(55)——基于KNN最近邻算法实现鼠标手写数字识别

    在上一篇博客<OpenCV4学习笔记(54)>中,整理了关于KNN最近邻算法的一些相关内容和一个手写体数字识别的例子.但是上次所实现的手写体数字识别,每次只能固定地输入测试图像进行预测,而 ...

  4. 小猫爪:i.MX RT1050学习笔记15-FlexSPI-FLASH使用3-KEIL FLASH算法中的使用

    小猫爪:i.MX RT1050学习笔记15-FlexSPI-FLASH使用3-KEIL FLASH算法中的使用 1 前言 2 FLASH算法解析 2.1 初始化Init 2.2 写操作 END 1 前 ...

  5. OPENCV-4 学习笔记

    OPENCV-4 学习笔记 ROI-设定感兴趣的区域(region of interest) 定义: Mat imageROI; //方法一:通过Rect指定矩形区域 imageROI=image(R ...

  6. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记...

    机器学习实战(Machine Learning in Action)学习笔记----06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习 作者:米仓山下 时 ...

  7. 深度学习笔记(10) 优化算法(二)

    深度学习笔记(10) 优化算法(二) 1. Adam 优化算法 2. 学习率衰减 3. 局部最优的问题 1. Adam 优化算法 Adam代表的是 Adaptive Moment Estimation ...

  8. 深度学习笔记(9) 优化算法(一)

    深度学习笔记(9) 优化算法(一) 1. Mini-batch 梯度下降 2. 指数加权平均数 3. 动量梯度下降法 4. 均方根反向传播 1. Mini-batch 梯度下降 把训练样本放大巨大的矩 ...

  9. 【C++ Primer 学习笔记】: 容器和算法之【泛型算法】

    本系列博客主要是在学习 C++ Primer 时的一些总结和笔记. [C++ Primer 学习笔记]: 容器和算法之[泛型算法] 本文地址:http://blog.csdn.net/shanglia ...

最新文章

  1. 通过jsl工具将java程序注册为windows服务
  2. 通过apt自动生成建造者模式单线程版代码(三)
  3. 虚函数练习:交通工具信息
  4. VTK:Utilities之ViewportBorders
  5. B站up主用AI还原李焕英 动态影像
  6. python画函数图像要用到的模块_教你如何绘制数学函数图像——numpy和matplotlib的简单应用...
  7. 计算机d盘被拒绝访问了怎么办,如果硬盘分区被拒绝访问或无法访问该怎么办?...
  8. Spark Streaming的工作机制
  9. scikit-learn学习之贝叶斯分类算法
  10. 计算机辅助翻译与人工翻译论文,计算机辅助翻译:理念和工具[翻译研究新探论文献文集].pdf...
  11. 【转】Odoo开发之:工作流 workflow
  12. C#调用Matlab BP神经网络预测数据
  13. CentOS安装jre环境
  14. 容器技术之Kubernetes
  15. [办公自动化]名师推荐-excelpro刘万祥 图表之道作者
  16. 技术债务-坏味道、Bug、漏洞
  17. java课设心得体会2000字_java课程设计报告心得体会
  18. Error creating bean with name ‘user‘ defined in file //Pointcut is not well-formed: expecting
  19. 高效实用GitHub关键字搜索~~干货干货~~
  20. 栈的应用-数制转换(C语言数据结构)

热门文章

  1. 预处理 #pragma 命令详解
  2. 程序设计基础课程设计—位图图像文件缩放
  3. 杂文随笔 - 为什么你可以不读大学
  4. jQuery效果-自定义动画效果animate /王者荣耀手风琴效果案例
  5. 关于保险理赔业务中的退赔
  6. 计算机图形学期中考试题目及答案(仅供参考)
  7. TCP UDP面向连接是什么意思,面向无连接是什么意思
  8. 去掉字符串首尾指定的字符
  9. RSA加密常用的填充方式
  10. 锐捷路由策略(route-map)+前缀列表(prefix-list)基础实验