OpenCV:Harris、Shi-Tomasi角点检测

news2025/2/1 7:39:58

简述

在计算机视觉和图像处理领域,角点是一种重要的特征点,通常是图像中梯度变化剧烈的区域,例如建筑物的拐角、棋盘的交点等。角点检测广泛应用于目标跟踪、运动检测、拼接全景图 等任务。

本文将介绍 Harris 角点检测Shi-Tomasi 角点检测,分析它们的原理、实现方法以及应用场景,并通过代码示例展示它们的实际效果。


1. 什么是角点?

在图像中:

  • 平坦区域:无明显变化(如纯色背景)。
  • 边缘:沿某一方向变化剧烈,但垂直方向变化较小。
  • 角点:在多个方向上都发生剧烈变化,如物体的拐角处。

如何检测角点?
角点检测的基本思想是计算图像窗口在不同方向上的灰度变化,并找到变化最明显的点。Harris 角点检测和 Shi-Tomasi 角点检测都基于这个原理,但实现方式不同。


2. Harris 角点检测

2.1 Harris 角点检测的原理

Harris 角点检测由 Chris Harris 和 Mike Stephens 提出,基于 自相关矩阵(Structure Tensor) 计算每个像素点的变化情况。

Harris 角点检测的数学表达式如下:

R = det(M) - k \times (trace(M))^2

其中:

  • M 是图像窗口的二阶导数矩阵(梯度协方差矩阵)。
  • det(M) trace(M) 分别表示矩阵的行列式和迹。
  • 是经验参数,通常取 0.04 ~ 0.06。

2.2 Harris 角点检测的特点

优点:

  • 计算速度快,适合大规模图像处理。
  • 能检测到旋转不变的角点。

缺点:

  • 对噪声敏感,容易误检测。
  • 不能区分最优的角点(即可能会选择一些不稳定的角点)。

2.3 Harris 角点检测的示例

 代码示例:

import cv2
import numpy as np

# Harris点
# 光滑地区,无论向哪里移动,衡量系数不变
# 边缘地址,垂直边缘移动时,衡量系数变化剧烈
# 在交点处,往哪个方向移动,衡量系数都变化剧烈

# 读取图像
image = cv2.imread("D:\\resource\\filter\\shudu.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Harris角点检测
harris = cv2.cornerHarris(gray, 2, 3, 0.04)

#harris 角点检测展示
image[harris >0.01*harris.max()] = [0,0,255]

# 显示结果
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 运行效果:

接口说明:

cv2.cornerHarris() 是 OpenCV 提供的 Harris 角点检测 函数,用于检测图像中的角点。

cv2.cornerHarris(src, blockSize, ksize, k)

参数说明: 

参数说明
src输入图像(灰度图),类型必须为 np.float32
blockSize角点检测计算窗口的大小,通常取 2 或 3
ksizeSobel 算子的卷积核大小,通常取 3
kHarris 角点响应公式中的自由参数,通常取 0.04 ~ 0.06

3. Shi-Tomasi 角点检测

3.1 Shi-Tomasi 角点检测的原理

Shi-Tomasi 角点检测是 Harris 角点检测的改进版。它基于最小特征值法,认为:

一个好的角点,其最小特征值应该足够大。

Shi-Tomasi 角点检测的公式:

R = min(\lambda _{1}, \lambda_{2})

其中:

  • λ1​,λ2​ 是特征矩阵的两个特征值。 

相比 Harris 角点检测,Shi-Tomasi 直接使用最小特征值进行排序,而不是计算 RRR 值,能够得到更稳定的角点。

3.2 Shi-Tomasi 角点检测的特点

优点:

  • 更稳定:选出的角点质量更高,适用于目标跟踪。
  • 噪声鲁棒性更强,不易误检测。

缺点:

  • 计算比 Harris 角点略慢。

3.3 Shi-Tomasi 角点检测的示例

代码示例:

import cv2
import numpy as np

# 读取图像
image = cv2.imread("D:\\resource\\filter\\shudu.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Harris角点检测
# harris = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)

# harris 角点检测展示
# image[harris >0.01*harris.max()] = [0,0,255]

corners = cv2.goodFeaturesToTrack(gray, maxCorners=1000, qualityLevel=0.1, minDistance=10)
corners = np.int0(corners)

# Shi-Tomasi绘制角点
for i in corners:
    x,y = i.ravel()
    cv2.circle(image, (x,y), 3, (0,0,255), -1)

# 显示结果
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果:

接口说明:

cv2.goodFeaturesToTrack() 是 OpenCV 提供的一种 Shi-Tomasi 角点检测 方法,适用于跟踪的优质特征点算法。它是一种改进版的 Harris 角点检测,可以找到更稳定的角点。

cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance, mask=None, blockSize=3, useHarrisDetector=False, k=0.04)

 参数说明:

参数名说明
image输入图像(必须是 单通道灰度图 np.uint8 类型)。
maxCorners设定最大角点数量,若检测到的角点数目大于 maxCorners,则返回最强的 maxCorners 个角点。
qualityLevel角点的 最低质量阈值,取值范围 0~1,数值越高,选出的角点质量越高,但数量会减少。
minDistance角点间的 最小欧式距离(单位:像素)。若检测到的两个角点距离小于 minDistance,则剔除其中一个。
mask可选参数,设定一个 ROI 掩码(None 表示检测整幅图像)。
blocksize计算角点时使用的 窗口大小(默认为 3)。
useHarrisDetector是否使用 Harris 角点检测器(默认为 False,即使用 Shi-Tomasi 算法)。
k仅在 useHarrisDetector=True 时生效,表示 Harris 角点检测的 自由参数(通常取 0.04)。

    4. Harris 与 Shi-Tomasi 角点检测的差异

    特性Harris 角点检测Shi-Tomasi 角点检测
    检测原理角点响应值 R最小特征值 λ
    稳定性稍逊更稳定,角点质量更优
    噪声鲁棒性较差较好
    适用场景结构分析运动跟踪、目标检测

    选择建议:

    • 需要检测更多角点、对噪声不敏感 → Harris
    • 需要检测高质量角点、用于目标跟踪 → Shi-Tomasi

    5. 应用场景

    5.1 目标跟踪 🎯

    使用 Shi-Tomasi 角点 提取关键点,并结合 光流法(Lucas-Kanade Optical Flow)实现目标跟踪。

    5.2 图像配准 📸

    在两张图像中检测角点(如 SIFT/SURF + Harris 角点),进行特征点匹配。

    5.3 三维重建 🏗

    通过多张图片检测角点,建立点云模型,重建3D 物体。


    6. 总结

    Harris 角点检测 基于矩阵行列式和迹,检测速度快,但对噪声敏感。Shi-Tomasi 角点检测 基于最小特征值,角点质量更高,适用于目标跟踪。在目标跟踪、图像匹配、3D 重建等任务中,Shi-Tomasi 角点通常表现更优。

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

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

    相关文章

    零代码搭建个人博客—Zblog结合内网穿透发布公网

    目录 一、准备工作二、Z-blog 网站搭建1. XAMPP 环境设置2. Z-blog 安装3. Z-blog 网页测试 三、内网穿透工具 Cpolar 的安装和配置1. Cpolar 安装2. Cpolar 云端设置3. Cpolar 本地设置 四、本地网页发布五、注意六、本次经历总结 大家好,我是学问小小谢。 最近心血…

    宏_wps_宏修改word中所有excel表格的格式_设置字体对齐格式_删除空行等

    需求: 将word中所有excel表格的格式进行统一化,修改其中的数字类型为“宋体, 五号,右对齐, 不加粗,不倾斜”,其中的中文为“宋体, 五号, 不加粗,不倾斜” 数…

    xss靶场

    xss-labs下载地址&#xff1a;GitHub - do0dl3/xss-labs: xss 跨站漏洞平台 xss常见触发标签&#xff1a;XSS跨站脚本攻击实例与防御策略-CSDN博客 level-1 首先查看网页的源代码发现get传参的name的值test插入了html里头&#xff0c;还回显了payload的长度。 <!DOCTYPE …

    线段树(Segment Tree)和树状数组

    线段树&#xff08;Segment Tree&#xff09;和树状数组 线段树的实现链式&#xff1a;数组实现 解题思路树状数组 线段树是 二叉树结构 的衍生&#xff0c;用于高效解决区间查询和动态修改的问题&#xff0c;其中区间查询的时间复杂度为 O(logN)&#xff0c;动态修改单个元素的…

    MySQL注入中load_file()函数的使用

    前言 在Msql注入中&#xff0c;load_file()函数在获得webshell以及提权过程中起着十分重要的作用&#xff0c;常被用来读取各种配置文件 而load_file函数只有在满足两个条件的情况下才可以使用&#xff1a; 文件权限&#xff1a;chmod ax pathtofile 文件大小&#xff1a;必须…

    DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?

    近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域发展迅猛&#xff0c;大语言模型&#xff08;LLMs&#xff09;为通用人工智能&#xff08;AGI&#xff09;的发展开辟了道路。OpenAI 的 o1 模型表现非凡&#xff0c;它引入的创新性推理时缩放技术显著提升了推理能力…

    使用Pygame制作“贪吃蛇”游戏

    贪吃蛇 是一款经典的休闲小游戏&#xff1a;玩家通过操控一条会不断变长的“蛇”在屏幕中移动&#xff0c;去吃随机出现的食物&#xff0c;同时要避免撞到墙壁或自己身体的其他部分。由于其逻辑相对简单&#xff0c;但可玩性和扩展性都不错&#xff0c;非常适合作为新手练习游戏…

    海外问卷调查如何影响企业的经营?在品牌建设中有何指导意义?

    市场调查的定义&#xff1a;通过科学的方法&#xff0c;有目的地、系统地搜集整理一些市场信息&#xff0c;其目的在于了解当下市场现状和发展前景&#xff0c;为企业生产和品牌打造提供一些科学的指导意见&#xff0c;这是任何大企业、中小企业、初创企业都必须重视的一个重要…

    unity学习23:场景scene相关,场景信息,场景跳转

    目录 1 默认场景和Assets里的场景 1.1 scene的作用 1.2 scene作为project的入口 1.3 默认场景 2 场景scene相关 2.1 创建scene 2.2 切换场景 2.3 build中的场景&#xff0c;在构建中包含的场景 &#xff08;否则会认为是失效的Scene&#xff09; 2.4 Scenes in Bui…

    CPU 100% 出现系统中断 怎么解决

    CPU 100% 出现系统中断 怎么解决 电脑开机时会掉帧&#xff0c;切换到桌面时就会卡顿&#xff0c;然后打开任务管理器就会看到系统中断的cpu占用率达到100%&#xff0c;过一段时间再打开还是会有显示100%的占用率&#xff0c;这个问题怎么解决&#xff1f; 文章目录 CPU 100% …

    数据分析系列--⑥RapidMiner构建决策树(泰坦尼克号案例含数据)

    一、资源下载 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 2.划分训练集和测试集 3.应用模型 4.结果分析 一、资源下载 点击下载数据集 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 虽然决策树已经构建,但对于大多数初学者或…

    【MyDB】4-VersionManager 之 4-VM的实现

    【MyDB】4-VersionManager 之 4-VM的实现 VM 的实现VM(VersionManager)的基本定义与实现优化具体功能实现begin()开启事务commit()提交事务abort 中止事务read 读取uid对应的数据记录所在的entryinsert方法&#xff0c;插入数据delete方法 VM 的实现 本章代码位于&#xff1a;t…

    计算机网络 笔记 传输层

    概述&#xff1a; 主要功能&#xff1a; TCP&#xff1a; 特点***&#xff1a; 数据格式&#xff1a; 连接管理***&#xff1a; 建立连接&#xff08;三次握手&#xff09; 释放连接&#xff08;四次挥手&#xff09; 应用场景 UDP&#xff1a; 特点&#xff1a; 数…

    (leetcode 213 打家劫舍ii)

    代码随想录&#xff1a; 将一个线性数组换成两个线性数组&#xff08;去掉头&#xff0c;去掉尾&#xff09; 分别求两个线性数组的最大值 最后求这两个数组的最大值 代码随想录视频 #include<iostream> #include<vector> #include<algorithm> //nums:2,…

    《TCP 网络编程实战:开发流程、缓冲区原理、三次握手与四次挥手》

    一、 TCP 网络应用程序开发流程 学习目标 能够知道TCP客户端程序的开发流程1. TCP 网络应用程序开发流程的介绍 TCP 网络应用程序开发分为: TCP 客户端程序开发TCP 服务端程序开发说明: 客户端程序是指运行在用户设备上的程序 服务端程序是指运行在服务器设备上的程序,专门…

    把本地搭建的hexo博客部署到自己的服务器上

    配置远程服务器的git 安装git 安装依赖工具包 yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel安装编译工具 yum install -y gcc perl-ExtUtils-MakeMaker package下载git&#xff0c;也可以去官网下载了传到服务器上 wget https://www.ke…

    接口使用实例(1)

    大家好&#xff0c;今天我们来看看接口的一些实例&#xff0c;关于如何定义和实现接口&#xff0c;相信通过这些例子&#xff0c;我们能有一些清晰的认知。 先定义一个学生类&#xff1a; 再给定一个学生数组&#xff0c;对这个对象数组中的元素进行排序&#xff08;按分数排&…

    Git 版本控制:基础介绍与常用操作

    目录 Git 的基本概念 Git 安装与配置 Git 常用命令与操作 1. 初始化本地仓库 2. 版本控制工作流程 3. 分支管理 4. 解决冲突 5. 回退和撤销 6. 查看提交日志 前言 在软件开发过程中&#xff0c;开发者常常需要在现有程序的基础上进行修改和扩展。但如果不加以管理&am…

    跨境数据传输问题常见解决方式

    在全球化经济的浪潮下&#xff0c;跨境数据传输已然成为企业日常运营的关键环节。随着数字贸易的蓬勃发展和跨国业务的持续扩张&#xff0c;企业在跨境数据处理方面遭遇了诸多棘手难题。那么&#xff0c;面对这些常见问题&#xff0c;企业该如何应对&#xff1f;镭速跨境数据传…

    python-leetcode-删除链表的倒数第 N 个结点

    19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def removeNthFromEnd(self…