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

相关文章

Java 接口定义变量的示例代码

《Java接口定义变量的示例代码》文章介绍了Java接口中的变量和方法,接口中的变量必须是publicstaticfinal的,用于定义常量,而方法默认是publicabstract的,必须由实现类... 在 Java 中,接口是一种抽象类型,用于定义类必须实现的方法。接口可以包含常量和方法,但不能包含实例

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

mybatis-plus分表实现案例(附示例代码)

《mybatis-plus分表实现案例(附示例代码)》MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,:本文主要介绍my... 目录文档说明数据库水平分表思路1. 为什么要水平分表2. 核心设计要点3.基于数据库水平分表注意事项示例

Mybatis的mapper文件中#和$的区别示例解析

《Mybatis的mapper文件中#和$的区别示例解析》MyBatis的mapper文件中,#{}和${}是两种参数占位符,核心差异在于参数解析方式、SQL注入风险、适用场景,以下从底层原理、使用场... 目录MyBATis 中 mapper 文件里 #{} 与 ${} 的核心区别一、核心区别对比表二、底

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Python中4大日志记录库比较的终极PK

《Python中4大日志记录库比较的终极PK》日志记录框架是一种工具,可帮助您标准化应用程序中的日志记录过程,:本文主要介绍Python中4大日志记录库比较的相关资料,文中通过代码介绍的非常详细,... 目录一、logging库1、优点2、缺点二、LogAid库三、Loguru库四、Structlogphp