在机器视觉开发中,除了检测直线之外,圆形目标检测也是十分常见的需求,例如:
- 瓶盖检测
- 轴承检测
- 硬币识别
- 圆孔定位
- 医学图像分析
- 工业零件尺寸测量
OpenCV 提供了 霍夫圆变换(Hough Circle Transform),能够快速检测图像中的圆形目标。
本文将详细介绍霍夫圆检测原理、参数说明以及完整 Python 示例。
一、霍夫圆检测原理
现实中的圆可以由三个参数唯一确定:
- 圆心 xxx
- 圆心 yyy
- 半径 rrr
圆的数学公式:
(x−a)2+(y−b)2=r2
(x-a)^2 + (y-b)^2 = r^2
(x−a)2+(y−b)2=r2
其中:
- (a,b)(a,b)(a,b) 为圆心
- rrr 为半径
霍夫圆检测就是让图像中的边缘点不断进行“投票”,最终寻找票数最高的位置作为圆心。
由于直接计算三维参数空间(xxx、yyy、rrr)开销非常大,因此 OpenCV 使用了 霍夫梯度法(Hough Gradient),利用边缘梯度方向,大大提高了检测速度。
二、OpenCV 霍夫圆检测函数
OpenCV 使用:
circles = cv2.HoughCircles(
image,
method,
dp,
minDist,
param1,
param2,
minRadius,
maxRadius
)
参数说明
| image | 输入灰度图 |
| method | 检测方法,一般固定为 cv2.HOUGH_GRADIENT |
| dp | 累加器分辨率与原图分辨率比值 |
| minDist | 两个圆心之间最小距离 |
| param1 | Canny 高阈值 |
| param2 | 圆心投票阈值 |
| minRadius | 最小半径 |
| maxRadius | 最大半径 |
三、参数详解
1. dp
表示累加器分辨率。
例如:
- dp = 1:累加器大小与原图一致。
- dp = 2:检测速度更快,但精度略低。
一般推荐:1 或 1.2。
2. minDist
表示两个圆心之间允许的最小距离。
例如:
- minDist=100:如果两个圆距离小于 100 像素,只保留一个。
如果设置太小:容易重复检测同一个圆。
如果设置太大:可能漏掉相邻圆。
3. param1
这是 Canny 边缘检测的高阈值。
例如:
- param1=100
OpenCV 内部实际执行:
cv2.Canny(gray, 50, 100)
即:
- 低阈值 = param1 / 2
- 高阈值 = param1
4. param2
这是最重要的参数。
它表示:圆心累计投票阈值。
例如:
- param2=30:只有累计票数超过 30 才认为是真正的圆。
数值越小:检测更多,容易误检。
数值越大:检测更严格,容易漏检。
通常需要根据实际图像调整。
5. 半径范围
例如:
minRadius=20
maxRadius=80
表示:只检测 20~80 像素之间的圆。这样可以极大提高速度。
四、基础示例
import cv2
import numpy as np
# 读取图片
img = cv2.imread("circle.png")
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯滤波
gray = cv2.GaussianBlur(gray, (9, 9), 2)
# 霍夫圆检测
circles = cv2.HoughCircles(
gray,
cv2.HOUGH_GRADIENT,
dp=1,
minDist=50,
param1=100,
param2=30,
minRadius=10,
maxRadius=100
)
# 绘制检测结果
if circles is not None:
circles = np.uint16(np.around(circles))
for circle in circles[0]:
x, y, r = circle
# 绘制圆
cv2.circle(img, (x, y), r, (0, 255, 0), 2)
# 绘制圆心
cv2.circle(img, (x, y), 3, (0, 0, 255), –1)
cv2.imshow("Circle Detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

五、工业视觉中的完整流程
实际项目中,很少直接使用霍夫圆检测,而是按照如下流程:
通常会增加:
- ROI 裁剪
- 二值化
- 去噪
- 轮廓过滤
这样检测更加稳定。
六、参数调节技巧
假设:检测不到圆。
可以尝试:降低 param2
例如:
- 30 → 20 → 15
如果误检太多:
提高 param2
例如:
- 30 → 40 → 50
如果圆很多:
增加 minDist,避免重复检测。
如果已知圆大小:
一定要设置 minRadius 和 maxRadius,速度会提升很多。
七、实际案例:检测硬币
import cv2
import numpy as np
img = cv2.imread("coins.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (7, 7), 1.5)
circles = cv2.HoughCircles(
gray,
cv2.HOUGH_GRADIENT,
dp=1.2,
minDist=40,
param1=120,
param2=35,
minRadius=20,
maxRadius=80
)
if circles is not None:
circles = np.uint16(np.around(circles))
for x, y, r in circles[0]:
cv2.circle(img, (x, y), r, (0, 255, 0), 2)
cv2.putText(
img,
f"R={r}",
(x – 20, y – r – 10),
cv2.FONT_HERSHEY_SIMPLEX,
0.6,
(0, 0, 255),
2
)
cv2.imshow("Coins", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

八、霍夫圆检测优缺点
优点:
- 算法成熟,OpenCV 内置实现。
- 检测速度快,适合实时应用。
- 对轻微噪声具有一定鲁棒性。
- 能同时检测多个圆。
缺点:
- 对参数较敏感,需要根据场景调节。
- 对边缘质量要求较高,图像模糊时效果下降。
- 遮挡严重或圆形不完整时容易漏检。
- 光照变化较大时,需要结合滤波和预处理。
九、总结
霍夫圆检测是 OpenCV 中经典且实用的圆形目标检测算法,广泛应用于工业检测、医学图像和智能视觉等领域。实际工程中,通常会先进行灰度化、滤波、ROI 裁剪等预处理,再结合霍夫圆检测实现稳定识别。通过合理设置 dp、minDist、param1、param2 以及圆半径范围,可以在检测速度与准确率之间取得良好的平衡。
对于工业视觉项目,霍夫圆检测通常作为目标定位的第一步,后续可结合亚像素拟合、尺寸测量、模板匹配等算法,进一步提升检测精度和系统鲁棒性。




