计算机视觉(opencv)实战十九——角点检测图像特征(Harris 角点、Shi-Tomasi 角点)

发布于:2025-09-15 ⋅ 阅读:(13) ⋅ 点赞:(0)


角点检测详解

1. 什么是角点?

在计算机视觉中,**角点(Corner)**指的是图像中灰度变化剧烈、具有显著方向性的特征点,通常位于两个边缘的交点处。
角点具有以下特性:

  • 方向唯一性:从角点向任意方向移动,灰度都会明显变化。

  • 稳定性好:在图像平移、旋转、尺度变化时仍能被检测到。

  • 稀疏性强:角点数量远少于边缘或纹理区域,计算代价低。

常见的角点包括:

  • 物体轮廓的拐角

  • 窗口、门框等直角边缘

  • 图案、棋盘格的交叉点

角点检测是许多计算机视觉任务的基础,例如:

  • 图像配准(Image Registration)

  • 相机标定(Camera Calibration)

  • 运动跟踪(Object Tracking)

  • 特征匹配(Feature Matching)

角点检测的作用非常广泛,它是计算机视觉和图像处理里的“基础积木”。简单来说,角点是图像中最容易识别和跟踪的点,因此很多高阶任务都会用到它。以下给你总结一下主要用途:


1. 特征匹配与图像拼接

  • 角点可以用来表示图像的局部特征。

  • 在两张图像中找到相同的角点后,可以实现特征匹配,进而估计它们的几何关系。

  • 应用场景:

    • 全景拼接:通过匹配不同照片中的角点来对齐、拼合图像。

    • 三维重建:利用多张图片中同一点的角点匹配,推算出3D空间坐标。


2. 相机标定(Camera Calibration)

  • 标定板上的黑白棋盘格角点非常适合角点检测,因为它们清晰且稳定。

  • 检测到角点后,可求解相机的内外参,从而完成畸变矫正。

  • 这是很多机器人、AR/VR 系统必做的步骤。


3. 目标跟踪(Object Tracking)

  • 角点在视频帧之间的移动可以用来估计物体运动轨迹。

  • 常用算法:Lucas-Kanade 光流法,就是在角点附近跟踪像素块。

  • 应用场景:

    • 行人、车辆跟踪

    • 运动分析(体育、工业)


4. SLAM 和 AR 应用

  • SLAM(Simultaneous Localization and Mapping)依赖角点或特征点来识别场景中稳定的锚点。

  • AR 眼镜、ARKit 等用角点做特征跟踪,让虚拟物体“粘”在真实世界的表面。


5. 特征描述与识别

  • 角点是提取局部特征描述子的天然选择(如 SIFT、ORB、BRISK)。

  • 有助于:

    • 目标识别

    • 模式识别

    • 图像检索


6. 机器人导航与路径规划

  • 移动机器人或无人机利用角点检测识别环境特征,从而构建地图。

  • 在无 GPS 环境下,也可以通过角点进行视觉里程计(Visual Odometry)。


总结一句话:
角点检测的作用就是帮计算机找到“独特且稳定的兴趣点”,方便后续做匹配、跟踪、定位、识别等任务。


2. 角点检测的数学原理

设灰度图像为 I(x,y)I(x,y),考虑一个小窗口 WW 在图像上的平移 (u,v)(u,v),计算窗口内的灰度差平方和:

对 I(x+u,y+v)进行一阶泰勒展开:

代入后得:

其中,矩阵 MM 称为结构张量(Second Moment Matrix),它反映了窗口内的梯度分布情况。
通过求 MM 的特征值 λ1,λ2\lambda_1,\lambda_2 可判断该区域特性:

  • 平坦区域:λ1≈0,λ2≈0

  • 边缘区域:一个特征值大,一个接近 0

  • 角点区域:两个特征值都较大


3. 常用角点检测算法

3.1 Harris 角点检测

Harris 算法利用矩阵 MM 的行列式和迹构造响应函数:

其中:

  • det⁡(M)=λ1λ2

  • trace⁡(M)=λ1+λ2

  • k∈[0.04,0.06]为经验参数

当 R>0 且数值较大时,该点为角点。
优点:

  • 计算效率高

  • 稳定性好
    缺点:

  • 对尺度不变性不敏感


3.2 Shi-Tomasi (Good Features to Track)

Shi-Tomasi 算法直接使用最小特征值判断角点:

R=min⁡(λ1,λ2)

只要最小特征值大于阈值,就认为该点是角点。
这种方法比 Harris 更稳定,因为避免了参数 kk 带来的不确定性,常用于光流跟踪(如 Lucas-Kanade 光流)。


3.3 FAST 角点检测

FAST(Features from Accelerated Segment Test)是一种更快的角点检测算法:

  1. 以候选点为中心,取周围 16 个像素。

  2. 选定阈值 tt,比较这些像素与中心像素灰度差。

  3. 若有至少连续的 n 个像素亮度都大于中心 +t 或小于中心 -t,则判定为角点。

优点:速度快,适合实时应用
缺点:不如 Harris 稳定,容易受噪声干扰


4. OpenCV 实现示例

下面给出一个对比 Harris 和 Shi-Tomasi 的示例代码:

import cv2
import numpy as np

# 读取图像并转为灰度
img = cv2.imread('chessboard.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# ---------- Harris 角点 ----------
gray_f = np.float32(gray)
harris = cv2.cornerHarris(gray_f, blockSize=2, ksize=3, k=0.04)
harris = cv2.dilate(harris, None)
img_harris = img.copy()
img_harris[harris > 0.01 * harris.max()] = [0, 0, 255]

# ---------- Shi-Tomasi 角点 ----------
corners = cv2.goodFeaturesToTrack(gray, maxCorners=100, qualityLevel=0.01, minDistance=10)
img_shi = img.copy()
for corner in corners:
    x, y = corner.ravel()
    cv2.circle(img_shi, (int(x), int(y)), 3, (0, 255, 0), -1)

cv2.imshow('Harris Corners', img_harris)
cv2.imshow('Shi-Tomasi Corners', img_shi)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码解析:

  • cv2.cornerHarris:执行 Harris 角点检测

    • blockSize: 窗口大小

    • ksize: Sobel 算子大小

    • k: Harris 响应参数

  • cv2.goodFeaturesToTrack:执行 Shi-Tomasi 算法

    • maxCorners: 最大检测角点数

    • qualityLevel: 阈值(相对于最大角点响应)

    • minDistance: 角点间的最小距离


5. 结果对比

  • Harris 检测会产生较多响应点,可能需要后处理(非极大值抑制)。

  • Shi-Tomasi 输出点更稳定且更适合光流跟踪。

  • FAST 速度最快,但可能产生误检。


6. 总结

角点检测是特征提取的重要步骤,常用于目标跟踪、特征匹配和 3D 重建。
选用建议:

  • 若追求稳定性 → Shi-Tomasi

  • 若需要速度 → FAST

  • 若进行特征描述 → 通常与 SIFT、ORB 等结合使用