OpenCV 4.12.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实现了一种比标准霍夫变换稍微复杂一些的检测方法:霍夫梯度法,它由两个主要阶段组成。第一阶段涉及边缘检测和寻找可能的圆心,第二阶段为每个候选圆心找到最佳半径。欲了解更多详情,请查阅《Learning 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: 要检测的最小半径。如果未知,默认为0。
    • max_radius = 0: 要检测的最大半径。如果未知,默认为0。

绘制检测到的圆

你可以看到,我们用红色绘制圆,并用小绿点标记圆心。

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

结果

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