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(),使用简单,可在图像和视频中快速检测角点。

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

相关推荐
2501_9381400740 分钟前
做内容很省心,2026好用AI笔记,支持抖音小红书视频无水印保存
人工智能
sell-cloud3 小时前
Prompt Engineering要凉了?Fable 5.5能“猜“意图,但银行正在封杀AI Agent——企业AI的真正护城河是什么
人工智能·prompt
Navicat中国5 小时前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI5 小时前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区5 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
XCDoris7 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy8 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V8 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI8 小时前
AI英语教培智能体的开发
人工智能
物联网软硬件开发-轨物科技8 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人