《OpenCV 计算机视觉》—— Harris角点检测、SIFT特征检测

文章目录

  • 一、Harris 角点检测
    • 1.基本思想
    • 2.检测步骤
    • 3.OpenCV实现
  • 二、SIFT特征检测
    • 1. SIFT特征检测的基本原理
    • 2. SIFT特征检测的特点
    • 3. OpenCV 实现

一、Harris 角点检测

OpenCV中的Harris角点检测是一种基于图像灰度值变化的角点提取算法,它通过计算每个像素点的响应函数来确定是否为角点。Harris角点检测算法的基本思想和步骤如下:

1.基本思想

Harris角点检测算法基于图像中角点的局部特征,角点处图像灰度变化明显,且向任何方向移动变化都很大。通过计算每个像素点的响应函数,并设置阈值来确定角点。

2.检测步骤

  1. 灰度化:将彩色图像转换为灰度图像,以便进行后续处理。

  2. 计算图像梯度:使用Sobel等算子计算图像在x和y方向上的梯度。这些梯度反映了图像在水平和垂直方向上的亮度变化。

  3. 计算梯度积方向矩阵(自相关矩阵):对于每个像素点,根据其周围的梯度值计算自相关矩阵。这个矩阵包含了该点x方向梯度的平方和、y方向梯度的平方和以及x方向梯度与y方向梯度的乘积。

  4. 计算角点响应函数:根据自相关矩阵计算Harris响应函数,其定义为 R = det ( M ) − k ⋅ trace ( M ) 2 R = \text{det}(M) - k \cdot \text{trace}(M)^2 R=det(M)ktrace(M)2,其中 M M M为自相关矩阵, det ( M ) \text{det}(M) det(M)为其行列式, trace ( M ) \text{trace}(M) trace(M)为其迹, k k k为一个经验参数,通常在0.04到0.06之间。

  5. 非极大值抑制:对于计算得到的响应函数图像,进行非极大值抑制,即保留局部最大值点,将其余点设为0,以消除重复检测的角点。

  6. 阈值化:根据设定的阈值,将响应函数图像中低于阈值的点排除,以得到最终的角点位置。

3.OpenCV实现

在OpenCV中,可以使用cv2.cornerHarris()函数来实现Harris角点检测。该函数的基本语法如下:

dst = cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])
  • src:输入图像,应为单通道灰度图像,数据类型为float32。

  • blockSize:角点检测中使用的邻域大小,一般为2、3、4等奇数。

  • ksize:Sobel算子的大小,用于计算x和y方向的梯度,一般为3。

  • k:Harris角点检测方程中的自由参数,一般取值为0.04到0.06。

  • dst:输出图像,与输入图像大小相同,数据类型为float32,其中每个像素点的值表示该点的Harris响应函数值。

  • borderType:像素的边界模式,默认值为cv2.BORDER_DEFAULT

  • 下图为示例图片
    在这里插入图片描述

  • Harris角点检测代码实现

    import cv2# 读取图像并转换为灰度图像
    image = cv2.imread('Ta.png')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 计算Harris角点响应图像
    dst = cv2.cornerHarris(gray, blockSize=4, ksize=3, k=0.04)# 标记检测到的角点
    image[dst > 0.05 * dst.max()] = [0, 255, 0]
    # 这里通过对角点响应进行阈值处理,标记出检测到的角点
    # 0.05 * dst.max()是一个值,大于这个值的像素点会被标记为绿色。# 显示结果图像
    cv2.imshow('Harris Corners', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 结果如下:
    在这里插入图片描述

二、SIFT特征检测

**SIFT(Scale-Invariant Feature Transform,尺度不变特征变换)**是一种在图像处理和计算机视觉领域广泛使用的特征检测算法。它主要用于检测图像中的局部特征点,并生成对应的描述符,这些特征点对图像的旋转、尺度缩放和亮度变化具有一定的不变性,同时对视角变化、仿射变换和噪声也保持一定程度的稳定性。以下是SIFT特征检测的详细介绍:

1. SIFT特征检测的基本原理

SIFT算法通过以下几个步骤来实现特征点的检测和描述:

  1. 尺度空间极值检测

    • 搜索所有尺度上的图像位置,通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。
    • 构建高斯金字塔DoG(Difference of Gaussian)金字塔,通过比较相邻尺度图像的差分来检测极值点
  2. 关键点定位

    • 在每个候选的位置上,通过拟合精细的模型(如泰勒展开)来确定关键点的精确位置和尺度。
    • 关键点的选择依据于它们的稳定程度,通常选择局部极值点作为关键点。
  3. 方向确定

    • 基于图像局部的梯度方向,为每个关键点分配一个或多个主方向。
    • 通过计算关键点周围区域的梯度幅值和方向来确定主方向,以实现旋转不变性。
  4. 关键点描述

    • 在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。
    • 将这些梯度变换成一种表示,形成关键点的描述符。描述符由关键点周围的梯度方向直方图组成,通过拼接子区域的直方图来形成最终的描述符。
    • 对描述符进行归一化处理,以增强其鲁棒性。
  • 可结合以下图片理解
    在这里插入图片描述

2. SIFT特征检测的特点

  1. 独特性:SIFT特征具有很好的独特性,即使在复杂的场景中也能有效地区分不同的特征点。
  2. 多量性:即使图像中只包含少数几个物体,也能产生大量的SIFT特征向量,为匹配提供更多的可能性。
  3. 高速性:经过优化的SIFT匹配算法可以达到实时的要求,适用于需要快速处理的应用场景。
  4. 可扩展性:SIFT特征可以很方便地与其他形式的特征向量进行联合,提高匹配的准确性和鲁棒性。

3. OpenCV 实现

  • 步骤:
    • 1.加载图像
    • 2.创建SIFT对象
    • 3.检测关键点和计算描述符
    • 4.绘制关键点
    • 5.显示图像
  • 下图为特征检测的图片
    在这里插入图片描述
  • SIFT特征检测代码实现
    import cv2# 加载图像并转换为灰度图
    image = cv2.imread('sea.jpg')
    image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 在OpenCV中,使用cv2.SIFT_create()或cv2.xfeatures2d.SIFT_create()函数(取决于OpenCV的版本和配置)来创建一个SIFT对象。
    # 这个对象将用于后续的关键点检测和描述符生成。
    sift = cv2.SIFT_create()
    # 或者在某些OpenCV版本中可能需要
    # sift = cv2.xfeatures2d.SIFT_create()# 使用SIFT对象的detectAndCompute()方法来检测图像中的关键点并计算它们的描述符
    keypoints, descriptors = sift.detectAndCompute(image_gray, None)# 使用cv2.drawKeypoints()函数将检测到的关键点绘制到图像上
    image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)# 显示图像
    cv2.imshow('Image with Keypoints', image_with_keypoints)
    cv2.waitKey(0)  # 等待任意键盘按键
    cv2.destroyAllWindows()  # 关闭所有OpenCV窗口
    
  • 结果如下:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/54263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十二集:制作完整地图和地图细节设置以及制作相机系统的跟随玩家和视角锁定功能

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作完整的地图和地图细节设置 1.制作地图前的设置2.制作地图前期该做的事3.制作地图之堆叠素材4.制作地图后期该做的事5.制作地图之修复意想不到的Bug二、…

C++仿函数的介绍以及priority_queue的介绍和模拟实现

目录 1.仿函数 1.1仿函数的介绍 1.2自定义类型使用仿函数 1.3自定义支持比较大小,但是比较的逻辑不是自己想要的逻辑 2.优先级队列priority_queue 2.1priority_queue的介绍 2.2priority_queue的使用 2.3priority_queue的模拟实现 1.仿函数 1.1仿函数的介绍…

微信小程序实战教程:如何使用map组件实现地图功能

在微信小程序中,map组件是一个非常实用的功能,它可以帮助我们快速实现地图展示、定位、标注等操作。本文将详细介绍如何在微信小程序中使用map组件,带你轻松掌握地图开发技能。 一、map组件概述 map组件是微信小程序官方提供的一个地图组件…

【C语言】指针篇 | 万字笔记

写在前面 在学习C语言过程,总有一个要点难点离不开,那就是大名鼎鼎的C语言指针,也是应为有指针的存在,使得C语言一直长盛不衰。因此不才把指针所学的所有功力都转换成这个笔记。希望对您有帮助🥰🥰 学习指…

彩虹易支付最新版源码及安装教程(修复BUG+新增加订单投诉功能)

该系统也没版本号,此版本目前是比较新的版本,增加了订单投诉功能,和一个好看的二次元模板。 此版本是全开源版,无一处加密文件,系统默认是安装后是打不开的, 本站特别修复了BUG文件,在PHP7.4环境下也没问…

【网络安全 | JAVA代码审计】基础安全问题和解决方法初探

未经许可,不得转载。 文章目录 SQL注入XSS文件上传XXE路径遍历SQL注入 漏洞代码: public String jdbc_sqli_vul(@RequestParam("username") String username) {StringBuilder result =

Java的学习(语法相关)

字符串存储的问题 char 和字符串都是字符的集合,它们之间的确有相似性,但在 Java 中它们有着不同的存储机制和处理方式。让我从 char 和 String 的本质区别入手来解释。 1. char 和 String 的区别 char 是基本类型:char 是 Java 中的基本数据…

微信小程序技术框架选型

“近期在对团队的微信小程序进行技术框架选型,故对目前主流的微信小程序技术框架进行了一些分析和比较,包括各框架的维护团队、社区链接、GitHub star数、优缺点对比等方面,为团队提供技术框架选型参考” 一、引言 随着移动互联网的快速发展…

【C++】多态(下)

个人主页~ 多态(上)~ 多态 四、多态的原理1、虚表的存储位置2、多态的原理3、动态绑定和静态绑定 五、单继承和多继承关系的虚函数表1、单继承中的虚函数表2、多继承中的虚函数表 六、多态中的一些小tips 四、多态的原理 1、虚表的存储位置 class A {…

CORE MVC 过滤器 (筛选器)

MVC FrameWork MVCFramework MVC Core 过滤器 分 同步、异步 1、 授权筛选器 IAuthorizationFilter,IAsyncAuthorizationFilter 管道中运行的第一类筛选器,用来确定发出请求的用户是否有权限发出当前请求 2、资源筛选器 IResourceFilter ,…

elementPlus的tree组件点击后有白色背景

在使用elementPlus的tree组件时&#xff0c;需要对它进行样式的重写&#xff0c;下面是相关代码 <script setup> import { ref } from vue const data [{label: Level one 1,children: [{label: Level two 1-1,children: [{label: Level three 1-1-1}]}]},{label: Leve…

SFTP 是什么?如何在 Linux 终端上访问 SFTP

SFTP服务器是 Secure File Transfer Protocol&#xff08;安全文件传输协议&#xff09;的简称&#xff0c;它是一种基于SSH&#xff08;Secure Shell&#xff09;协议的文件传输服务器&#xff0c;专门用于在网络上安全地传输文件。SFTP服务器通过使用SSH进行数据加密和身份验…

[C++][第三方库][gtest]详细讲解

目录 1.介绍2.安装3.使用1.头文件包含2.框架初始化接口3.调用测试样例4.TEST宏5.断言宏6.示例 1.介绍 gtest是一个跨平台的C单元测试框架&#xff0c;由Google公司发布gtest是为了在不同平台上为编写C单元测试而生成的&#xff0c;它提供了丰富的断言、致命和非致命判断、参数…

微软准备了 Windows 11 24H2 ISO “OOBE/BypassNRO“命令依然可用

Windows 11 24H2 可能在未来几周内开始推出。 微软已经要求 OEM 遵循新的指南准备好 Windows 11 24H2 就绪的驱动程序&#xff0c;并且现在已经开始准备媒体文件 (.ISO)。 OEM ISO 的链接已在微软服务器上发布。 一个标有"X23-81971_26100.1742.240906-0331.ge_release_sv…

市场中的新兴力量与未来发展

在当前瞬息万变的全球金融市场中&#xff0c;期货交易以其高杠杆与灵活性&#xff0c;吸引了越来越多的投资者参与其中。大粤期货作为中国期货行业的新兴力量&#xff0c;凭借其创新的交易平台、广泛的产品线及专业的风险管理服务&#xff0c;迅速在市场中崭露头角。本文将介绍…

Vue3项目开发——新闻发布管理系统(九)(完结篇)

文章目录 十一、用户信息管理1、用户基本资料管理1.1 页面设计1.2 封装接口,更新信息2、更换头像2.1 静态结构2.2 选择图片预览2.3 上传头像3、重置密码3.1 页面设计3.2 封装接口,更新密码十二、项目打包十三、系统全部源码下载十一、用户信息管理 用户信息管理包括功能:基…

第四届机器人、自动化与智能控制国际会议(ICRAIC 2024)征稿

第四届机器人、自动化与智能控制国际会议&#xff08;ICRAIC 2024&#xff09;由湖南第一师范学院主办&#xff0c;南京师范大学、山东女子学院、爱迩思出版社&#xff08;ELSP&#xff09;协办。 大会将专注于机器人、数字化、自动化、人工智能等技术的开发和融合&#xff0c…

如何让 Android 的前端页面像 iOS 一样“优雅”?

作者:方英杰&#xff08;崇之&#xff09; 最近在调研前端页面适配 Android 端异形屏的方案&#xff0c;调研过程中发现了一些比较有意思的点&#xff0c;本文主要是做一个总结。 一、提出问题 首先&#xff0c;我们需要知道 Android 上的前端适配面临着什么问题。 问题其实很…

windows C++-windows C++-使用任务和 XML HTTP 请求进行连接(三)

10. 添加下载和响应的代码&#xff1a; //使用指定的方法开始下载指定的URI。返回的任务生成 //HTTP响应文本。可以使用GetStatusCode()和GetReasonPrase()读取状态代码和原因。 task<wstring> HttpRequest::DownloadAsync(PCWSTR httpMethod, PCWSTR uri, cancellation…

【含文档】基于Springboot+Vue的停车场车位预约系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…