OpenCv高阶(四)——角点检测

一、角点检测

在计算机视觉中,角点检测是识别图像中局部区域(角点)的关键技术,这些区域通常是两条或多条边缘的交点,具有丰富的结构信息,常用于图像匹配、跟踪、三维重建等任务。

Harris角点检测算法是一种常用的计算机视觉算法,用于检测图像中的角点。该算法通过计算图像中每个像素的局部自相关矩阵,来判断该像素是否为角点。

角点检测算法的基本思想:

使用一个固定的小窗口在图像上进行任意方向的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化(sobel算子,在图像的边缘检测中有详细解释),那么我们可以认为该窗口中存在角点。

1、Harris 角点检测(经典方法)

1. 原理

基于图像局部灰度变化,通过计算像素点在x/y 方向的梯度 ,构建结构张量矩阵 (梯度自相关矩阵),再通过响应函数判断是否为角点:

复制代码
角点指图像中局部区域与周围区域有较大灰度变化的点或像素。
cornerHarris(img, blockSize, ksize, k[, dst[, borderType]]) -> dst
    • img:单通道灰度图像(数据类型为 float32)。
  • blockSize: 计算角点时考虑的邻域大小(如 2 表示 2x2 邻域)。
  • ksize:Sobel 梯度计算的核大小(常用 3)。
  • k: 响应函数中的参数,影响角点检测的敏感度(k 越小,检测到的角点越多)。,取值参数为 [0.04,0.06]。
   dst:返回numpy.ndarray对象,大小和src相同,值越大,对应像素点是角的概率越高

1、图片的读取以及灰度转换

复制代码
img = cv2.imread('huanghelou.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

2、检测角点,并对响应值进行阈值处理

复制代码
dst = cv2.cornerHarris(gray,4,3,0.04)
# 标记检测到的角点
img[dst > 0.01 * dst.max()] = [0, 255, 0]
# 这里通过对角点响应进行阈值处理,标记出检测到的角点。
# 0.05 * dst.max() 是一个阈值,大于这个值的像素点会被标记为绿色。
cv2.imshow('img',img)
cv2.waitKey(0)

2、Shi-Tomasi 角点检测(Good Features to Track)

1. 原理

Harris 算法的改进版,直接利用矩阵 M 的最小特征值判断角点:

  • 若最小特征值大于阈值,则认为是角点(相比 Harris 更鲁棒,尤其在图像跟踪中表现更好)。
2. OpenCV 函数
复制代码
corners = cv2.goodFeaturesToTrack(gray_img, maxCorners, qualityLevel, minDistance)
  • 参数
    • maxCorners:最多检测的角点数量(若角点数量超过,按响应值降序筛选)。
    • qualityLevel:角点质量阈值(0~1,值越小保留的角点越多,通常取 0.01~0.1)。
    • minDistance:角点之间的最小像素距离(避免密集角点)。
  • 输出 :角点坐标数组(形状为 (N, 1, 2),N 为角点数量)。
3. 示例代码
复制代码
import cv2
import numpy as np

img = cv2.imread('building.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Shi-Tomasi角点检测
corners = cv2.goodFeaturesToTrack(gray, maxCorners=100, qualityLevel=0.01, minDistance=10)
corners = np.int0(corners)  # 转换为整数坐标

# 绘制角点
for corner in corners:
    x, y = corner.ravel()
    cv2.circle(img, (x, y), 3, (0, 255, 0), -1)  # 绿色圆点标记

cv2.imshow('Shi-Tomasi Corners', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3、FAST 角点检测(快速角点检测)

1. 原理

基于像素灰度差异的高效角点检测算法,核心思想是:若某像素点与其周围 16 个像素中的 N 个(如 9 个)灰度差异足够大,则认为是角点(称为 FAST-9)。

  • 优点:速度极快,适合实时应用。
  • 缺点:对噪声敏感,需结合非极大值抑制(NMS)筛选角点。
2. OpenCV 函数
复制代码
fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True)
corners = fast.detect(gray_img, None)
  • 参数
    • threshold:灰度差异阈值(值越小,检测到的角点越多)。
    • nonmaxSuppression:是否启用非极大值抑制(建议设为 True,避免密集角点)。
  • 输出KeyPoint 对象列表,包含角点坐标、大小等信息。
3. 示例代码
复制代码
import cv2

img = cv2.imread('fast_corner.jpg', cv2.IMREAD_GRAYSCALE)

# 创建FAST检测器
fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True)

# 检测角点
corners = fast.detect(img, None)

# 绘制角点
img_color = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cv2.drawKeypoints(img_color, corners, img_color, color=(0, 255, 0), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

cv2.imshow('FAST Corners', img_color)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、算法对比与选择

算法 优点 缺点 适用场景
Harris 经典方法,检测稳定 计算量大,角点密集 学术研究、全局角点检测
Shi-Tomasi 跟踪效果好,抑制边缘响应 依赖参数调优 图像跟踪(如 LK 光流)
FAST 速度极快,适合实时应用 对噪声敏感,需 NMS 实时系统(如无人机、机器人)

三、注意事项

  1. 输入图像预处理

    • 必须为单通道灰度图(彩色图需先转换为灰度图)。
    • 建议先进行高斯模糊降噪(如 cv2.GaussianBlur),减少噪声对角点检测的影响。
  2. 参数调优

    • qualityLevel(Shi-Tomasi)和 threshold(FAST)需根据图像对比度调整,避免检测到过多或过少角点。
    • minDistance 用于控制角点密度,避免相邻过近的角点。
  3. 角点响应可视化

    • Harris 的响应值需通过阈值(如全局最大值的 1%~5%)筛选后标记。
    • Shi-Tomasi 和 FAST 可直接通过坐标绘制角点。

总结

角点检测是图像特征提取的基础步骤,OpenCV 提供了从经典(Harris)到高效(FAST)的多种算法。选择时需结合场景需求:

  • 追求精度和稳定性:Shi-Tomasi(推荐用于跟踪任务)。
  • 追求速度:FAST(需配合 NMS 和降噪)。
  • 学术研究或通用场景:Harris(理解角点检测的数学原理)。 通过合理调整参数和预处理,可有效提升角点检测的效果,为后续计算机视觉任务奠定基础。
相关推荐
江畔柳前堤3 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术3 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客3 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术4 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO4 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术5 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架5 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab5 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI5 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算
冬奇Lab5 小时前
【无标题】
人工智能·开源