OpenCV(三十九):Harris角点检测

Harris 角点检测简介

Harris 角点检测(Harris Corner Detector)是计算机视觉中经典的特征点检测算法,由 Chris Harris 和 Mike Stephens 在 1988 年提出。它用于从图像中找到"角点"(Corner),也称为兴趣点(Interest Point),这些点通常是图像中梯度变化最大的区域,对图像匹配、跟踪、三维重建和 SLAM 等任务非常重要。

角点的典型特征是:横向、纵向方向上都有强烈梯度变化。例如,建筑物的窗角、棋盘格的交点、物体边缘的转折点等。

Harris 检测器的优点:

  • 不受图像旋转影响(旋转不变)
  • 稳定性较好
  • 计算量比 SIFT/SURF 小,适合实时场景
  • 在噪声不大、光照稳定的情况下效果优秀

缺点:

  • 不具有尺度不变性(大小变化检测不稳)
  • 对噪声敏感
  • 角点响应值需要阈值判断

角点的基本思想:灰度变化矩阵

Harris 算法的核心思想来自 图像灰度变化矩阵(Structure Tensor)

对于图像中任意一个小窗口,Harris 算法会衡量"窗口在各个方向上的移动会让灰度变化多大"。如果向任意方向移动都会造成显著变化,这个点就是角点。

数学思想如下:

给定图像 I(x, y),考虑其在小范围内的移动:

其中:

  • (u, v) 是窗口移动偏移量
  • w 是窗口权值函数(一般为高斯核)
  • E(u,v) 描述移动后引起的灰度变化

经过泰勒展开并保留一阶项,可得:

代入后得到:

其中:

矩阵 M 就是 结构张量,反映局部区域的梯度分布。

Harris 响应函数 R

Harris 定义角点响应值:

其中:

  • det(M) = λ1·λ2
  • trace(M) = λ1 + λ2
  • λ1、λ2 是 M 的特征值
  • k 为经验参数(常取 0.04~0.06)

特征值对应的意义:

  • λ1 和 λ2 都大 → 角点
  • λ1 大 λ2 小 → 边缘
  • λ1 和 λ2 都小 → 平坦区域

因此 R 的意义如下:

  • R > 0 → 角点
  • R < 0 → 边缘
  • R ≈ 0 → 平坦区域

OpenCV 会对 R 图进行阈值处理,找出显著角点。

Harris 角点检测流程

  1. 读入图像并转灰度
  2. 求图像梯度 Ix、Iy
  3. 构造结构张量 M
  4. 根据公式计算 R
  5. 通过阈值选出显著角点
  6. 用圆点或颜色标记角点位置

OpenCV 的 Harris API

OpenCV 提供的函数:

python 复制代码
cv2.cornerHarris(src, blockSize, ksize, k)

参数解释:

参数 含义
src 输入灰度图(float32)
blockSize 计算结构张量 M 的窗口大小
ksize Sobel 导数核大小(一般 = 3)
k Harris 常数(0.04~0.06)

示例

python 复制代码
import cv2
import numpy as np

# 读取图像
img = cv2.imread("test.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 转 float32 ------ Harris 要求
gray = np.float32(gray)

# Harris 角点检测
harris = cv2.cornerHarris(
    gray,
    blockSize=2,   # 窗口大小
    ksize=3,       # Sobel算子
    k=0.04         # Harris参数
)

# 对结果膨胀处理,便于显示
harris = cv2.dilate(harris, None)

# 阈值显示角点
threshold = 0.01 * harris.max()

# 标记角点位置为红色
result = img.copy()
result[harris > threshold] = [0, 0, 255]

# ------------------------------
# 调整显示尺寸,适应电脑屏幕
# ------------------------------

def resize_for_display(img, max_width=800, max_height=600):
    h, w = img.shape[:2]
    scale_w = max_width / w
    scale_h = max_height / h
    scale = min(scale_w, scale_h, 1.0)  # 不放大,只缩小
    new_w, new_h = int(w*scale), int(h*scale)
    resized = cv2.resize(img, (new_w, new_h))
    return resized

harris_disp = resize_for_display(harris)
result_disp = resize_for_display(result)

# 创建可伸缩窗口
cv2.namedWindow("Harris Response", cv2.WINDOW_NORMAL)
cv2.namedWindow("Corners", cv2.WINDOW_NORMAL)

cv2.imshow("Harris Response", harris_disp)
cv2.imshow("Corners", result_disp)
cv2.waitKey(0)
cv2.destroyAllWindows()

执行效果:

参数调节建议

  1. blockSize(常用 2~4)

    • 小值:对小角点敏感,但容易受噪声干扰

    • 大值:检测更稳定,但可能漏检

  2. ksize(常用 3)

​ 越大越平滑,越不敏感。

  1. k(常用 0.04~0.06)

​ 调节角点响应力度:

  • 小 k(0.04):角点较多

  • 大 k(0.06):角点更严格

Harris 角点的优势与局限

优势

  1. 计算简单,适合实时应用
  2. 对图像旋转不敏感
  3. 角点定位准确
  4. 适合特征匹配和跟踪任务(如 Lucas-Kanade 光流)

局限

  1. 不具备尺度不变性(放大后的图像角点无法检测)
  2. 对噪声敏感,通常需要高斯模糊
  3. 对遮挡和光照变化敏感
  4. 无法描述角点(不能用于匹配,只能用于检测)

总结

Harris 角点检测是一种经典而高效的局部特征检测方法,尽管它缺乏尺度不变性,但仍然广泛应用于棋盘格标定、目标跟踪、图像配准等任务中。

相关推荐
chian-ocean2 小时前
量化加速实战:基于 `ops-transformer` 的 INT8 Transformer 推理
人工智能·深度学习·transformer
那个村的李富贵2 小时前
从CANN到Canvas:AI绘画加速实战与源码解析
人工智能·ai作画·cann
水月wwww2 小时前
【深度学习】卷积神经网络
人工智能·深度学习·cnn·卷积神经网络
晚霞的不甘2 小时前
CANN 在工业质检中的亚像素级视觉检测系统设计
人工智能·计算机视觉·架构·开源·视觉检测
island13142 小时前
CANN HIXL 高性能单边通信库深度解析:PGAS 模型在异构显存上的地址映射与异步传输机制
人工智能·神经网络·架构
前端摸鱼匠3 小时前
YOLOv8 环境配置全攻略:Python、PyTorch 与 CUDA 的和谐共生
人工智能·pytorch·python·yolo·目标检测
结局无敌3 小时前
构建百年工程:cann/ops-nn 的可持续演进之道
人工智能·cann
MSTcheng.3 小时前
CANN算子开发新范式:基于ops-nn探索aclnn两阶段调用架构
人工智能·cann
renhongxia13 小时前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
做人不要太理性3 小时前
CANN Runtime 运行时与维测组件:异构任务调度、显存池管理与全链路异常诊断机制解析
人工智能·自动化