OpenCV进阶操作:角点检测

文章目录

  • 一、角点检测
    • 1、定义
    • 2、检测流程
      • 1)输入图像
      • 2)图像预处理
      • 3)特征提取
      • 4)角点检测
      • 5)角点定位和标记
      • 6)角点筛选或后处理(可选)
      • 7)输出结果
  • 二、Harris 角点检测(经典方法)
    • 1、参数解释
    • 2、图片的读取以及灰度转换
    • 3、检测角点,并对响应值进行阈值处理
  • 三、Shi-Tomasi 角点检测(Good Features to Track)
    • 1、参数解释
    • 2、代码示例
  • 四、FAST 角点检测(快速角点检测)
    • 1、参数解释
    • 2、代码示例
  • 总结


一、角点检测

1、定义

在计算机视觉中,角点检测是识别图像中局部区域(角点)的关键技术,这些区域通常是两条或多条边缘的交点,具有丰富的结构信息,常用于图像匹配、跟踪、三维重建等任务。

Harris角点检测算法是一种常用的计算机视觉算法,用于检测图像中的角点。该算法通过计算图像中每个像素的局部自相关矩阵,来判断该像素是否为角点。
在这里插入图片描述

2、检测流程

1)输入图像

将待检测的图像作为输入。

2)图像预处理

对输入图像进行必要的预处理,如灰度化、降噪等,以便更好地进行角点检测。

3)特征提取

使用角点检测算法对预处理后的图像进行角点特征提取。常见的角点检测算法有Harris角点检测算法、Shi-Tomasi角点检测算法等。

4)角点检测

根据所选的角点检测算法,计算图像中的每个像素点的角点响应值,以判断其是否为角点。具体算法会根据不同的方法而有所差异。

5)角点定位和标记

根据角点响应值,确定角点的位置,并进行标记。可以使用函数或算法来绘制或返回角点的位置信息。

6)角点筛选或后处理(可选)

根据具体需求,可以对检测到的角点进行筛选或进行后处理操作,如非极大值抑制、阈值过滤等,以去除不准确的角点或增强有效的角点。

7)输出结果

根据需要,可以将检测到的角点的位置信息、图像中绘制的标记或其他相关信息作为输出结果。

二、Harris 角点检测(经典方法)

1、参数解释

角点指图像中局部区域与周围区域有较大灰度变化的点或像素。
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相同,值越大,对应像素点是角的概率越高

2、图片的读取以及灰度转换

img = cv2.imread('huanghelou.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

3、检测角点,并对响应值进行阈值处理

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)

在这里插入图片描述

三、Shi-Tomasi 角点检测(Good Features to Track)

1、参数解释

corners = cv2.goodFeaturesToTrack(gray_img, maxCorners, qualityLevel, minDistance)
参数:
maxCorners:最多检测的角点数量(若角点数量超过,按响应值降序筛选)。
qualityLevel:角点质量阈值(0~1,值越小保留的角点越多,通常取 0.01~0.1)。
minDistance:角点之间的最小像素距离(避免密集角点)。
输出:角点坐标数组(形状为 (N, 1, 2),N 为角点数量)。

2、代码示例

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()

在这里插入图片描述

四、FAST 角点检测(快速角点检测)

1、参数解释

fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True)
corners = fast.detect(gray_img, None)
参数:
threshold:灰度差异阈值(值越小,检测到的角点越多)。
nonmaxSuppression:是否启用非极大值抑制(建议设为 True,避免密集角点)。
输出:KeyPoint 对象列表,包含角点坐标、大小等信息。

2、代码示例

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()

在这里插入图片描述


总结

角点检测是计算机视觉中的一种特征检测方法,用于寻找图像中的角点或者具有角点特征的图像区域。角点是指图像中突然改变方向的点,即在其周围的不同方向上都有较大的灰度变化。角点具有一些特殊性质,如旋转不变性、尺度不变性和光照不变性等,因此在图像处理和计算机视觉中具有广泛的应用。

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

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

相关文章

江苏正力新能Verify认知能力测评笔试已通知 | SHL测评题库预测题 | 华东同舟求职讲求职

江苏正力新能入职笔试通知,Verify(认知能力测评),用时约46分钟,其中正式测试部分计时36分钟;时间到了试卷会自动提交,请合理安排答题时间!前面有10分钟练习时间,可以略过…

在若依里创建新菜单

首先打开左侧菜单栏的系统管理,然后点击菜单管理 可以点击左上角的新增,也可以点击右侧对应目录的新增 这里我选择了右侧的新增,即在系统管理目录下新增菜单 其中的组件路径就是写好的页面的路径 (从views的下一级开始写即可&…

【AI知识库云研发部署】RAGFlow + DeepSeek

可以分成两台机器部署,一台gpu,一台cpu,cpu的机器运行ragflow的主程序,使用模型时才访问gpu。当然全部在一台机器上部署是完全ok的。全文没有复杂的环境问题 gpu 安装screen:yum install screen 配置ollama: 下载官方安装脚本并执行: curl -fsSL https://ollama.co…

Java后端开发day40--异常File

(以下内容全部来自上述课程) 异常 异常:异常就是代表程序出现的问题 1. 异常的分类 1.1 Error 代表的是系统级别的错误(属于严重问题) 系统一旦出现问题,sun公司会把这些错误封装成Error对象。 Error…

算法思想之深度优先搜索(DFS)、递归以及案例(最多能得到多少克黄金、精准核酸检测、最富裕的小家庭)

深度优先搜索(DFS)、递归 深度优先搜索(Depth First Search,DFS)是一种用于遍历或搜索树或图的算法。在 DFS 算法中,从起始节点开始,沿着一条路径尽可能深地访问节点,直到到达叶子节…

Spark,HDFS客户端操作

hadoop客户端环境准备 找到资料包路径下的Windows依赖文件夹,拷贝hadoop-3.1.0到非中文路径(比如d:\hadoop-3.1.0) ① 打开环境变量 ② 在下方系统变量中新建HADOOP_HOME环境变量,值就是保存hadoop的目录。 效果如下: ③ 配置Pa…

共享会议室|物联网解决方案:打造高效、智能的会议空间!

在数字化转型的浪潮下,企业、园区、公共机构的会议室面临诸多痛点,如何通过物联网技术实现会议室资源的智能调度、环境设备的自动化控制以及用户体验的全面升级?本文将结合行业实践与技术方案,探讨基于物联网的共享会议室解决方案…

ts bug 找不到模块或相应类型的声明,@符有红色波浪线

解决方法&#xff1a;在env.d.ts文件中添加以下代码&#xff0c;这段代码是一个 TypeScript 的声明文件&#xff0c;用于让 TypeScript 知道如何处理 Vue 单文件组件&#xff08;.vue 文件&#xff09;的导入。 /// <reference types"vite/client" /> // 声明…

端口隔离基本配置

1.top图 2.交换机配置 # sysname sw1 # vlan batch 10 # interface GigabitEthernet0/0/1port link-type trunkport trunk allow-pass vlan 10 # interface GigabitEthernet0/0/2port link-type trunkport trunk allow-pass vlan 10sys sw2 # vlan batch 10 # interface Giga…

Android View#post()源码分析

文章目录 Android View#post()源码分析概述onCreate和onResume不能获取View的宽高post可以获取View的宽高总结 Android View#post()源码分析 概述 在 Activity 中&#xff0c;在 onCreate() 和 onResume() 中是无法获取 View 的宽高&#xff0c;可以通过 View#post() 获取 Vi…

SecureCrt设置显示区域横列数

1. Logical rows //逻辑行调显示区域高度的 一般超过50就全屏了 2. Logical columns //逻辑列调显示区域宽度的 3. Scrollback buffer //缓冲区大小

最短路径-Dijkstra算法板子(java)

自己把Dijkstra的板子整理了一下&#xff0c;也方便自己后续做题&#xff0c;在此做个记录。 Dijkstra基本上都会需要这些变量&#xff1a; dist[]&#xff1a;记录各个节点到起始节点的最短权值 path[]&#xff1a;记录各个节点的上一个节点(用来联系该节点到起始节点的路径)…

PostgreSQL数据库的array类型

PostgreSQL数据库相比其它数据库&#xff0c;有很多独有的字段类型。 比如array类型&#xff0c;以下表的pay_by_quarter与schedule两个字段便是array类型&#xff0c;即数组类型。 CREATE TABLE sal_emp (name text,pay_by_quarter integer[],schedule t…

centos的根目录占了大量空间怎么办

问题 当根目录磁盘不够时&#xff0c;就必须删除无用的文件了 上面的&#xff0c;如果删除/usr 或/var是可以释放出系统盘的 定位占空间大的文件 经过命令&#xff0c;一层层查哪些是占磁盘的。 du -sh /* | sort -rh | head -n 10 最终排查&#xff0c;是有个系统日志占了20…

PostgreSQL存储过程“多态“实现:同一方法名支持不同参数

引言 在传统编程语言中&#xff0c;方法重载&#xff08;同一方法名不同参数&#xff09;是实现多态的重要手段。但当我们将目光转向PostgreSQL数据库时&#xff0c;是否也能在存储过程&#xff08;函数&#xff09;中实现类似的功能&#xff1f;本文将深入探讨PostgreSQL中如…

快速学会Linux的WEB服务

一.用户常用关于WEB的信息 什么是WWW www是world wide web的缩写&#xff0c;及万维网&#xff0c;也就是全球信息广播的意思 通常说的上网就是使用www来查询用户所需要的信息。 www可以结合文字、图形、影像以及声音等多媒体&#xff0c;超链接的方式将信息以Internet传递到世…

Windows玩游戏的时候,一按字符键就显示桌面

最近打赛伯朋克 2077 的时候&#xff0c;不小心按错键了&#xff0c;导致一按字符键就显示桌面。如下&#xff1a; 一开始我以为是输入法的问题&#xff08;相信打游戏的人都知道输入法和奔跑键冲突的时候有多烦&#xff09;&#xff0c;但是后来解决半天发现并不是。在网上搜…

【测试开发】概念篇 - 从理解需求到认识常见开发、测试模型

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

核函数(Kernel function)

核函数 核函数在GPU上进行并行执行 注意: 限定词__global__修饰 [双下划线]返回值必须是void 形式: _global_ void kernel_function( argument arg){ ​ printf(“hello world from the GPU\n”); } void __global__kernel_function( argument arg){ ​ printf(“hello worl…

数据结构与算法:区间dp

前言 区间dp也是动态规划里很重要的一部分。 一、内容 区间dp的根本原理就是把大范围问题分解成若干小范围的问题去求解。一般来讲,常见的用法有对于两侧端点去展开可能性和对于范围上的划分点去展开可能性。 二、题目 1.让字符串成为回文串的最少插入次数 class Soluti…