角点检测:Harris 与 Shi-Tomasi

核心02-特征与匹配预计 25 分钟角点Harris特征点兴趣点

前置知识点

kp-003 边缘检测:从 Sobel 到 Canny

一句话定义

角点是局部邻域内沿两个以上方向亮度都显著变化的点;Harris 检测器用自相关矩阵的特征值把「平坦/边缘/角点」量化成一个可排序的响应值。

为什么重要

平移小块图像时,平坦区找不到位置、边缘沿走向滑动不定,只有角点能被唯一定位——它是传统视觉做跟踪、拼接、重建的第一枚「图像锚点」,也是理解「什么才算好的局部特征」的最小案例。

直观类比

在一扇纯色墙(平坦)、一条桌沿(边缘)和一个桌角(角点)上各按住一枚硬币并小幅晃动:墙上硬币挪来挪去没区别,桌沿硬币只能沿桌沿滑,桌角硬币怎么动画面都明显不同——「怎么动都变」就是角点的定义。

前置知识

kp-003(梯度估计)。

核心概念

原理与机制

对窗口内每个像素做一阶泰勒展开,平移能量近似为二次型 E(u,v) ≈ [u v] M [u v]ᵀ。M 的两个特征值给出三种情形:两个都小(平坦)、一个大一个小(边缘)、两个都大(角点)。Harris 用行列式与迹的组合避免显式求特征值(1988 年的算力考量,如今依然高效);k 常取 0.04–0.06。由于泰勒展开在旋转下协变、能量对亮度偏移不变,Harris 角点具有旋转不变性与亮度偏移不变性,但没有尺度不变性——放大图像后同一物理角点会丢检,这正是 kp-007 引入尺度空间的动机。

公式与模型

E(u, v) = Σ_{(x,y)∈W} w(x, y) · [ I(x+u, y+v) − I(x, y) ]² M = Σ w(x, y) · [ Ix² IxIy ; IxIy Iy² ] R = det(M) − k · trace(M)² = λ1λ2 − k(λ1 + λ2)²

图示

平坦:λ1 小 λ2 小 边缘:一大一小 角点:λ1 大 λ2 大 响应 R = det(M) − k·trace(M)²,取局部极大并过阈值 Shi-Tomasi 取 min(λ1, λ2),跟踪场景更稳

实例与案例

视觉里程计:SLAM 前端常用 Shi-Tomasi(goodFeaturesToTrack)选点,再用 LK 光流(kp-022)逐帧跟踪这些点,稳定且快。视频防抖:跟踪角点估计帧间全局运动,反向 warp 补偿。增强现实中角点 + 平面跟踪仍是无标记 AR 的经典方案。

import cv2
corners = cv2.goodFeaturesToTrack(gray, maxCorners=200, qualityLevel=0.01,
                                  minDistance=10, blockSize=3)   # Shi-Tomasi
dst = cv2.cornerHarris(gray_f, blockSize=2, ksize=3, k=0.04)   # Harris 响应图

常见误区

与其他知识点的关系

kp-008 给角点配描述子并跨图匹配;kp-007 把 Harris 的尺度缺陷补齐;kp-023 的相关滤波跟踪同样以「局部窗口可定位」为前提。

自测题

  1. 为什么边缘点不能作为唯一锚点?

答案要点:沿边缘走向平移窗口,能量几乎不变,位置不可唯一确定;角点沿任意方向平移都会引起显著变化。

  1. Harris 响应 R 中 det 与 trace 分别对应什么?

答案要点:det = λ₁λ₂,trace = λ₁+λ₂;两个特征值都大时 R 为大正值(角点),一大一小时 R 为负(边缘)。

  1. Harris 具备哪些不变性、缺什么?

答案要点:具备旋转不变与亮度偏移不变;缺少尺度不变与对大范围亮度尺度变化的稳健性。

延伸阅读

相关知识点

kp-008 描述子与匹配:从 BRIEF 到 ORBkp-003 边缘检测:从 Sobel 到 Canny