OpenCV(四十):Shi-Tomasi角点检测

Shi-Tomasi 角点检测简介

Shi-Tomasi 角点检测,也称 Good Features to Track (GFTT) ,是基于 Harris 角点检测的改进方法,由 Jianbo Shi 和 Carlo Tomasi 于 1994 年提出。其主要目标是检测可用于跟踪的稳定角点,尤其在光流跟踪和视频分析中广泛使用。

与 Harris 角点不同的是,Shi-Tomasi 直接使用结构张量的最小特征值作为角点响应,避免了 Harris 响应函数中经验参数 k 的依赖,使检测更加稳定和可靠。

角点检测原理

Shi-Tomasi 检测器同样基于 局部窗口灰度变化矩阵(结构张量)

  • Ix,Iy 是图像梯度
  • w(x,y) 是窗口权重,一般为方窗或高斯窗

特征值 λ1,λ2 表示窗口在两个方向上的灰度变化:

  • λ1和 λ2 都大 → 角点
  • 一大一小 → 边缘
  • 都小 → 平坦区域

Harris vs Shi-Tomasi

  • Harris 响应函数:
  • Shi-Tomasi 响应函数:

优势:

  • 不依赖经验参数 k
  • 对角点位置更稳定
  • 对光流跟踪效果更好

OpenCV API:cv2.goodFeaturesToTrack

python 复制代码
cv2.goodFeaturesToTrack(
    image,         # 输入灰度图
    maxCorners,    # 最多角点数量
    qualityLevel,  # 角点质量阈值
    minDistance,   # 角点之间最小距离
    mask=None,     # 掩码
    blockSize=3,   # 窗口大小
    useHarrisDetector=False, # 是否使用 Harris(False 表示 Shi-Tomasi)
    k=0.04         # Harris 参数,如果 useHarrisDetector=True 有效
)

参数说明:

参数 含义
image 灰度图(float32 或 uint8)
maxCorners 最多检测的角点数
qualityLevel 角点响应最小值相对于最大值的比例(0~1)
minDistance 检测出的角点之间最小欧氏距离
blockSize 计算角点的窗口大小
useHarrisDetector 是否使用 Harris 响应(False → Shi-Tomasi)
k Harris 参数,仅当 useHarrisDetector=True 有效

示例1

python 复制代码
import cv2
import numpy as np

# 读取图像
img = cv2.imread("test.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Shi-Tomasi 角点检测
corners = cv2.goodFeaturesToTrack(
    gray,
    maxCorners=100,       # 最多检测100个角点
    qualityLevel=0.01,    # 角点质量阈值
    minDistance=10,       # 角点最小间距
    blockSize=3,          # 计算角点的窗口大小
    useHarrisDetector=False
)

# 将角点坐标转换为整数
corners = np.intp(corners)

# 在图像上标记角点
for i in corners:
    x, y = i.ravel()
    cv2.circle(img, (x, y), 4, (0, 0, 255), -1)

# 显示图像
cv2.namedWindow("Shi-Tomasi Corners", cv2.WINDOW_NORMAL)
cv2.imshow("Shi-Tomasi Corners", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

执行效果:

示例2:在视频中实时检测角点

python 复制代码
import cv2
import numpy as np

cap = cv2.VideoCapture(0)  # 打开摄像头
while True:
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    corners = cv2.goodFeaturesToTrack(gray, 100, 0.01, 10)
    corners = np.intp(corners)
    
    for i in corners:
        x, y = i.ravel()
        cv2.circle(frame, (x, y), 3, (0, 255, 0), -1)
    
    cv2.imshow("Video Shi-Tomasi", frame)
    if cv2.waitKey(1) & 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()

参数调节建议

  1. maxCorners
    • 数量越多 → 检测更多角点
    • 数量太少 → 可能漏掉重要角点
  2. qualityLevel
    • 范围 0,1
    • 0.01~0.05 常用
    • 越大 → 角点质量要求越高,检测角点越少
  3. minDistance
    • 避免角点过于密集
    • 设置为窗口大小或物体特征间距
  4. blockSize
    • 窗口越大 → 角点更稳定,但精度略低
    • 窗口越小 → 对细节敏感,但易受噪声干扰

hi-Tomasi 优势与局限

优势

  1. 无需 Harris 参数 k → 更稳定
  2. 角点定位精确 → 适合光流跟踪
  3. 计算量小 → 可用于实时视频处理
  4. 简单易用 → 直接调用 goodFeaturesToTrack

局限

  1. 不具备尺度不变性 → 图像放大/缩小角点位置会变化
  2. 对噪声敏感 → 高噪声图像需先做滤波
  3. 没有描述子 → 仅检测角点,需要其他方法提取描述子(如 ORB、SIFT)

与Shi-Tomasi对比

特性 Harris Shi-Tomasi
响应函数 R = det(M) - k(trace(M))² R = min(λ1, λ2)
参数依赖 k 参数 无 k 参数,更稳定
定位精度 中等
光流跟踪 可用 更优
计算量

总结

  • Shi-Tomasi 是 Harris 的改进,使用最小特征值作为角点响应,避免了 k 参数,稳定性更好。
  • 对角点跟踪(如 LK 光流)效果优异,计算量小,适合实时视频应用。
  • 不具备尺度不变性,需要搭配描述子实现匹配。
  • OpenCV 提供 cv2.goodFeaturesToTrack(),使用简单,可在图像和视频中快速检测角点。

通过调整 maxCornersqualityLevelminDistanceblockSize 参数,可以根据应用场景得到稀疏或密集、精确或鲁棒的角点检测效果

相关推荐
ForDreamMusk19 小时前
高级优化器
人工智能·深度学习
Land032919 小时前
AI网页元素变化无法自动修复?自带元素自愈的自动化解决方案
运维·人工智能·ai·自动化·rpa
Kobebryant-Manba19 小时前
Bert预训练代码
人工智能·深度学习·bert
在水一缸19 小时前
深度解析 Grok 4.5:当推理模型遇上大规模工程实践
人工智能·深度学习·大模型·工程实践·推理模型·混合专家架构·grok 4.5
云智慧AIOps社区19 小时前
2026 国产化 ITSM 替代指南:横向测评 ServiceNow、轻帆云、Jira等五款主流IT服务管理平台
运维·人工智能·运维开发·it服务管理·itsm平台
学习日记52519 小时前
【提示词工程系统教程 05】上下文工程:静态指令、动态检索与RAG架构
人工智能·prompt
腻害兔19 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:ERP 企业资源模块,一个轻量级进销存的完整实现?
前端·javascript·vue.js·人工智能·前端框架·产品经理·ai编程
小羊Yveesss19 小时前
模板建站哪个平台好?模板数量之外还要比较编辑与SEO能力
大数据·人工智能·小程序
程序员-李俞20 小时前
向量引擎接入 SQL 问答沙箱前:只读权限、Base URL 和费用封顶怎么验收
人工智能·大模型·接口测试·api中转·ai api
梦想的初衷~20 小时前
植被遥感反演与数据同化算法体系教程:从PROSAIL前向模拟到作物估产
人工智能·python·机器学习·作物模型·遥感数据同化·prosail·植被参数反演