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

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre