OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
无匹配项
霍夫圆变换

上一教程: 霍夫线变换
下一教程: 使用广义 Ballard 和 Guil 霍夫变换进行目标检测

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

目标

在本教程中,您将学习如何

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

理论

霍夫圆变换

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

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

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

  • 为了提高效率,OpenCV 实现了一种比标准霍夫变换略微复杂一点的检测方法: *霍夫梯度法*,它由两个主要阶段组成。第一阶段涉及边缘检测和查找可能的圆心,第二阶段为每个候选中心查找最佳半径。更多详细信息,请查看《学习 OpenCV》这本书或您最喜欢的计算机视觉文献。

程序功能

  • 加载图像并对其进行模糊处理以减少噪声
  • 对模糊后的图像应用 *霍夫圆变换*。
  • 在一个窗口中显示检测到的圆。

代码

说明

我们使用的图像可以从这里找到

加载图像

转换为灰度图像

应用中值模糊以减少噪声并避免错误的圆圈检测

继续应用霍夫圆变换

  • 参数:
    • gray: 输入图像(灰度)。
    • circles: 一个向量,存储一组 3 个值:\(x_{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: 要检测的最大半径。如果未知,则默认为零。

绘制检测到的圆圈

可以看到,我们将用红色绘制圆圈,用小的绿色点绘制中心。

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

结果

使用测试图像运行上述代码的结果如下所示