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

相关推荐
Zelman9451 小时前
第06章-交互与观察动作空间
人工智能
冬奇Lab1 小时前
开源项目第258期:Harness² —— Google Research 的「递归式 Agent Harness 优化」,模型权重不动,只改 Agent 的外壳
人工智能·开源
字节跳动视频云技术团队2 小时前
每两家头部手机厂商就有一家选它:火山引擎如何成为 AI 手机助手的“隐形底座”?
人工智能
泯泷3 小时前
像项目经理一样指挥 AI 团队:管理者模式
人工智能·llm·agent
京东云开发者3 小时前
双11囤Token火了:京东搜索量暴涨7倍,AI生产力成新刚需
人工智能
ahccqw3 小时前
OpenCV 车辆数量统计
人工智能·opencv·计算机视觉
人工智能AI技术4 小时前
LangGraph 本地 build 频频翻车,最终在服务器跑通流式对话
人工智能
Flynn Liang4 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
汤姆宝库4 小时前
构建一个能用的RAG系统:切块、嵌入、混合检索与融合排序
人工智能