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()
参数调节建议
- maxCorners
- 数量越多 → 检测更多角点
- 数量太少 → 可能漏掉重要角点
- qualityLevel
- 范围 [0,1]
- 0.01~0.05 常用
- 越大 → 角点质量要求越高,检测角点越少
- minDistance
- 避免角点过于密集
- 设置为窗口大小或物体特征间距
- blockSize
- 窗口越大 → 角点更稳定,但精度略低
- 窗口越小 → 对细节敏感,但易受噪声干扰
hi-Tomasi 优势与局限
优势
- 无需 Harris 参数 k → 更稳定
- 角点定位精确 → 适合光流跟踪
- 计算量小 → 可用于实时视频处理
- 简单易用 → 直接调用
goodFeaturesToTrack
局限
- 不具备尺度不变性 → 图像放大/缩小角点位置会变化
- 对噪声敏感 → 高噪声图像需先做滤波
- 没有描述子 → 仅检测角点,需要其他方法提取描述子(如 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 参数,可以根据应用场景得到稀疏或密集、精确或鲁棒的角点检测效果。