OpenCV  4.10.0
开源计算机视觉
加载中...
搜索中...
无匹配结果
霍夫圆变换

上一个教程: 霍夫线变换
下一个教程: 使用广义巴拉德-吉尔霍夫变换进行物体检测

作者Ana Huamán
兼容性OpenCV >= 3.0

目标

在本教程中,你将学习

  • 如何使用 OpenCV 函数 HoughCircles() 检测图像中的圆。

原理

霍夫圆变换

  • 霍夫圆变换的工作方式与前一个教程中解释的霍夫线变换大致类似。
  • 在检测线的情况下,一条线由两个参数 \((r, \theta)\) 定义。在检测圆的情况下,我们需要三个参数来定义一个圆

    \[C : ( x_{center}, y_{center}, r )\]

    其中\((x_{center}, y_{center})\) 定义圆心位置(绿点),\(r\) 是半径,通过该半径,我们可以完全定义一个圆,如下所示

  • 出于效率的考虑,OpenCV 实现了一种比标准霍夫变换稍微复杂一些的检测方法:霍夫梯度法,该法由两个主要阶段组成。第一阶段涉及边缘检测和查找可能的圆心,第二阶段为每个候选圆心找到最佳半径。如需了解更多详情,请查看图书Learning OpenCV 或你最喜欢的计算机视觉参考书目

该程序的作用是什么?

  • 加载图像并对其进行模糊处理以降低噪声
  • 对模糊图像应用霍夫圆变换
  • 在窗口中显示已检测的圆。

代码

说明

我们使用的图像可以在 此处 找到

加载图像

将其转换为灰度

应用中值模糊以降低噪点并避免错误的圆形检测

继续应用霍夫圆变换

  • 使用以下参数
    • gray: 输入图像(灰度)。
    • circles: 一个向量,其中存储每组的 3 个值:\(\_{c}, y_{c}, r\) 用于每个检测到的圆形。
    • HOUGH_GRADIENT: 定义检测方法。目前,这是 OpenCV 中唯一可以使用的。
    • dp = 1: 分辨率的逆比率。
    • min_dist = gray.rows/16: 检测到的中心之间的最小距离。
    • param_1 = 200: 内部 Canny 边缘检测器的较高阈值。
    • param_2 = 100*: 中心检测阈值。
    • min_radius = 0: 检测到的最小半径。如果未知,则默认设置为零。
    • max_radius = 0: 检测到的最大半径。如果未知,则默认设置为零。

绘制检测到的圆形

您可以看到我们将用红色绘制圆形,用小绿点绘制中心

显示检测到的圆形并等待用户退出程序

结果

以下显示了使用测试图像运行以上代码的结果