OpenCV中的SURF(Speeded-Up Robust Features 加速鲁棒特征)
OpenCV中的SURF(加速健壮功能)
- 1. 效果图
- 2. 原理
- 2.1 为什么SURF比SIFT快?
- 2.3 怎样获取SIFT与SURF?
- 3. 源码
- 参考
上一篇博客介绍了用于关键点检测和描述的SIFT,但它相对较慢,这篇博客将介绍其优化版本——SURF(Speeded-Up Robust Features 加速鲁棒特征),它是加速版的SIFT;
- 在SIFT中,Lowe用高斯差分近似高斯的拉普拉斯算子来寻找尺度空间。
- SURF借助于积分图像,可以很容易地计算带盒滤波器的卷积。并行计算不同的尺度。此外,SURF还依赖于规模和位置的Hessian矩阵行列式。
- SURF增加了许多功能以提高每一步的速度。它比SIFT快3倍,而性能与SIFT相当。
- SURF擅长处理模糊和旋转的图像,但不擅长处理视点变化和照明变化。
1. 效果图
SURF默认参数效果图如下:
检查到的关键点比较多,把原图覆盖完了。
SURF调整阈值,检查到关键点近50个,效果图如下:
使用U-SURF不计算方向,方向全为一个,SURF关键点效果图如下:
默认以64D计算效果图如上,调整为128D,U-SURF效果图如下:基本没差别
2. 原理
OpenCV使用 SURF.detect()、SURF.compute()等来查找关键点和描述符。
2.1 为什么SURF比SIFT快?
- 在任何尺度下,利用积分图像都可以很容易地发现小波响应。
- 不考虑旋转不变形,因此不需要找到方向会加快过程。
- SURF提供了一种称为Upright-SURF或U-SURF的功能。它提高了速度,±15°之间非常健壮。
- OpenCV支持Upright-SURF、U-SURF,具体取决于标志。如果为0,则计算方向。如果为1,则不计算方向,速度更快。
- 维数越低,计算和匹配的速度越快,但特征的显著性越好。OpenCV通过分别为64 dim和128 dim设置扩展为0和1的标志值(默认值为128 dim)来支持这两种功能
- 另一个重要的改进是对潜在兴趣点使用拉普拉斯符号(Hessian矩阵的轨迹)。它不增加计算成本。拉普拉斯符号将黑暗背景上的明亮斑点与相反情况区分开来。
- 在匹配阶段,只比较具有相同对比度的特征(如下图所示)。这种最小的信息允许更快的匹配,而不会降低描述符的性能。
2.3 怎样获取SIFT与SURF?
https://stackoverflow.com/questions/64525121/sift-surf-set-opencv-enable-nonfree-cmake-solution-opencv-3-opencv-4
https://www.pianshen.com/article/8283162836/
SIFT、SURF是有专利的算法,在OpenCV3.0以上时已去除。移到了opencv-contrib-python版本中。所以有以下方法可以获取:
1)安装opencv3以下版本
2)卸载opencv3以上版本,opencv-contrib-python安装指定版本
3)安装opencv3以上版本,安装opencv-contrib-python,源码编译安装opencv;
综上方法2更方便可行,只需要俩步:
- 卸载opencv-python
- 安装指定版本opencv-contrib-python==3.4.2.17
pip uninstall opencv-pythonpip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python==3.4.2.17
可以看到成功了
3. 源码
# 寻找SURF关键点和描述符并绘制
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('images/butterfly.jpg', 0)# 创建SURF对象,可以在创建时指定参数也可以稍后设置参数
# 此处设置 Hessian阈值为 400
sift = cv2.xfeatures2d.SIFT_create()
print('sift: ', sift)
surf = cv2.xfeatures2d.SURF_create()
print('surf: ', surf,' \ndefaultParameter\thessianThreshold: ', surf.getHessianThreshold(),' upright: ', surf.getUpright(),' extended: ', surf.getExtended(),' descriptors: ',surf.descriptorSize())# 寻找SURF关键点和描述符
# kp:返回的关键点列表,des:numpy数组
kp, des = surf.detectAndCompute(img, None)
# 绘制关键点在图片上
img2 = cv2.drawKeypoints(img, kp, None, (255, 0, 0), 4)
plt.imshow(img2), plt.xticks([]), plt.yticks([]), plt.title('more keypoints'), plt.show()print('keypoints: ', len(kp))# 检查当前Hessian阈值
# print(surf.getHessianThreshold())# 调整Hessian阈值,此处设置为50000,但一般最佳设置为300~500
surf.setHessianThreshold(50000)
print(' parameters\thessianThreshold: ', surf.getHessianThreshold(),' upright: ', surf.getUpright(),' extended: ', surf.getExtended(),' descriptors: ',surf.descriptorSize())# 再一次计算关键点和描述符
kp, des = surf.detectAndCompute(img, None)print('keypoints: ', len(kp))# 绘制关键点在图片上
img2 = cv2.drawKeypoints(img, kp, None, (255, 0, 0), 4)plt.imshow(img2), plt.xticks([]), plt.yticks([]), plt.title('less than 50 keypoints'), plt.show()# U-SURF不会计算方向
# print(surf.getUpright())
surf.setUpright(True)
print(' parameters\thessianThreshold: ', surf.getHessianThreshold(),' upright: ', surf.getUpright(),' extended: ', surf.getExtended(),' descriptors: ',surf.descriptorSize())# 重新计算关键点和描述符,并绘制
kp = surf.detect(img, None)
print('keypoints: ', len(kp))
img2 = cv2.drawKeypoints(img, kp, None, (255, 0, 0), 4)plt.imshow(img2), plt.xticks([]), plt.yticks([]), plt.title('U-SURF'), plt.show()# 所有方向显示在同一方向,它比以前快多了。如果您正在处理方向不成问题的情况(如全景缝合)等,使用U-SURF会更好。
# 寻找描述符的大小
# print(surf.descriptorSize())
# extended为false,默认为64D
# print(surf.getExtended())# 设置描述符为128D
surf.setExtended(True)
print(' parameters\thessianThreshold: ', surf.getHessianThreshold(),' upright: ', surf.getUpright(),' extended: ', surf.getExtended(),' descriptors: ',surf.descriptorSize())kp, des = surf.detectAndCompute(img, None)
print('keypoints: ',len(kp))
img2 = cv2.drawKeypoints(img, kp, None, (255, 0, 0), 4)plt.imshow(img2), plt.xticks([]), plt.yticks([]), plt.title('128D res'), plt.show()
参考
OpenCV中的SURF(Speeded-Up Robust Features 加速鲁棒特征)相关推荐
- opencv34: SURF 加速鲁棒特征
目标 在这一章当中,将学习: SURF的基础 OpenCV中的SURF函数 理论 在上一章中,看到了SIFT用于关键点检测和描述符.但该算法比较相对缓慢,人们需要更多的加速版本. 2006年,H .T ...
- 图像特征提取算法:加速鲁棒特征SURF
1.原理: Sift算法的优点是特征稳定,对旋转.尺度变换.亮度保持不变性,对视角变换.噪声也有一定程度的稳定性:缺点是实时性不高,并且对于边缘光滑目标的特征点提取能力较弱. Surf(Speeded ...
- OpenCV中的快速特征检测——FAST(Features from Accelerated Segment Test)
OpenCV中的快速特征检测--FAST(Features from Accelerated Segment Test) 1. 效果图 2. 源码 参考 OpenCV中的尺度不变特征变换(SIFT S ...
- (四)OpenCV中的特征检测之BRIEF(二进制强大的独立基本特征)
注释:本文翻译自OpenCV3.0.0 document->OpenCV-Python Tutorials,包括对原文档种错误代码的纠正 1.概述 SIFT使用具有128个浮点数的特征描述符. ...
- 一种基于Matlab的快速鲁棒特征点(surf)的图像拼接技术
一.引言 快速鲁棒特征(Speeded-up robust feature,SURF)算法在图像匹配.模式识别.图像拼接等众多领域有着广泛的应用[1].有学者提出一种基于快速鲁棒特征(SURF)的眼底 ...
- 鲁棒优化(4):通过yalmip中的kkt命令实现CCG两阶段鲁棒优化
两阶段鲁棒优化的原理推导部分,已经较多的文章进行分析.目前大部分同学面临的问题是,子问题模型中存在的双线性项该如何处理? 目前,主流方式是,采用对偶定理或KKT条件,将第二阶段的双层问题变成单层问题. ...
- 解决OpenCV中SIFT,SURF不能使用,修改成ORB检测特征
我们知道因为一些专利的原因,SIFT和SURF不能再OpenCV后续的版本中继续使用.所以我们可以用OpenCV自带的其他检测器:Oriented FAST and Rotated BRIEF.引用官 ...
- OpenCV中的SURF特征检测、匹配与对象查找
SURF算法工作原理 选择图像中的POI(Points of interest) Hessian Matrix 在不同的尺度空间发现关键点,非最大信号压制 发现特征点方法.旋转不变性要求 生成特征向量 ...
- opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较
opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较 参考: http://wenku.baidu.com/link?url=1aDYAJBCrrK-uk2w3sSNai7h52x_ ...
最新文章
- HTML5 本地数据库IndexedDB数据库
- 教你怎么快速配置 React
- python基础:条件循环字符串
- 微服务下的容器部署和管理平台Rancher
- Android --- 自定义ImageView 实现圆形图片
- 华为收购港湾核心业务 6年恩怨尘埃落定
- iPhone13系列预计5499起;蔚来回应31岁企业家“自动驾驶”车祸去世;小米取消MIX4防丢失模式无卡联网服务|极客头条...
- TeeChart Pro VCL/FMX教程(三):图表分页
- HDU - 2084 数塔
- Json格式类的转换相关代码--转载
- OMG: daily scrum nine
- z-buffer的概念和算法
- 境外电商-香港汇丰银行基础知识
- token干什么用_什么是TOKEN?Token小号的理解运用,拼多多,知乎,快手,抖音的Token是什么意思...
- wordcloud:自定义背景图片,生成词云
- GEO数据库学习二(ID转换)
- 中国皮卡的解禁是个错误!!
- SEO——搜索引擎优化
- 学习笔记:测试抓包工具fiddler
- python创意编程培训 体会_省人工智能和创意编程教学研讨会学习心得
热门文章
- NVIDIA深度学习Tensor Core性能解析(上)
- 2021年大数据ELK(十一):Elasticsearch架构原理
- php-7.3.13 configure: error: Please reinstall the libzip distribution
- 前端面试题笔记 2021.8.26
- AttributeError: ‘tuple‘ object has no attribute ‘group‘
- Ubuntu 系统安装Visual Studio Code
- 为什么静态方法无法直接调用非静态成员变量和方法
- Android 自定义View —— Canvas
- error:socket failed: EPERM (Operation not permitted)
- error: No resource identifier found for attribute 'showAsAction' in package 'com.ymeng.项目名字'