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

2024-08-28 05:28

本文主要是介绍OpenCV入门12.2:SURF与SIFT比较及SURF示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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函数显示带有关键点的图像。

这篇关于OpenCV入门12.2:SURF与SIFT比较及SURF示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113857

相关文章

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java高效实现PowerPoint转PDF的示例详解

《Java高效实现PowerPoint转PDF的示例详解》在日常开发或办公场景中,经常需要将PowerPoint演示文稿(PPT/PPTX)转换为PDF,本文将介绍从基础转换到高级设置的多种用法,大家... 目录为什么要将 PowerPoint 转换为 PDF安装 Spire.Presentation fo

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

python中的高阶函数示例详解

《python中的高阶函数示例详解》在Python中,高阶函数是指接受函数作为参数或返回函数作为结果的函数,下面:本文主要介绍python中高阶函数的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录1.定义2.map函数3.filter函数4.reduce函数5.sorted函数6.自定义高阶函数

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

Java中的Schema校验技术与实践示例详解

《Java中的Schema校验技术与实践示例详解》本主题详细介绍了在Java环境下进行XMLSchema和JSONSchema校验的方法,包括使用JAXP、JAXB以及专门的JSON校验库等技术,本文... 目录1. XML和jsON的Schema校验概念1.1 XML和JSON校验的必要性1.2 Sche

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave