OpenCV入门12.2:SURF与SIFT比较及SURF示例

news/2024/9/14 9:19:56/ 标签: opencv, 计算机视觉

SIFT (Scale-Invariant Feature Transform):

  • 提出时间: 1999年,由David Lowe提出。
  • 关键特点: 能够检测和描述图像中的关键点,这些关键点对旋转、缩放和部分亮度变化具有不变性。
  • 计算复杂度: 相对较高,因为SIFT使用了高斯差分核来检测关键点,并且需要在多个尺度空间进行操作。
  • 应用: 广泛用于图像匹配、物体识别和3D重建。

SURF (Speeded-Up Robust Features):

  • 提出时间: 2006年,由Hervé Bay等人提出。
  • 关键特点: 作为SIFT的改进版本,SURF在保持特征点不变性的同时,显著提高了计算速度。
  • 计算复杂度: 较低,SUR2算法通过使用积分图像和快速Hessian矩阵来加速关键点的检测。
  • 应用: 类似于SIFT,SURF也用于图像匹配、物体识别等,但更适合实时或资源受限的应用场景。

特征点检测:积分图像和快速Hessian矩阵计算

积分图像:

  • 积分图像是一种数据结构,用于快速计算图像的局部区域的像素和。
  • 它通过预先计算并存储每个像素点的邻域像素和,从而加速了特征点检测过程中的积分操作。

快速Hessian矩阵:

  • Hessian矩阵是一个二阶导数矩阵,用于衡量图像亮度变化的局部曲率。
  • 在SURF中,快速Hessian矩阵的计算是通过积分图像来实现的,从而避免了在每个尺度空间中重复计算梯度。

SURF的关键点检测步骤:

  1. 使用高斯滤波器对原始图像进行平滑处理。
  2. 计算每个像素点的积分图像,以便快速获取局部区域的像素和。
  3. 使用快速Hessian矩阵在不同尺度和方向上检测关键点。
  4. 对检测到的关键点进行非极大值抑制,以选择最显著的关键点。

特征描述:特征点的方向赋值和描述子生成

方向赋值:

  • 特征点的方向赋值是指为每个关键点分配一个主方向,这有助于描述子的旋转不变性。
  • 在SURF中,通过计算关键点邻域内的梯度方向直方图来确定主方向。
  • 主方向是直方图中具有最高响应的方向。

描述子生成:

  • 描述子是关键点的局部特征的量化表示,用于图像匹配和识别。
  • SURF描述子是通过在关键点周围的邻域内计算梯度的幅度和方向的直方图来生成的。
  • 描述子通常是一个固定长度的向量,包含了关键点邻域内不同方向和尺度上的特征信息。

SURF描述子的特点:

  • 旋转不变性:由于关键点的方向赋值,描述子对图像的旋转具有不变性。
  • 尺度不变性:描述子在关键点检测时已经考虑了尺度变化。
  • 部分亮度不变性:描述子对图像的亮度变化具有一定的鲁棒性。

SURF算法通过这些步骤提供了一种快速且鲁棒的特征点检测和描述方法,使其在许多计算机视觉任务中得到广泛应用。

opencv中SURF的应用示例如下:

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int argc, char** argv) {// 检查图像路径是否已作为参数传递if (argc < 2) {cout << "Usage: DisplaySURFFeatures <Image_Path>" << endl;return -1;}Mat image;// 读取图像,使用cv::IMREAD_GRAYSCALE读取灰度图像image = imread(argv[1], IMREAD_GRAYSCALE);if(!image.data) {cout <<  "Could not open or find the image" << std::endl ;return -1;}// 创建SURF检测器,hessianThreshold参数可以根据需要调整double hessianThreshold = 100;Ptr<xfeatures2d::SURF> surf = xfeatures2d::SURF::create(hessianThreshold);// 检测关键点vector<KeyPoint> keypoints;Mat descriptors;surf->detectAndCompute(image, noArray(), keypoints, descriptors);// 绘制关键点Mat imageWithKeypoints;drawKeypoints(image, keypoints, imageWithKeypoints, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);// 显示带有关键点的图像namedWindow("SURF Keypoints", WINDOW_NORMAL);imshow("SURF Keypoints", imageWithKeypoints);waitKey(0); // 等待用户按键return 0;
}

说明:

  • main函数首先检查命令行参数中是否包含了图像路径。
  • 使用imread函数读取图像,这里使用cv::IMREAD_GRAYSCALE标志来读取灰度图像。
  • 创建一个SURF检测器对象,并使用create方法设置Hessian阈值。
  • 调用detectAndCompute方法来检测关键点并计算描述子。
  • 使用drawKeypoints函数在图像上绘制关键点。
  • 最后,使用namedWindowimshow函数显示带有关键点的图像。

http://www.ppmy.cn/news/1516906.html

相关文章

C++ 136类和对象_面像对像_多态_虚析构和纯虚析构

136类和对象_面像对像_多态_虚析构和纯虚析构 学习内容 1.抽象类 2.虚函数 3.纯虚函数 /4.虚析构 和 纯虚析构 总结: 1.虚析构或纯虚析构就是用来解决通过父类指针释放子类对象 2.如果子类中没有堆区数据&#xff0c;可以不写为虚析构或纯虚析构 3.拥有纯虚析构函数的类也属于…

缓存三剑客(穿透,雪崩,击穿)理解

缓存穿透 概念理解 缓存穿透正如其名穿透&#xff0c;说明访问的数据在缓存和数据库里都没用&#xff0c;而且此时还大量的发起了访问&#xff0c;导致数据库崩溃 解决方法 一、第一种解决方法就是保存空值在数据库里面&#xff0c;但是这种情况会很消耗空间 二、第二种办…

利用Python对Excel数据进行条件筛选与排序

目录 一、Python与Excel数据处理的基础知识 1.1 Python中的Excel数据处理库 1.2 pandas库简介 二、使用pandas读取Excel数据 三、Excel数据的条件筛选 3.1 单条件筛选 3.2 多条件筛选 3.3 使用query方法 四、Excel数据的排序 4.1 单列排序 4.2 多列排序 五、案例分…

python模块05-json

3 请求数据提取&#xff1a;json 3.1 json类型数据 json对象&#xff1a;{key:calue} json数组&#xff1a;[1,2,3,4] 3.2 json模块 1&#xff09; json.loads 把Json格式字符串解码转换成Python对象&#xff08;json数组对应列表&#xff0c;json对象对应字典&#xff09…

Jenkins发邮件功能如何配置以实现自动化?

jenkins发邮件的设置指南&#xff1f;Jenkins怎么配置服务器&#xff1f; Jenkins作为一个流行的自动化服务器&#xff0c;其发邮件功能是通知团队成员构建状态的重要手段。AokSend将详细介绍如何配置Jenkins发邮件功能&#xff0c;以实现自动化通知。 Jenkins发邮件&#xf…

『 C++ 』线程库

文章目录 线程库线程的创建与销毁成员函数this_thread 命名空间线程的引用传值 互斥锁互斥锁的基本操作递归锁(可重入锁)定时互斥锁互斥锁管理器与互斥锁抛异常所引发的死锁问题 条件变量条件变量的等待条件变量的唤醒两个线程交替打印奇偶数 线程库 C标准库提供了一套完整的线…

探索 AWS Lightsail 与 EC2:如何选择适合你的云计算服务?

探索 AWS Lightsail 与 EC2&#xff1a;如何选择适合你的云计算服务&#xff1f; 随着云计算的广泛应用&#xff0c;AWS 提供了多种计算服务以满足不同的用户需求。对于初次接触 AWS 的用户来说&#xff0c;可能会在选择 AWS Lightsail 和 EC2 时感到困惑。这两者都提供了虚拟…

webpack打包优化方案

调试工具&#xff1a;安装webpack-bundle-analyzer打包可视化工具&#xff0c;可以看到打包文件大小&#xff0c;从而有针对性的优化。 npm install --save-dev webpack-bundle-analyzer。 方案一&#xff1a;将第三方依赖包使用cdn进行引入减小文件包体积&#xff08;例&…

Git的使用教程及常用语法01

git安装可以到官网上下载并安装&#xff0c;一直点点点就行 安装成功后可以在任意地方右键以终端的形式打开。 打开命令终端&#xff0c;输入git -v 查看git版本 一.配置全局用户名和邮箱 配置全局用户名&#xff1a; git config --global user.name "your username&…

利用TeamCity实现maven项目的CI/CD

1.什么是TeamCity&#xff1f; TeamCity 是一款由 JetBrains 开发的强大的持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;和持续部署&#xff08;Continuous Deployment&#xff0c;CD&#xff09;工具。它帮助开发团队自动化构建、测试和部署过程&am…

Scratch的无限可能:突破项目大小与复杂度的界限

Scratch的无限可能&#xff1a;突破项目大小与复杂度的界限 Scratch&#xff0c;这个由麻省理工学院媒体实验室开发的编程平台&#xff0c;以其独特的图形化编程方式&#xff0c;激发了全球数百万孩子的创造力和逻辑思维能力。然而&#xff0c;随着孩子们创意的不断扩展&#…

centos7解决病毒入侵 getty

首先使用top命令查看 找到文件地址 查看是否有自启动服务 关闭、停止、删除 tmp 病毒文件删除 清除标记 [roothost-192-168-0-66 bin]# chattr -ia /tmp/newsvc.sh [roothost-192-168-0-66 bin]# chattr -ia /tmp/redis2 [roothost-192-168-0-66 bin]# chattr -ia /tmp/svc* [r…

C++开发IDE用VisualStudio好还是QtCreator好?

在熟练使用了VisualStudio和QtCreator之后,我依然认为QtCreator作为C++项目开发IDE的便捷性真的相当杰出。 当然了,VisualStudio和QtCreator本身就不是一个量级,VS越做越大,庞大的插件库也使得他能够支持从嵌入式到手机端,从web到脚本,甚至游戏,仿真等等各个领域的开发…

Leetcode 1047-删除字符串中的所有相邻重复项

给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 题解 题目链接 //先进后出&a…

网络-VPN

VPN&#xff08;Virtual Private Network&#xff0c;虚拟专用网络&#xff09;是一种网络技术&#xff0c;用于在公共网络&#xff08;如互联网&#xff09;上建立一个安全的、加密的连接通道&#xff0c;以保护数据传输的安全性和隐私。通过使用 VPN&#xff0c;用户可以在不…

线程面试题

1.JDK自带的线程池有哪些&#xff1f; 2.线程池中核心线程数与最大线程数与缓冲任务队列的关系&#xff1f; 先使用核心线程执行任务。 当核心线程不足时&#xff0c;新任务入队列等待。 当队列满且线程数未达最大值时&#xff0c;增加非核心线程执行任务。 当队列满且线程…

xss-labs通关攻略 11-15关

第十一关&#xff1a;less-11 步骤一&#xff1a;利用burp抓包 步骤二&#xff1a;添加referer:click me!" type"button" οnmοuseοver"alert(/xss/)进行放包 第十二关&#xff1a;less-12 步骤一&#xff1a;利用burp抓包 步骤二&#xff1a;修改User A…

熟悉Labview工具用

目录复制 目录 0.0&#xff1a;快捷键0.1&#xff1a;全局非图标显示0.2&#xff1a;小技巧&#xff1a;图片导入为程序1.2&#xff1a;事件结构1.2.0&#xff1a;超时分支&#xff1a;当事件结构框左上角设置为1时&#xff0c;单位毫秒&#xff0c;即理解为1ms内没有其他的事件…

ReadAgent,一款具有要点记忆的人工智能阅读代理

人工智能咨询培训老师叶梓 转载标明出处 现有的大模型&#xff08;LLMs&#xff09;在处理长文本时受限于固定的最大上下文长度&#xff0c;并且当输入文本越来越长时&#xff0c;性能往往会下降&#xff0c;即使在没有超出明确上下文窗口的情况下&#xff0c;LLMs 的性能也会随…

Python爬虫技术终端协议分析与抓包应用

内容导读 分析PC客户端抓包 分析App客户端抓包 一、分析PC客户端抓包 以爬取某音乐PC客户端为例&#xff0c;实现网页内容爬取与分析。 任务描述&#xff1a; 终端协议是网络上设备之间通信规则的集合&#xff0c;通过终端协议可以获取PC客户端和App客户端数据。常用的PC…