OpenCV:Harris、Shi-Tomasi角点检测
简述
在计算机视觉和图像处理领域,角点是一种重要的特征点,通常是图像中梯度变化剧烈的区域,例如建筑物的拐角、棋盘的交点等。角点检测广泛应用于目标跟踪、运动检测、拼接全景图 等任务。
本文将介绍 Harris 角点检测 和 Shi-Tomasi 角点检测,分析它们的原理、实现方法以及应用场景,并通过代码示例展示它们的实际效果。
1. 什么是角点?
在图像中:
- 平坦区域:无明显变化(如纯色背景)。
- 边缘:沿某一方向变化剧烈,但垂直方向变化较小。
- 角点:在多个方向上都发生剧烈变化,如物体的拐角处。
如何检测角点?
角点检测的基本思想是计算图像窗口在不同方向上的灰度变化,并找到变化最明显的点。Harris 角点检测和 Shi-Tomasi 角点检测都基于这个原理,但实现方式不同。
2. Harris 角点检测
2.1 Harris 角点检测的原理
Harris 角点检测由 Chris Harris 和 Mike Stephens 提出,基于 自相关矩阵(Structure Tensor) 计算每个像素点的变化情况。
Harris 角点检测的数学表达式如下:
其中:
- M 是图像窗口的二阶导数矩阵(梯度协方差矩阵)。
- det(M) 和 trace(M) 分别表示矩阵的行列式和迹。
- k 是经验参数,通常取 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 |
| ksize | Sobel 算子的卷积核大小,通常取 3 |
| k | Harris 角点响应公式中的自由参数,通常取 0.04 ~ 0.06 |
3. Shi-Tomasi 角点检测
3.1 Shi-Tomasi 角点检测的原理
Shi-Tomasi 角点检测是 Harris 角点检测的改进版。它基于最小特征值法,认为:
一个好的角点,其最小特征值应该足够大。
Shi-Tomasi 角点检测的公式:
其中:
- λ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 角点通常表现更优。
相关文章:
OpenCV:Harris、Shi-Tomasi角点检测
简述 在计算机视觉和图像处理领域,角点是一种重要的特征点,通常是图像中梯度变化剧烈的区域,例如建筑物的拐角、棋盘的交点等。角点检测广泛应用于目标跟踪、运动检测、拼接全景图 等任务。 本文将介绍 Harris 角点检测 和 Shi-Tomasi 角点…...
RK3568 opencv播放视频
文章目录 一、opencv相关视频播放类1. cv::VideoCapture 类主要构造方法:主要方法: 2. 视频播放基本流程代码示例: 3. 获取和设置视频属性4. 结合 FFmpeg 使用5. OpenCV 视频播放的局限性6. 结合 Qt 实现更高级的视频播放总结 二、QT中的代码…...
白话DeepSeek-R1论文(一)|AI的顿悟时刻:DeepSeek-R1-Zero 纯强化学习解锁推理新境界
最近有不少朋友来询问Deepseek的技术核心,今天开始陆续针对DeepSeek-R1论文中的核心内容进行解读,并且用大家都能听懂的方式来解读。 AI的顿悟时刻:DeepSeek-R1-Zero 纯强化学习解锁推理新境界 你有没有想过,人工智能是如何学会…...
青少年编程与数学 02-008 Pyhon语言编程基础 10课题、列表与循环语句
青少年编程与数学 02-008 Pyhon语言编程基础 10课题、列表与循环语句 一、列表二、定义与使用定义列表访问列表元素访问列表的切片修改列表元素列表的其他操作 三、运算1. 列表连接(Concatenation)2. 列表复制(Copying)3. 列表重复…...
caddy2配置http_basic用于验证用户名密码才允许访问页面
参考: basicauth (Caddyfile指令) — Caddy v2中文文档 1,查看caddy是否已经包含了Basic Auth插件 命令:caddy list-modules | grep http_basic 如果显示: http.authentication.providers.http_basic 则代表包含 Basic Auth 模…...
FOC核心原理的C语言实现
概述 应用FOC算法,比如无人机、电动汽车或工业电机控制。因此,除了理论,还需要提供实用的实现步骤、常见问题及解决方案,比如如何获取电机的位置信息(编码器或传感器),如何处理电流采样&#x…...
利用Manim库结合`matplotlib`、`numpy`和`scipy`来制作工作流程动画
以下是一个利用Manim库结合matplotlib、numpy和scipy来制作工作流程动画,展示流场速度分布计算模型,以及三流喷嘴的速度场和主要参数分布的可视化图形与动画的示例代码。这个示例将模拟一个简化的三流喷嘴速度场,通过计算速度分布并将其可视化…...
零代码搭建个人博客—Zblog结合内网穿透发布公网
目录 一、准备工作二、Z-blog 网站搭建1. XAMPP 环境设置2. Z-blog 安装3. Z-blog 网页测试 三、内网穿透工具 Cpolar 的安装和配置1. Cpolar 安装2. Cpolar 云端设置3. Cpolar 本地设置 四、本地网页发布五、注意六、本次经历总结 大家好,我是学问小小谢。 最近心血…...
宏_wps_宏修改word中所有excel表格的格式_设置字体对齐格式_删除空行等
需求: 将word中所有excel表格的格式进行统一化,修改其中的数字类型为“宋体, 五号,右对齐, 不加粗,不倾斜”,其中的中文为“宋体, 五号, 不加粗,不倾斜” 数…...
electron 应用开发实践
参考链接: https://blog.csdn.net/2401_83384536/article/details/140549279...
xss靶场
xss-labs下载地址:GitHub - do0dl3/xss-labs: xss 跨站漏洞平台 xss常见触发标签:XSS跨站脚本攻击实例与防御策略-CSDN博客 level-1 首先查看网页的源代码发现get传参的name的值test插入了html里头,还回显了payload的长度。 <!DOCTYPE …...
Koa 基础篇(二)—— 路由与中间件
let app new Koa() router.get(“/”,async ctx > { ctx.body “hello koa router” }) app.use(router.routes()) app.use(router.allowedMethods()) app.listen(3000) 运行项目,在浏览器访问本地3000端口,在页面上就会看到输出的语句。这就…...
Day48:获取字典键的值
在 Python 中,字典是一种无序的集合类型,它以键-值对的形式存储数据。字典的每个元素都有一个唯一的键,并且每个键都对应一个值。获取字典中的值是字典操作的常见任务,今天我们将学习如何从字典中获取键对应的值。 1. 使用方括号…...
线段树(Segment Tree)和树状数组
线段树(Segment Tree)和树状数组 线段树的实现链式:数组实现 解题思路树状数组 线段树是 二叉树结构 的衍生,用于高效解决区间查询和动态修改的问题,其中区间查询的时间复杂度为 O(logN),动态修改单个元素的…...
MySQL注入中load_file()函数的使用
前言 在Msql注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件 而load_file函数只有在满足两个条件的情况下才可以使用: 文件权限:chmod ax pathtofile 文件大小:必须…...
[NOIP2007]矩阵取数游戏
点我写题 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有元素; 2.每次取走的…...
DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?
近年来,人工智能(AI)领域发展迅猛,大语言模型(LLMs)为通用人工智能(AGI)的发展开辟了道路。OpenAI 的 o1 模型表现非凡,它引入的创新性推理时缩放技术显著提升了推理能力…...
使用Pygame制作“贪吃蛇”游戏
贪吃蛇 是一款经典的休闲小游戏:玩家通过操控一条会不断变长的“蛇”在屏幕中移动,去吃随机出现的食物,同时要避免撞到墙壁或自己身体的其他部分。由于其逻辑相对简单,但可玩性和扩展性都不错,非常适合作为新手练习游戏…...
云计算技术深度解析与实战案例
云计算技术深度解析与实战案例 引言 随着信息技术的飞速发展,云计算作为一种革命性的技术模式,已经渗透到各行各业,成为推动数字化转型的关键力量。本文旨在深入探讨云计算的技术特点、应用场景,并通过一个具体的代码使用案例&a…...
deb安装失败后,无法再安装别的包的解决方案
把package_name换成出安装问题的包 移除该包的安装标记 sudo dpkg --remove --force-remove-reinstreq package_name清理残留文件和配置 sudo apt-get purge package_name...
海外问卷调查如何影响企业的经营?在品牌建设中有何指导意义?
市场调查的定义:通过科学的方法,有目的地、系统地搜集整理一些市场信息,其目的在于了解当下市场现状和发展前景,为企业生产和品牌打造提供一些科学的指导意见,这是任何大企业、中小企业、初创企业都必须重视的一个重要…...
脚本运行禁止:npm 无法加载文件,因为在此系统上禁止运行脚本
问题与处理策略 1、问题描述 npm install -D tailwindcss执行上述指令,报如下错误 npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本。 有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_…...
unity学习23:场景scene相关,场景信息,场景跳转
目录 1 默认场景和Assets里的场景 1.1 scene的作用 1.2 scene作为project的入口 1.3 默认场景 2 场景scene相关 2.1 创建scene 2.2 切换场景 2.3 build中的场景,在构建中包含的场景 (否则会认为是失效的Scene) 2.4 Scenes in Bui…...
CPU 100% 出现系统中断 怎么解决
CPU 100% 出现系统中断 怎么解决 电脑开机时会掉帧,切换到桌面时就会卡顿,然后打开任务管理器就会看到系统中断的cpu占用率达到100%,过一段时间再打开还是会有显示100%的占用率,这个问题怎么解决? 文章目录 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方法,插入数据delete方法 VM 的实现 本章代码位于:t…...
2024-2025自动驾驶技术演进与产业破局的深度实践——一名自动驾驶算法工程师的年度技术总结与行业洞察
一、引言:站在自动驾驶的"技术奇点" 2024年是自动驾驶行业从"技术验证"迈向"商业化落地"的关键转折点。从特斯拉FSD V12的端到端技术突破,到中国L3法规的破冰,从大模型重构感知架构,到城市NOA的&qu…...
计算机网络 笔记 传输层
概述: 主要功能: TCP: 特点***: 数据格式: 连接管理***: 建立连接(三次握手) 释放连接(四次挥手) 应用场景 UDP: 特点: 数…...
(leetcode 213 打家劫舍ii)
代码随想录: 将一个线性数组换成两个线性数组(去掉头,去掉尾) 分别求两个线性数组的最大值 最后求这两个数组的最大值 代码随想录视频 #include<iostream> #include<vector> #include<algorithm> //nums:2,…...
《TCP 网络编程实战:开发流程、缓冲区原理、三次握手与四次挥手》
一、 TCP 网络应用程序开发流程 学习目标 能够知道TCP客户端程序的开发流程1. TCP 网络应用程序开发流程的介绍 TCP 网络应用程序开发分为: TCP 客户端程序开发TCP 服务端程序开发说明: 客户端程序是指运行在用户设备上的程序 服务端程序是指运行在服务器设备上的程序,专门…...
