OpenCv高阶(四)——角点检测
一、角点检测
在计算机视觉中,角点检测是识别图像中局部区域(角点)的关键技术,这些区域通常是两条或多条边缘的交点,具有丰富的结构信息,常用于图像匹配、跟踪、三维重建等任务。
Harris角点检测算法是一种常用的计算机视觉算法,用于检测图像中的角点。该算法通过计算图像中每个像素的局部自相关矩阵,来判断该像素是否为角点。

角点检测算法的基本思想:
使用一个固定的小窗口在图像上进行任意方向的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化(sobel算子,在图像的边缘检测中有详细解释),那么我们可以认为该窗口中存在角点。
1、Harris 角点检测(经典方法)
1. 原理
基于图像局部灰度变化,通过计算像素点在x/y 方向的梯度,构建结构张量矩阵(梯度自相关矩阵),再通过响应函数判断是否为角点:

角点指图像中局部区域与周围区域有较大灰度变化的点或像素。 cornerHarris(img, blockSize, ksize, k[, dst[, borderType]]) -> dst• img:单通道灰度图像(数据类型为 float32)。• blockSize: 计算角点时考虑的邻域大小(如 2 表示 2x2 邻域)。• ksize:Sobel 梯度计算的核大小(常用 3)。• k: 响应函数中的参数,影响角点检测的敏感度(k 越小,检测到的角点越多)。,取值参数为 [0.04,0.06]。dst:返回numpy.ndarray对象,大小和src相同,值越大,对应像素点是角的概率越高
1、图片的读取以及灰度转换
img = cv2.imread('huanghelou.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
2、检测角点,并对响应值进行阈值处理
dst = cv2.cornerHarris(gray,4,3,0.04)
# 标记检测到的角点
img[dst > 0.01 * dst.max()] = [0, 255, 0]
# 这里通过对角点响应进行阈值处理,标记出检测到的角点。
# 0.05 * dst.max() 是一个阈值,大于这个值的像素点会被标记为绿色。
cv2.imshow('img',img)
cv2.waitKey(0)

2、Shi-Tomasi 角点检测(Good Features to Track)
1. 原理
Harris 算法的改进版,直接利用矩阵 M 的最小特征值判断角点:
- 若最小特征值大于阈值,则认为是角点(相比 Harris 更鲁棒,尤其在图像跟踪中表现更好)。
2. OpenCV 函数
corners = cv2.goodFeaturesToTrack(gray_img, maxCorners, qualityLevel, minDistance)
- 参数:
maxCorners:最多检测的角点数量(若角点数量超过,按响应值降序筛选)。qualityLevel:角点质量阈值(0~1,值越小保留的角点越多,通常取 0.01~0.1)。minDistance:角点之间的最小像素距离(避免密集角点)。
- 输出:角点坐标数组(形状为
(N, 1, 2),N 为角点数量)。
3. 示例代码
import cv2
import numpy as npimg = cv2.imread('building.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Shi-Tomasi角点检测
corners = cv2.goodFeaturesToTrack(gray, maxCorners=100, qualityLevel=0.01, minDistance=10)
corners = np.int0(corners) # 转换为整数坐标# 绘制角点
for corner in corners:x, y = corner.ravel()cv2.circle(img, (x, y), 3, (0, 255, 0), -1) # 绿色圆点标记cv2.imshow('Shi-Tomasi Corners', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3、FAST 角点检测(快速角点检测)
1. 原理
基于像素灰度差异的高效角点检测算法,核心思想是:若某像素点与其周围 16 个像素中的 N 个(如 9 个)灰度差异足够大,则认为是角点(称为 FAST-9)。
- 优点:速度极快,适合实时应用。
- 缺点:对噪声敏感,需结合非极大值抑制(NMS)筛选角点。
2. OpenCV 函数
fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True)
corners = fast.detect(gray_img, None)
- 参数:
threshold:灰度差异阈值(值越小,检测到的角点越多)。nonmaxSuppression:是否启用非极大值抑制(建议设为 True,避免密集角点)。
- 输出:
KeyPoint对象列表,包含角点坐标、大小等信息。
3. 示例代码
import cv2img = cv2.imread('fast_corner.jpg', cv2.IMREAD_GRAYSCALE)# 创建FAST检测器
fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True)# 检测角点
corners = fast.detect(img, None)# 绘制角点
img_color = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cv2.drawKeypoints(img_color, corners, img_color, color=(0, 255, 0), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)cv2.imshow('FAST Corners', img_color)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、算法对比与选择
| 算法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Harris | 经典方法,检测稳定 | 计算量大,角点密集 | 学术研究、全局角点检测 |
| Shi-Tomasi | 跟踪效果好,抑制边缘响应 | 依赖参数调优 | 图像跟踪(如 LK 光流) |
| FAST | 速度极快,适合实时应用 | 对噪声敏感,需 NMS | 实时系统(如无人机、机器人) |
三、注意事项
-
输入图像预处理:
- 必须为单通道灰度图(彩色图需先转换为灰度图)。
- 建议先进行高斯模糊降噪(如
cv2.GaussianBlur),减少噪声对角点检测的影响。
-
参数调优:
qualityLevel(Shi-Tomasi)和threshold(FAST)需根据图像对比度调整,避免检测到过多或过少角点。minDistance用于控制角点密度,避免相邻过近的角点。
-
角点响应可视化:
- Harris 的响应值需通过阈值(如全局最大值的 1%~5%)筛选后标记。
-
Shi-Tomasi 和 FAST 可直接通过坐标绘制角点。
总结
角点检测是图像特征提取的基础步骤,OpenCV 提供了从经典(Harris)到高效(FAST)的多种算法。选择时需结合场景需求:
- 追求精度和稳定性:Shi-Tomasi(推荐用于跟踪任务)。
- 追求速度:FAST(需配合 NMS 和降噪)。
- 学术研究或通用场景:Harris(理解角点检测的数学原理)。 通过合理调整参数和预处理,可有效提升角点检测的效果,为后续计算机视觉任务奠定基础。
相关文章:
OpenCv高阶(四)——角点检测
一、角点检测 在计算机视觉中,角点检测是识别图像中局部区域(角点)的关键技术,这些区域通常是两条或多条边缘的交点,具有丰富的结构信息,常用于图像匹配、跟踪、三维重建等任务。 Harris角点检测算法是一…...
TOA与AOA联合定位的高精度算法,三维、4个基站的情况,MATLAB例程,附完整代码
本代码实现了三维空间内目标的高精度定位,结合到达角(AOA) 和到达时间(TOA) 两种测量方法,通过4个基站的协同观测,利用最小二乘法解算目标位置。代码支持噪声模拟、误差分析及三维可视化,适用于无人机导航、室内定位等场景。订阅专栏后可获得完整代码 文章目录 运行结果…...
如何在 Ubuntu 22.04 上安装、配置、使用 Nginx
如何在 Ubuntu 22.04 上安装、配置、使用 Nginx?-阿里云开发者社区 更新应用 sudo apt updatesudo apt upgrade检查必要依赖并安装 sudo apt install -y curl gnupg2 ca-certificates lsb-release安装nginx sudo apt install -y nginx# 启动nginx sudo systemct…...
揭秘大数据 | 23、软件定义网络
软件定义网络将网络的边缘从硬件交换机推进到了服务器里面,将服务器和虚拟机的所有部署、管理的职能从原来的系统管理员网络管理员的模式变成了纯系统管理员的模式,让服务器的业务部署变得简单,不再依赖于形态和功能各异的硬件交换机…...
Elastic 9.0/8.18:BBQ、EDOT 和 LLM 可观察性、攻击发现、自动导入以及 ES|QL JOIN
作者:来自 Elastic Brian Bergholm 今天,我们很高兴地宣布 Elastic 9.0 和 8.18 的正式发布! 如果你觉得 8.x 版本系列已经很令人印象深刻,包含了 ANN、TSDB、ELSER、ES|QL、LTR、BBQ、logsdb 索引模式等功能,那你一定…...
当 AI 有了 “万能插头” 和 “通用语言”:MCP 与 A2A 如何重构智能体生态
目录 一、MCP:让 AI 拥有 “万能工具插头” 1.1 从 “手工对接” 到 “即插即用” 1.2 架构解密:AI 如何 “指挥” 工具干活 1.3 安全优势:数据不出门,操作可追溯 二、A2A:让智能体学会 “跨语言协作” 2.1 从 “…...
中间件--ClickHouse-3--列式存储和行式存储理解
在数据库存储中,列式存储(Columnar Storage)与行式存储(Row-based Storage)是两种不同的数据组织方式,它们各自适用于不同类型的应用场景。 1、行式存储(MySQL) 存储方式ÿ…...
【golang/jsonrpc】go-ethereum中json rpc初步使用(websocket版本)
说在前面 操作系统:win11 wsl2go-ethereum版本:1.15.8 关于json-rpc 官网 server 定义方法type CalculatorService struct{}func (s *CalculatorService) Add(a, b int) int {return a b }func (s *CalculatorService) Div(a, b int) (int, error) {…...
逻辑回归 (Logistic Regression)
文章目录 逻辑回归 (Logistic Regression)问题的引出Sigmoid function逻辑回归的解释决策边界 (Decision boundary)逻辑回归的代价函数机器学习中代价函数的设计1. 代价函数的来源(1)从概率模型推导而来(统计学习视角)(…...
燕山大学计算机网络之Java实现TCP数据包结构设计与收发
觉得博主写的好,给博主点点免费的关注吧! 目录 摘要.................................................................................................................... 4 前言.............................................................…...
如何使用SpringApplicationRunListener在Spring Boot 应用的不同生命周期阶段插入自定义逻辑
目录 一、引言二、核心方法概述三、加载机制四、使用场景五、扩展 - 如何在测试的不同阶段插入逻辑5.1 TestExecutionListener & AbstractTestExecutionListener5.1.1 主要功能5.1.2 生命周期方法 5.2 如何集成TestExecutionListener5.3 总结 一、引言 SpringApplicationR…...
P10413 [蓝桥杯 2023 国 A] 圆上的连线
题意: 给定一个圆,圆上有 n2023 个点从 1 到 n 依次编号。 问有多少种不同的连线方式,使得完全没有连线相交。当两个方案连线的数量不同或任何一个点连接的点在另一个方案中编号不同时,两个方案视为不同。 答案可能很大&#x…...
JavaEE——线程安全
目录 前言1.线程安全的定义2.线程安全问题产生的原因2.1 多个线程修改一个变量2.2 修改操作不是原子的2.3 内存可见性引起的线程安全问题 3.解决线程安全问题的方法3.1 通过synchronized关键字加锁3.2 使用volatile关键字 总结 前言 在使用多线程的时候,难免会出现…...
Redis Hash 介绍
Redis Hash 介绍 从基础命令、内部编码和使用场景三个维度分析如下: 一、基础命令 Redis Hash 提供了丰富的操作命令,适用于字段(field)级别的增删改查: 设置与修改 HSET:设置单个字段值(HSET…...
[redis进阶一]redis的持久化(2)AOF篇章
目录 一 为什么有了RDB持久化机制还要有AOF呢 板书介绍具体原因: 编辑二 详细讲解AOF机制 (1)AOF的基本使用 1)板书如下 2)开启AOF机制: 3) AOF工作流程 (2)AOF是否会影响到redis性能 编辑 (3)AOF缓冲区刷新策略 (4)AOF的重写机制 板书如下: 为什么要有这个重写机…...
【Linux我做主】探秘gcc/g++和动静态库
TOC Linux编译器gcc/g的使用 github地址 有梦想的电信狗 前言 在软件开发的世界中,编译器如同匠人的工具,将人类可读的代码转化为机器执行的指令。 对于Linux开发者而言,gcc和g是构建C/C程序的核心工具链,掌握它们的原理和使…...
Linux `init 0` 相关命令的完整使用指南
Linux init 0 相关命令的完整使用指南—目录 一、init 系统简介二、init 0 的含义与作用三、不同 Init 系统下的 init 0 行为1. SysVinit(如 CentOS 6、Debian 7)2. systemd(如 CentOS 7、Ubuntu 16.04)3. Upstart(如 …...
【英语语法】基本句型
目录 前言一:主谓二:主谓宾三:主系表四:主谓双宾五:主谓宾补 前言 英语基本句型是语法体系的基石,以下是英语五大基本句型。 一:主谓 结构:主语 不及物动词 例句: T…...
Vue3中发送请求时,如何解决重复请求发送问题?
文章目录 前言一、问题演示二、使用步骤1.One组件2.Two组件封装工具函数处理请求 总结 前言 在开发过程中,重复请求发送问题可能会导致数据不一致、服务器压力增加或用户操作异常。以下是解决重复请求问题的常见方法和最佳实践: 一、问题演示 我们看着…...
信息学奥赛一本通 1622:Goldbach’s Conjecture | 洛谷 UVA543 Goldbach‘s Conjecture
【题目链接】 ybt 1622:Goldbach’s Conjecture 洛谷 UVA543 Goldbach’s Conjecture 【题目考点】 1. 筛法求质数表 埃筛线性筛(欧拉筛) 知识点讲解见信息学奥赛一本通 2040:【例5.7】筛选法找质数 【解题思路】 首先使用埃…...
在极狐GitLab 身份验证中如何使用 OIDC?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 使用 OpenID Connect 作为认证提供者 (BASIC SELF) 您可以使用极狐GitLab 作为客户端应用程序,与 OpenID Connec…...
计算机视觉与深度学习 | 基于YOLOv8与光流法的目标检测与跟踪(Python代码)
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 目标检测与跟踪 关键实现逻辑检测-跟踪协作机制特征点选择策略运动…...
解决 VSCode 中 NVM 配置后无法识别 Node 和 NPM 的问题
在开发中,我们经常需要使用 Node.js 和 NPM 来管理 JavaScript 项目依赖,而 NVM(Node Version Manager)是开发者在本地环境中管理多个 Node.js 版本的得力工具。不过,有时候在 VSCode 中配置完 NVM 后,可能…...
观察者模式:从博客订阅到消息队列的解耦实践
观察者模式:从博客订阅到消息队列的解耦实践 一、模式核心:用事件驱动实现对象间松耦合 在新闻 APP 中,当热点事件发生时需要实时通知所有订阅用户;在电商系统中,库存变化需触发价格监控模块重新计算。这类场景的核心…...
ReportLab 导出 PDF(页面布局)
ReportLab 导出 PDF(文档创建) ReportLab 导出 PDF(页面布局) ReportLab 导出 PDF(图文表格) PLATYPUS - 页面布局和排版 1. 设计目标2. 开始3. Flowables3.1. Flowable.draw()3.2. Flowable.drawOn(canvas,x,y)3.3. F…...
qt与html通信
**Cef视图(CefView)**是指在使用Chromium Embedded Framework(CEF)时,嵌入到应用程序中的浏览器视图。CEF是一个开源项目,它基于Google的Chromium浏览器,允许开发者将Web浏览器功能嵌入到自己的…...
git 根据http url设置账号密码
1. 原因 场景:有一种情况,比如在github上面有多个账号,并且每个账号都有些仓库的内容需要修改,并且这些账号自己,不是协作者的关系。这个时候需要针对每个仓库的url设置用户名密码, 2. 设置 2.1 第一步:…...
【CVE-2024-10929】ARM CPU漏洞安全通告
安全之安全(security)博客目录导读 目录 一、概述 二、CVE详情 三、受影响产品 四、建议措施 五、致谢 六、版本历史 一、概述 在部分基于Arm架构的CPU中发现了一个潜在安全问题,称为Spectre-BSE(Branch Status Eviction,分支状态驱逐…...
OpenCV 图形API(33)图像滤波-----高斯模糊函数gaussianBlur()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用高斯滤波器对图像进行模糊处理。 该函数使用指定的高斯核对源图像进行滤波。输出图像必须与输入图像具有相同的类型和通道数。 cv::gapi::g…...
【Android】 如何将 APK 内置为系统应用(适用于编辑设置属性)
如何将 APK 内置为系统应用(适用于编辑设置属性) 在 Android 中,将 APK 文件内置为系统应用涉及到一系列的命令和步骤。以下是详细的操作流程,帮助您解决常见问题,如 /system not in /proc/mounts 的错误。 挂载system/app获取可读写权限 …...
