《OpenCV 计算机视觉》—— Harris角点检测、SIFT特征检测
文章目录
- 一、Harris 角点检测
- 1.基本思想
- 2.检测步骤
- 3.OpenCV实现
- 二、SIFT特征检测
- 1. SIFT特征检测的基本原理
- 2. SIFT特征检测的特点
- 3. OpenCV 实现
一、Harris 角点检测
OpenCV中的Harris角点检测是一种基于图像灰度值变化的角点提取算法,它通过计算每个像素点的响应函数来确定是否为角点。Harris角点检测算法的基本思想和步骤如下:
1.基本思想
Harris角点检测算法基于图像中角点的局部特征,角点处图像灰度变化明显,且向任何方向移动变化都很大。通过计算每个像素点的响应函数,并设置阈值来确定角点。
2.检测步骤
-
灰度化:将彩色图像转换为灰度图像,以便进行后续处理。
-
计算图像梯度:使用Sobel等算子计算图像在x和y方向上的梯度。这些梯度反映了图像在水平和垂直方向上的亮度变化。
-
计算梯度积方向矩阵(自相关矩阵):对于每个像素点,根据其周围的梯度值计算自相关矩阵。这个矩阵包含了该点x方向梯度的平方和、y方向梯度的平方和以及x方向梯度与y方向梯度的乘积。
-
计算角点响应函数:根据自相关矩阵计算Harris响应函数,其定义为 R = det ( M ) − k ⋅ trace ( M ) 2 R = \text{det}(M) - k \cdot \text{trace}(M)^2 R=det(M)−k⋅trace(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之间。
-
非极大值抑制:对于计算得到的响应函数图像,进行非极大值抑制,即保留局部最大值点,将其余点设为0,以消除重复检测的角点。
-
阈值化:根据设定的阈值,将响应函数图像中低于阈值的点排除,以得到最终的角点位置。
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算法通过以下几个步骤来实现特征点的检测和描述:
-
尺度空间极值检测:
- 搜索所有尺度上的图像位置,通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。
- 构建高斯金字塔和DoG(Difference of Gaussian)金字塔,通过比较相邻尺度图像的差分来检测极值点。
-
关键点定位:
- 在每个候选的位置上,通过拟合精细的模型(如泰勒展开)来确定关键点的精确位置和尺度。
- 关键点的选择依据于它们的稳定程度,通常选择局部极值点作为关键点。
-
方向确定:
- 基于图像局部的梯度方向,为每个关键点分配一个或多个主方向。
- 通过计算关键点周围区域的梯度幅值和方向来确定主方向,以实现旋转不变性。
-
关键点描述:
- 在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。
- 将这些梯度变换成一种表示,形成关键点的描述符。描述符由关键点周围的梯度方向直方图组成,通过拼接子区域的直方图来形成最终的描述符。
- 对描述符进行归一化处理,以增强其鲁棒性。
- 可结合以下图片理解
2. SIFT特征检测的特点
- 独特性:SIFT特征具有很好的独特性,即使在复杂的场景中也能有效地区分不同的特征点。
- 多量性:即使图像中只包含少数几个物体,也能产生大量的SIFT特征向量,为匹配提供更多的可能性。
- 高速性:经过优化的SIFT匹配算法可以达到实时的要求,适用于需要快速处理的应用场景。
- 可扩展性: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窗口
- 结果如下:
相关文章:

《OpenCV 计算机视觉》—— Harris角点检测、SIFT特征检测
文章目录 一、Harris 角点检测1.基本思想2.检测步骤3.OpenCV实现 二、SIFT特征检测1. SIFT特征检测的基本原理2. SIFT特征检测的特点3. OpenCV 实现 一、Harris 角点检测 OpenCV中的Harris角点检测是一种基于图像灰度值变化的角点提取算法,它通过计算每个像素点的响…...

rtmp协议转websocketflv的去队列积压
websocket server的优点 websocket server的好处:WebSocket 服务器能够实现实时的数据推送,服务器可以主动向客户端发送数据 1 不需要客户端不断轮询。 2 不需要实现httpserver跨域。 在需要修改协议的时候比较灵活,我们发送数据的时候比较…...

Elasticsearch实战应用:构建高效搜索引擎
在大数据时代,如何高效存储和检索海量信息成为了一个重要课题。Elasticsearch作为一个开源的分布式搜索引擎,以其强大的搜索能力和灵活的扩展性,成为了许多企业和开发者的首选。本文将深入探讨Elasticsearch的实战应用,包括基本概…...

Hive数仓操作(四)
一、Hive 创建表案例一(ARRAY数组类型) 1. 准备数据文件 首先,准备一个名为 stu2.txt 的文件,文件内容示例如下: 1001 Alice fish,cat 1002 Bob dog,rabbit 1003 Charlie bird注意: …...

《C++跨平台开发:突破界限,释放无限可能》
在当今的软件开发领域,跨平台开发已成为一种重要趋势。它允许开发者编写一次代码,然后在多个不同的操作系统和硬件平台上运行,极大地提高了开发效率和软件的可扩展性。而 C作为一种强大的编程语言,也具备实现跨平台开发的能力。本…...

速盾:免备案服务器?
速盾是一家提供网络安全服务的公司,其主要产品包括CDN加速、WEB防护、WAF、DDoS防护等。在网站建设过程中,选择一个合适的服务器是非常重要的一步。传统的服务器需要备案,涉及到较多的流程和审批时间,给网站运营带来了一定的麻烦。…...

Electron获取nodejs和chrome版本信息
Electron获取nodejs和chrome版本信息 环境: electron: 30.1.1 nodejs: 20.14.0代码 $ tree . --- index.html --- index.js --- package.jsonindex.html <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>H…...

【React】setState 批量更新
setState 批量更新的过程 React 的 setState 调用是异步的。为了性能原因,React 会将多个 setState 调用合并成一次批量更新。具体过程如下: 1)React 先将调用的每个 setState 所产生的更新对象存储在一个队列中。 2)在所有的同步…...

微信小程序开发日记第二天
坚持在各个平台更新自己写小程序的心得体会,在百度贴吧和csdn更新自己的小程序日记,同时也是个体不断地对于云技术的开发和成长,进行提升!不断地将开源开放创新思维运用到自己的小程序当中,小程序制作的关键就是&#…...

如果您忘记了 Apple ID 和密码,按照指南可重新进入您的设备
即使您的 iPhone 或 iPad 由于各种原因被锁定或禁用,也可以使用 iTunes、“查找我的”、Apple 支持和 iCloud 解锁您的设备。但是,此过程需要您的 Apple ID 和密码来验证所有权并移除激活锁。如果您忘记了 Apple ID 和密码,请按照我们的指南重…...

Top4免费音频剪辑软件大比拼,2024年你选哪一款?
现在我们生活在一个数字化的时代,音频内容对我们来说很重要。不管是给自己拍的视频配背景音乐、整理开会时的录音,还是自己写歌,有个好用的音频剪辑软件都特别重要。今天,我要给大家介绍几款特别好用的音频剪辑软件免费的…...

基于SSM的电影院售票系统设计与实现
文未可获取一份本项目的java源码和数据库参考。 前言 近些年的电影在人们文娱活动中占据重要地位,另外,由于人们的生活越来越富有,越来越多的人们不再选择在家里看电影,而是选择去电影院看电影。但是,以往的售票方式是…...

uniapp 必须掌握的细节
1.使用watch实现实时监控的效果 例如:实时监测手机号码的示例 // 实时监测手机号码 watch(() > UserRegisterForm.value.phone, (newPhone) > {// 简单的手机号码正则表达式验证const phoneRegex /^1[3-9]\d{9}$/;tips.value.tipPhone !phoneRegex.test(n…...

JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)
目录 Dialog对话框 介绍 使用 实际效果 Form表单 介绍 使用 实际效果 Dialog对话框 介绍 Dialog对话框:在保留当前页面状态的情况下,告知用户并承载相关操作。 Dialog 对话框组件可以在保留当前页面信息的状态下弹出一个对话框,并…...

一个月学会Java 第2天 认识类与对象
Day2 认识类与对象 第一章 初识类 经过一个程序的编写,应该对程序的结构有点好奇了吧,如果你有基础,接下来的肯定非常的易懂,如果你没有基础也没有关系,反复琢磨一下也就懂了😆 我们来重复一下第一个程序 …...

【WRF数据准备】MODIS静态地理数据下载及制备
【WRF数据准备】MODIS静态地理数据下载及制备 MODIS数据介绍数据下载数据拼接MRT工具介绍基于MRT软件完成数据拼接 格式转换:tif文件转二进制格式编写INDEX修改GEOGRID.TBL以及namelist.wps修改GEOGRID.TBL修改namelist.wps 参考 MODIS数据介绍 MODIS-MCD12Q1 v061…...

MySQL数据库——索引
目录 什么是索引(Index)? 怎样加索引? 索引的特点 索引类型 主键索引(Primary Key) 辅助索引(二级索引) 聚集索引和非聚集索引 聚集索引 非聚集索引 单列索引和联合索引 单列索引 联合索引 创…...

【SpringCloud】服务注册/服务发现-Eureka
服务注册/服务发现-Eureka 1. 背景1.1 问题描述1.2 解决思路1.3 什么是注册中⼼1.4 CAP理论1.5 常⻅的注册中⼼ 2. Eureka 介绍3. 搭建Eureka Server 1. 背景 1.1 问题描述 上个章节的例⼦中可以看到, 远程调⽤时, 我们的URL是写死的 String url "http://127.0.0.1:90…...

让你的Github Profile高大时尚!
目录 前言 正文 GitHub Profile 特点: GitHub Actions 核心概念: 应用场景: RSS RSS的主要特点: 使用场景: RSS的工作原理: 关于Github Readme Card 关于Github贡献的3D图 关于个人最新博文的获取 关于代码…...

ElasticSearch备考 -- Multi match
一、题目 索引task有3个字段a、b、c,写一个查询去匹配这三个字段为mom,其中b的字段评分比a、c字段大一倍,将他们的分数相加作为最后的总分数 二、思考 通过题目要求对多个字段进行匹配查询,可以考虑multi match、bool query操作。…...

滚雪球学Oracle[2.5讲]:数据库初始化配置
全文目录: 前言一、配置文件的高级参数设置1.1 open_cursors:游标打开数量限制案例演示 1.2 session_cached_cursors:会话缓存游标数量案例演示 1.3 pga_aggregate_target与sga_target:内存分配优化案例演示 二、内存管理模式的选…...

Java - Spring框架 (ios+aop)
Spring 简介 Spring框架是为了解决企业应用开发的复杂性,使用基本的JavaBean代替EJB,并提供了更多的企业应用功能,Spring是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架。 Spring优点 Spring是一个开源的免费的框架(容器) Spring是一…...

计算机网络(十) —— IP协议详解,理解运营商和全球网络
目录 一,关于IP 1.1 什么是IP协议 1.2 前置认识 二,IP报头字段详解 三,网段划分 3.1 IP地址的构成 3.2 网段划分 3.3 子网划分 3.4 IP地址不足问题 四,公网IP和私有IP 五,理解运营商和全球网络 六ÿ…...

速速收藏!这些2024年上映的AI电影与短剧,申请加入你的国庆假期宅家计划!
2024年上映的AI电影 01 科幻惊悚电影《致命AI Afraid》 导演:克里斯韦兹上映日期:2024-08-30(美国)片长:84分钟剧情简介:Curtis一家被选中去测试一种革新性的居家设备:数字家庭助手AIA,包括各种感应设备和摄像头等,…...

23.2 prometheus为k8s做的4大适配工作
本节重点介绍 : k8s监控中的4大采集类型总结prometheus为k8s监控做的4大适配工作 k8s关注指标分析 在监控每个细分的领域时,我们都要先思考下到底需要关注哪些方面的指标。k8s中组件复杂,我们主要专注的无外乎四大块指标:容器基础资源指标…...

1、如何查看电脑已经连接上的wifi的密码?
在电脑桌面右下角的如下位置:双击打开查看当前连接上的wifi的名字:ZTE-kfdGYX-5G 按一下键盘上的win R 键, 输入【cmd】 然后,按一下【回车】。 输入netsh wlan show profile ”wifi名称” keyclear : 输入完成后,按一下回车&…...

循环链表和双向链表
一、 带尾指针的循环链表的合并 算法步骤: p存表头结点——pTa->next;Tb表头连接到Ta表尾——Ta->nextTb->next->next;释放Tb表头结点——delate Tb->next;修改指针——Tb->nextp; LinkList Connect(LinkList Ta,LinkList Tb){pTa->next; …...

【Linux庖丁解牛】—Linux基本指令(中)!
🌈个人主页:秋风起,再归来~🔥系列专栏: Linux庖丁解牛 🔖克心守己,律己则安 目录 1、rmdir与rm指令 2、man指令 3、cp指令 4、mv指令 5、cat与tac指令 6、重定向 7、more指令 8、…...

【电路笔记】-运算放大器微分器
运算放大器微分器 文章目录 运算放大器微分器1、概述2、运算放大器微分器的表示2.1 理想微分器2.2 输出公式2.3 交流分析3、实际微分器3.1 理想配置的局限性3.2 带串联电阻的伪微分器3.3 具有并联电容器的伪微分器4、总结1、概述 在我们之前关于积分器运算放大器的文章中,我们…...

【Unity踩坑】使用内购时获取Google Play license key
在Unity中使用了IAP(内购)后,需要设置Google Play license key。 这个key需要在Google Play Console中(https://play.google.com/console),找到相应的应用,在左侧“创收设置”里可以找到license…...