OpenCV-Python——第21章:霍夫(Hough)圆环变换(圆环检测)

目录

0 原理         1 OpenCV 中的圆环检测


0 原理

圆形的数学表达式为

其中(xcenter,ycenter)为圆心的坐标,r 为圆的直径。从这个等式中我们可以看出:一个圆环需要 3 个参数来确定。所以进行圆环霍夫变换的累加器必须是 3 维的,这样的话效率 就会很低。所以 OpenCV 用来一个比较巧妙的办法,霍夫梯度法,它可以使 用边界的梯度信息。

 

1 OpenCV 中的圆环检测

我们要使用的函数为 cv2.HoughCircles()

cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)

  • image:输入图像 ,必须是8位的单通道灰度图像
  • method:定义检测图像中圆的方法。目前唯一实现的方法是cv2.HOUGH_GRADIENT。
  • dp:累加器分辨率与图像分辨率的反比。dp获取越大,累加器数组越小。
  • minDist:检测到的圆的中心,(x,y)坐标之间的最小距离。如果minDist太小,则可能导致检测到多个相邻的圆。如果minDist太大,则可能导致很多圆检测不到。
  • circles:输出结果,发现的圆信息
  • param1:用于处理边缘检测的梯度值方法。
  • param2:cv2.HOUGH_GRADIENT方法的累加器阈值。阈值越小,检测到的圈子越多。
  • minRadius:最小半径
  • maxRadius:最大半径

举个例子:

import cv2

# 载入并显示图片
img = cv2.imread('test.jpg')
cv2.imshow('img', img)
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 输出图像大小,方便根据图像大小调节minRadius和maxRadius
print(img.shape)
# 霍夫变换圆检测
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1,
                           100, param1=100, param2=30, minRadius=5, maxRadius=300)
# 输出返回值,方便查看类型
print(circles)
print(circles[0])
# 输出检测到圆的个数
print(len(circles[0]))

print('------------------------------')
# 根据检测到圆的信息,画出每一个圆
for circle in circles[0]:
    # 圆的基本信息
    print(circle[2])
    # 坐标行列
    x = int(circle[0])
    y = int(circle[1])
    # 半径
    r = int(circle[2])
    # 在原图用指定颜色标记出圆的位置
    img = cv2.circle(img, (x, y), r, (0, 0, 255), 3)
    img = cv2.circle(img, (x, y), 2, (255, 255, 0), -1)
# 显示新图像
cv2.imshow('res', img)

# 按任意键退出
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下:

 

摄像头实现实时圆形检测与追踪可以参考

https://blog.csdn.net/yukinoai/article/details/87447113

效果如下:

  • 13
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值