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 参数,可以根据应用场景得到稀疏或密集、精确或鲁棒的角点检测效果

相关推荐
NAGNIP6 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab7 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab7 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP11 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年11 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼11 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS11 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区12 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈12 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang13 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx