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

相关推荐
IvanCodes18 小时前
我做了一个软著 Skill,可以一键生成申请材料
人工智能·agent
狂奔蜗牛(bradley)19 小时前
RKNN‑Toolkit2 模型转换全流程
人工智能
双星系统19 小时前
双臂机器人迎来广阔应用风口!既是工业柔性主力,也是人形机器人优质上肢配件
人工智能·机器人
羚羊角uou19 小时前
【AI agent】RAG 全链路深度详解及RAG调优策略
人工智能
甲维斯19 小时前
国内外模型3D台球大赛,DS垫底,Claude最强!
人工智能·游戏开发
CTA终结者19 小时前
先用小策略练清条件和动作
人工智能·python
hhzz19 小时前
《深度学习框架PyTorch入门与实践》系列:11-实战猫狗大战之可复用的PyTorch项目架构
人工智能·pytorch·深度学习
Bruce_Liuxiaowei19 小时前
从零到可运行:基于 Vue3 + FastAPI + DeepSeek-V3 的 AI 英语单词学习系统全栈实战
人工智能·python·学习·fastapi·全栈·智能体
kaixin_啊啊19 小时前
香精近红外总体步骤概览
人工智能·matlab·近红外
u01030552719 小时前
昇腾Model-Agent端云协同架构解析
人工智能