本节摘要:SOURCE 5.4 Harris:结构张量特征值判定角点;SIFT DoG 尺度空间极值。本节动手
cornerHarris与SIFT_create检测关键点。
import cv2, numpy as np img = cv2.imread('chess.png', 0) img = np.float32(img) dst = cv2.cornerHarris(img, blockSize=2, ksize=3, k=0.04) dst = cv2.dilate(dst, None) img_mark = cv2.imread('chess.png') img_mark[dst > 0.01*dst.max()] = [0,0,255]
角点:梯度在两个方向变化都大 — 平坦区与边缘响应低。
sift = cv2.SIFT_create() kp = sift.detect(img, None) img_kp = cv2.drawKeypoints(img_mark, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

ORB 用 FAST 角点 + 方向 — 实时应用。cv2.FastFeatureDetector_create()。
| 检测器 | 尺度不变 | 速度 |
|---|---|---|
| Harris | 否 | 快 |
| SIFT | 是 | 慢 |
| ORB | 部分 | 很快 |
contrastThreshold 关系⚠️ 常见坑:Harris 对尺度变化敏感 — 大图缩小后角点位置漂移。
💡 关键直觉:关键点要可重复 — 同一物理点在视角变化下仍被检出。
下一节 SIFT/ORB 描述子。
特征要满足"可重复性":同一物理点在不同视角下都能被找到。平坦区域周围像素都差不多,无法唯一定位;边缘在一侧变化剧烈、另一侧平稳,只能定位到"在哪条线上";角点两个方向都变化剧烈,能被唯一确定。Harris 用结构张量(局部梯度二阶矩矩阵)的两个特征值刻画这种"变化程度":两个特征值都大 → 角点;一个大一个小 → 边缘;都小 → 平坦区。响应函数 R 综合两个特征值,阈值化 R 即得角点。这是理解角点检测的完整逻辑链。
import cv2, numpy as np # 手工计算 Harris 响应的核心:结构张量 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY).astype(np.float32) gx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) gy = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) A = cv2.GaussianBlur(gx*gx, (3,3), 0) C = cv2.GaussianBlur(gy*gy, (3,3), 0) B = cv2.GaussianBlur(gx*gy, (3,3), 0) # R = det - k*trace^2,k 一般取 0.04-0.06 R = (A*C - B*B) - 0.04 * (A + C)**2
Harris 角点对尺度变化敏感:同一个角点在缩小后的图像里可能变成平滑拐角,检测不出来。SIFT 的关键创新是在"尺度空间"里找极值——把图像按不同尺度的高斯模糊堆叠成金字塔,在金字塔里找 DoG(高斯差分)的局部极值。这样选出的关键点自带"尺度"属性:某尺度下的极值说明该尺度上这个点最突出。再配合子像素定位和主方向分配,SIFT 关键点对平移、旋转、尺度变化都有鲁棒性。尺度空间的本质是"在不同细节层次上看同一个点",这也是金字塔思想的延伸。
FAST 角点检测比较圆周上 16 个像素与中心点的亮度差异,超过阈值的连续像素足够多即判定为角点,没有梯度计算,速度极快但天然不含尺度信息。ORB = FAST 检测 + 方向计算 + BRIEF 描述,它用灰度质心法给每个 FAST 角点算一个主方向,让描述子具备旋转不变性。在实时应用(SLAM 前端、AR、嵌入式视觉)里,ORB 是性价比最高的选择。选型经验:离线高精度匹配用 SIFT,实时系统用 ORB,简单棋盘标定用 Harris 就够。
不同检测器输出的关键点信息不同:Harris 只给坐标和响应强度,SIFT 给坐标、尺度、方向、响应,ORB 给坐标、方向、响应。尺度与方向信息是描述子(下节)旋转尺度不变的前提。检测器本身不做匹配,关键点要配合描述子才能用于图像配准,这是"检测"与"描述"两步分离的基本分工。
实验建议:把棋盘格旋转 45 度和缩放到一半,分别用 Harris 与 SIFT 检测,比较同一物理角点的重复检出率;再用 cornerHarris 的响应图和 R 值分布观察角点、边缘、平坦区在 R 值上的差异。这组实验能直观验证"可重复性"这个核心概念。
关于 Harris 参数的直观理解:blockSize 是计算结构张量时的邻域大小(越大对噪声越稳但角点响应越钝),ksize 是 Sobel 核大小,k 是响应公式中的经验常数。调参时先固定 k,调整 blockSize 看角点密度变化,是标准的做法。
最后补一个概念辨析:角点检测和边缘检测共享梯度计算的基础,但目的不同——边缘检测输出"线",角点检测输出"点"。点是更高层的语义单元,更适合作为后续匹配和几何估计的锚点。
补一个评估视角:关键点检测的质量看三个指标——重复率(同一物理点在变换后仍被检出的比例)、定位精度(检出位置的误差)、数量分布(是否集中在纹理稀疏区)。实验里可以用"旋转加缩放后的重复率"来对比 Harris 与 SIFT,这也是学术上评估检测器的标准做法。另外,检测器的参数(contrastThreshold、nfeatures)控制输出关键点的数量和纯度,量产系统通常先用 nfeatures 限制数量保证匹配耗时可控,再调阈值保证关键点不过度集中。理解"数量与质量"的平衡,是特征检测调参的核心。