使用python opencv和HoughCircles检测图像中的圆

您所在的位置:网站首页 imfindcircles函数园检测用法总结 使用python opencv和HoughCircles检测图像中的圆

使用python opencv和HoughCircles检测图像中的圆

2024-07-14 14:42| 来源: 网络整理| 查看: 265

  使用opencv检测图像中的圆要比检测具有尖锐边缘的其他形状困难得多。下面展示如何使用该cv2.HoughCircles函数通过opencv检测图像中的圆。

cv2.HoughCircles函数

  检测图像中的圆,你需要使用cv2.HoughCircles函数。但该函数使用起来并不是一件容易的事。   cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)

image:8位单通道图像,如果使用彩色图像,需要先转换成灰度图像;method:定义检测图像中圆的方法。目前唯一实现的方法是cv2.HOUGH_GRADIENT;dp:图像像素分辨率与参数空间分辨率的比值(官方文档上写的是图像分辨率与累加器分辨率的比值,它把参数空间认为是一个累加器,毕竟里面存储的都是经过的像素点的数量),dp=1,则参数空间与图像像素空间(分辨率)一样大,dp=2,参数空间的分辨率只有像素空间的一半大;minDist:检测到的圆的中心,(x,y)坐标之间的最小距离。如果minDist太小,则可能导致检测到多个相邻的圆。如果minDist太大,则可能导致很多圆检测不到;param1:用于处理边缘检测的梯度值方法;param2:cv2.HOUGH_GRADIENT方法的累加器阈值。阈值越小,检测到的圆越多;minRadius:半径的最小大小(以像素为单位);maxRadius:半径的最大大小(以像素为单位)。   在设置该函数的参数值中,该minDist参数正确设置显得尤为的重要,没有最佳的minDist值,可能最终会检测不到我们理想中的圆,或者可能检测到许多错误的圆。   建立项目detectCircles.py,代码如下: #! /usr/bin/env python # -*- coding: utf-8 -*- import numpy as np import cv2 def detectCircles(): # 加载图像 image = cv2.imread('./images/circle_2.png') output = image.copy() # 转换成灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 检测圆 circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.2, 75) # 确保至少找到一个圆 if circles is not None: # 将圆(x, y)坐标和半径转换成int circles = np.round(circles[0, :]).astype('int') for (x, y, r) in circles: # 绘制圆和半径矩形到output cv2.circle(output, (x, y), r, (0, 255, 0), 4) cv2.rectangle(output, (x-5, y-5), (x+5, y+5), (0, 128, 255), -1) cv2.imshow('output', np.hstack([image, output])) cv2.waitKey(0) cv2.destroyAllWindows() def main(): detectCircles() if __name__ == "__main__": main()

  运行代码,结果如下: 在这里插入图片描述该cv2.HoughCircles函数只能检测到七个圆,而不是八个圆。这是因为大外圆的中心(x,y)坐标与内圆相同,因此舍去了内圆。

总结

  在这篇文章中,展示了如何使用cv2.HoughCircles在python opencv中检测图像中的圆,与检测图像中的正方形和矩形不同,检测圆形实际上要困难得多。

下载

源代码和素材

参考资料

https://www.pyimagesearch.com



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3