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实时系统(如无人机、机器人)

三、注意事项

  1. 输入图像预处理

    • 必须为单通道灰度图(彩色图需先转换为灰度图)。
    • 建议先进行高斯模糊降噪(如 cv2.GaussianBlur),减少噪声对角点检测的影响。
  2. 参数调优

    • qualityLevel(Shi-Tomasi)和 threshold(FAST)需根据图像对比度调整,避免检测到过多或过少角点。
    • minDistance 用于控制角点密度,避免相邻过近的角点。
  3. 角点响应可视化

    • Harris 的响应值需通过阈值(如全局最大值的 1%~5%)筛选后标记。
    • Shi-Tomasi 和 FAST 可直接通过坐标绘制角点。

总结

角点检测是图像特征提取的基础步骤,OpenCV 提供了从经典(Harris)到高效(FAST)的多种算法。选择时需结合场景需求:

  • 追求精度和稳定性:Shi-Tomasi(推荐用于跟踪任务)。
  • 追求速度:FAST(需配合 NMS 和降噪)。
  • 学术研究或通用场景:Harris(理解角点检测的数学原理)。 通过合理调整参数和预处理,可有效提升角点检测的效果,为后续计算机视觉任务奠定基础。

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

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

相关文章

Conda 入门指令教程

Conda 入门指令教程 Conda 是一个强大的包和环境管理工具,广泛应用于数据科学和机器学习项目中。本文将介绍 Conda 的常用指令,帮助你快速上手。 1. Conda 基础操作 查看 Conda 版本 conda --version显示当前安装的 Conda 版本。 更新 Conda conda…

Unity ShaderLab引用HLSL文件找不到其中函数

在写Unity Shader的过程中,常常需要将方法封装到HLSL文件中,今天遇到一个这样的报错, 明明hlsl文件路径引用没问题,却引用不到方法 并且将分散文件中的函数复制过来一切正常,最终定位到HLSL的预编译指令中 这指令的…

uniapp上传图片时(可选微信头像、相册、拍照)

参考文献&#xff1a;微信小程序登录——头像_onchooseavatar-CSDN博客 <button open-type"chooseAvatar" chooseavatar"onChooseAvatar"> </button>onChooseAvatar(e) {uni.showLoading({title: 上传中...,mask: true});uni.uploadFile({url…

单元测试的一般步骤

Qt Test Qt Test 是 Qt 开发人员发布的一个单元测试框架&#xff0c;用于测试基于 Qt 框架的应用程序或库。它提供了单元测试框架中常见的所有功能以及用于测试图形用户界面的扩展。 1.自动化测试包络ui测试>接口测试>单元测试&#xff1b;现问如何使用Qt进行单元测试&…

【Matlab】中国沿岸潮滩宽度和坡度分布

【Matlab】中国沿岸潮滩宽度和坡度分布 参考文献见最后或者阅读原文&#xff01; 中国沿岸潮滩宽度和坡度分布: figure 1 a 潮滩宽度分布。b 潮滩坡度分布。 图中标注了中国沿海各省&#xff0c;分别为辽宁&#xff08;LN&#xff09;、河北&#xff08;HB&#xff09;、山东&…

理解.NET Core中的配置Configuration

什么是配置 .NET中的配置&#xff0c;本质上就是key-value键值对&#xff0c;并且key和value都是字符串类型。 在.NET中提供了多种配置提供程序来对不同的配置进行读取、写入、重载等操作&#xff0c;这里我们以为.NET 的源码项目为例&#xff0c;来看下.NET中的配置主要是有…

windows服务器及网络:论如何安装(虚拟机)

今天我要介绍的是&#xff1a;在Windows中对于安装系统&#xff08;虚拟机的步骤以及相关的安装事宜&#xff09;&#xff0c;事不宜迟&#xff0c;让我们来看看系统安装&#xff08;虚拟机&#xff09;是怎么操作的&#xff1a; 对现在来说&#xff0c;安装电脑系统已经是非常…

shardingsphere-jdbc集成Seata分布式事务

1、导入相关依赖 <!-- shardingsphere-jdbc --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc</artifactId><version>5.5.1</version></dependency><!-- shardingspher…

05-DevOps-Jenkins自动拉取构建代码

新建Gitlab仓库 先在Gitab上创建一个代码仓库&#xff0c;选择创建空白项目 安装说明进行填写&#xff0c;然后点击创建项目 创建好的仓库是空的&#xff0c;什么都没有 新建一个springboot项目&#xff0c;用于代码上传使用。 只是为了测试代码上传功能&#xff0c;所以代码…

C#核心(24)结构体和类的区别,抽象类和接口的区别(面试常问)

前言 随着上一节我们对StringBulider的讲解落下帷幕&#xff0c;c#核心的知识点我们也即将告一段落,我们讲完了面向对象要用的三大特性&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;和七大原则。期中自然也不乏一些小的散的碎的的知识点。 今天我们要讲的也…

HTMLCSS实现异环网站,期末web作业

本网站是我在学习前端时敲得&#xff0c;仅供学习使用。 这段代码是一个完整的 HTML 网页项目&#xff0c;包含 HTML、CSS 和 JavaScript 部分&#xff0c;用于构建一个名为 “异环” 的网页。网页具备头部导航栏、主体视频展示、图片交互元素、音乐播放控制、视频弹窗播放以及…

Oracle表的别名不能用as,列的别名可以用as

在 Oracle 数据库中&#xff0c;‌表的别名‌和‌列的别名‌在使用 AS 关键字时确实有不同规则&#xff0c;以下是详细说明&#xff1a; 1. 表的别名&#xff08;Table Alias&#xff09;‌ ‌不支持 AS 关键字‌&#xff0c;直接跟在表名后即可。‌语法示例‌&#xff1a; S…

【SAP ME 44】在 HANA DB中报废SFC时的SHOP_ORDER表记录锁定

症状 SELECT…FROM SHOP_ORDER FOR UPDATE 在 SFC 报废期间持有锁,当同时调用数量较大时,可能会导致 HANA 数据库出现大量锁积压。这有时会导致因等待 HANA 数据库释放“选择更新”锁而导致报废 SFC 花费数分钟。 HANA 数据库日志中的示例: # begin PreparedStatement_ex…

Vscode开发Vue项目NodeJs启动报错处理

文章目录 背景一、npm启动报错报错信息定位原因处理方案第一步、下载安装高版本 二、node 无法识别报错信息处理方案定位原因第一步、检测环境变量第二步、重新开启界面 背景 使用Vscode开发Vue项目&#xff0c;使用到NodeJs&#xff0c;记录出现的问题及处理方案&#xff0c;…

破局遗留系统!AI自动化重构:从静态方法到Spring Bean注入实战

在当今快速发展的软件行业中,许多企业都面临着 Java 遗留系统的维护和升级难题。这些老旧系统往往采用了大量静态方法,随着业务的不断发展,其局限性日益凸显。而飞算 JavaAI 作为一款强大的 AI 工具,为 Java 遗留系统的重构提供了全新的解决方案,能够实现从静态方法到 Spring B…

2025妈妈杯数学建模C题完整分析论文(共36页)(含模型建立、可运行代码、数据)

2025 年第十五届 MathorCup 数学建模C题完整分析论文 目录 摘 要 一、问题分析 二、问题重述 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1代码&#xff08;仅供参考&#xff09; 4.1.4问题1求解结果&#xff08;仅…

【Python爬虫详解】第一篇:Python爬虫入门指南

什么是网络爬虫&#xff1f; 网络爬虫&#xff08;Web Crawler&#xff09;是一种自动获取网页内容的程序。它可以访问网站&#xff0c;抓取页面内容&#xff0c;并从中提取有价值的数据。在信息爆炸的时代&#xff0c;爬虫技术可以帮助我们高效地收集、整理和分析互联网上的海…

【JavaWeb后端开发02】SpringBootWeb + Https协议

课程内容&#xff1a; SpringBootWeb 入门 Http协议 SpringBootWeb案例 分层解耦 文章目录 1. SpringBootWeb入门1.1 概述1.2 入门程序1.2.1 需求1.2.2 开发步骤1.2.3 常见问题 1.3 入门解析 2. HTTP协议2.1 HTTP概述2.1.1 介绍2.1.2 特点 2.2 HTTP请求协议2.2.1 介绍2.2.2…

MATLAB 控制系统设计与仿真 - 37

范数鲁棒控制器的设计 鲁棒控制器的设计 根据双端子状态方程对象模型结构&#xff0c;控制器设计的目标是找到一个控制器K(s),它能保证闭环系统的范数限制在一个给定的小整数下&#xff0c;即 这时控制器的状态方程为&#xff1a; 其中X与Y分别为下面两个代数Riccati方程的解…

依赖冲突,缺失插件导致无法启动项目 强制安装命令(npm install --legacy-peer-deps)

小白终成大白 文章目录 小白终成大白前言总结 前言 运维工程师说搞一个自动化打包流程 在服务器装了hbuilder 找前端来启动项目 我没启动起来 … 启动报错 failed to load config from D:\zhuque-uniapp\vite.config.js 16:17:31.601 error when starting dev server: 16:17:3…