SIFT特征和SURF特征都是优秀的尺度不变特征,常用来进行物体辨识和图像匹配。所谓的尺度不变特征是指每个检测到的特征点都伴随着对应的尺寸因子(特征点的局部尺寸参数与特征的尺度成正比),下面就这两种著名的尺度不变特征进行简要的介绍和比较。(PS:由于两种特征提取算法的细节较多,本篇文章只简单介绍它们的原理、主要步骤和简单应用,主要关注两者的比较)
SIFT(Scale-Invariant Feature Transform)特征,即尺度不变特征变换,是一种计算机视觉的特征提取算法,用来侦测与描述图像中的局部性特征。它在尺度空间中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。
OpenCV2中有一个封装类用于检测SIFT特征,其简要应用代码如下:
//特征点的向量
std::vector<cv::KeyPoint> keypoints;
//构造SIFT特征检测器
cv::SiftFeatureDetector sift(
0.03, //特征的阈值
10.) //用于降低直线敏感度的阈值
//检测SIFT特征值
sift.detect(image,keypoints);
更多详细介绍可以参考以下链接:
1.尺度不变特征变换中文维基百科(如访问不了请用VPN访问)
2.SIFT算法详解
SURF(Speeded Up Robust Features, 加速稳健特征) 是一种稳健的图像识别和描述算法。它是SIFT的高效变种,也是提取尺度不变特征,算法步骤与SIFT算法大致相同,但采用的方法不一样,要比SIFT算法更高效(正如其名)。SURF使用海森(Hesseian)矩阵的行列式值作特征点检测并用积分图加速运算;SURF 的描述子基于 2D 离散小波变换响应并且有效地利用了积分图。
OpenCV2中也有一个封装类用于检测SURF特征,其简要应用代码如下:
//特征点的向量
std::vector<cv::KeyPoint> keypoints;
//构造SURF特征检测器
cv::SurfFeatureDetector surf(
2500.) //阈值
//检测SURF特征值
surf.detect(image,keypoints);
更多详细介绍和应用可以参考以下链接:
1.加速稳健特征中文维基百科
2.浅墨的博客专栏 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
比较项目 | SIFT | SURF |
---|---|---|
尺度空间极值检测 | 使用高斯滤波器,根据不同尺度的高斯差(DOG)图像寻找局部极值 | 使用方形滤波器,利用海森矩阵的行列式值检测极值,并利用积分图加速运算 |
关键点定位 | 通过邻近信息插补来定位 | 与SIFT类似 |
方向定位 | 通过计算关键点局部邻域的方向直方图,寻找直方图中最大值的方向作为关键点的主方向 | 通过计算特征点周围像素点x,y方向的哈尔小波变换,将x、y方向小波变换的和向量的最大值作为特征点方向 |
特征描述子 | 是关键点邻域高斯图像梯度方向直方图统计结果的一种表示,是16*8=128维向量 | 是关键点邻域2D离散小波变换响应的一种表示,是16*4=64维向量 |
应用中的主要区别 | 通常在搜索正确的特征时更加精确,当然也更加耗时 | 描述子大部分基于强度的差值,计算更快捷 |
1、客户端 unity 发送post请求IEnumerator Post(){string url = "http://localhost/tp/public/api/v1/test";//header dataDictionary header = new Dictionary();header["Content-Type"] = "application/json";header["chars...
---------------------- android培训、java培训、期待与您交流! ----------------------===================第1单元:概述 ======================01.课程价值与目标介绍===============第2单元:eclipse开发工具================02.eclipse
Java程序设计项目教程——String类对象的常用方法
022-云E办_全局异常处理前言:一、介绍:1、SpringBoot全局异常处理方式主要两种:2、区别:二、代码实现:三、再次测试:全局异常捕获:前言:当删除操作时,正常删除时,就会正常删除。当删除某个字段,与其他字段关联的数据时,就会报错。无法删除或更新父行:外键约束失败(yeb.t_employee,约束t_employeeU ibfk_3外键(posId)在删除时引用t_position(id`)在更新时限制)报错信息对于程序员而言,可以帮助定位问题,如果将给用户看的话,用户是看不懂这个报
西门子博途_S7-1200通过脉冲方式控制步进电机时,限位开关的高电平、低电平如何选择?
肖特基二极管是生产电子产品不可或缺的重要保护器件,尤其在便携式电子产品及开关电源中应用广泛,深受电子行业的喜爱,可是在肖特基二极管市场,如何才能挑选到合适自己产品的肖特基二极管那,这对于一些刚入电子行业的采购人员来讲,确实很头疼,可能一不下心就会踏入误区,看完下文,相信你会有醍醐灌顶的感觉。一、肖特基二极管定义:肖特基二极管是以其发明人肖特基博士(Schottky)命名的,SBD是肖特基...
需求系统遇到这样一个需求,线上环境在配置文件发生变动时,可以不用经过重启,通过刷新接口的方式得到配置文件的加载,主要目的是为了迅速部署,避免因手动重启,处理不及时导致积压的问题问题1.程序中如何获取修改后的配置2.某些配置值是应用在bean里面的,在程序初始化的时候已经注入,如何修改这一部分。例如,程序是分主备环境的,kafka consumer的groupid或topic根据环境不同而改变,那么consumer若写在bean中,修改配置文件,要一并更新到bean中//示例代码,KafkaCon
一:环境配置参数1.下载支付宝官方提供的支付demo,https://docs.open.alipay.com/270/106291/我们下载java版本然后解压就可以看到项目结构:红色框里面,是需要我们去支付宝开发平台去申请配置的信息:免费注册蚂蚁金服开发者账号:注册地址:https://developers.alipay.com/developmentAccess/developmentAccess.htm申请步骤:用支付宝账号申请注册获得appId[配置文件必要]此处私
最近开发需要用到复制文本内容,这是最详细的解释了吧转载: https://www.cnblogs.com/dodocie/p/7210253.html 在官网看到以下代码,原生JS把input输入的内容复制到剪贴板&lt;p&gt;点击复制后在右边textarea CTRL+V看一下&lt;/p&gt;&lt;input type="text" id="inputText"...
前面简单介绍过Neutron消息中间件RabbitMQ的用法。学习过的人,相信对RabbitMQ不会再有陌生感。接下来将会继续介绍Neutron中消息通信模块oslo.messaging。它是OpenStack公共库oslo中的一个组件,封装了RPC调用,为RPC和事件通知提供了一套统一的接口。使用过OpenStack的人都知道,目前原生OpenStack底层MQ驱动默认是kombu。那么为什么OpenStack又在此基础上做了一层封装?在编程领域,一个显而易见的原因是减少模板代码和对底层驱动提供更加灵
2019独角兽企业重金招聘Python工程师标准>>> ...
1、puts函数说明函数功能这个函数很简单,只有一个参数。s可以是字符指针变量名、字符数组名,或者直接是一个字符串常量。功能是将字符串输出到屏幕。输出时只有遇到 ‘\0’ 也就是字符串结束标志符才会停止。函数原型# include <stdio.h>int puts(const char *s);函数应用# include <stdio.h>#include <stdlib.h>int main(void){ char name[]