教你用OpenCV 和 Python实现圆物检测

关山初度尘未洗,策马扬鞭再奋蹄!这篇文章主要讲述教你用OpenCV 和 Python实现圆物检测相关的知识,希望能为你提供帮助。


基于python使用OpenCV实现在一张图片中检测出圆形,并且根据圆检测结果信息,绘制 标记出圆的边界和圆心。

教你用OpenCV 和 Python实现圆物检测

文章图片

1 HoughCircles 霍夫圆检测函数 在Opencv中使用HoughCircles函数可以实现圆的检测,具体函数参数如下:
教你用OpenCV 和 Python实现圆物检测

文章图片
  • image: 输入图像,8位灰度单通道图像
  • method: 检测圆的方法,目前OpenCV中有HOUGH_GRADIENT和HOUGH_GRADIENT_ALT两种方法。
  • dp: 检测圆心的累加器图像的分辨率与输入图像之比的倒数,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器输入图像便有输入图像一半那么大的宽度和高度。减少图像的分辨率(宽高变小)是为了减少计算量,一般默认为1就好,保持原有图像精度。
  • minDist: 检测到的两个圆心之间的最小距离。如果参数太小,除了真实的一个圆圈之外,可能错误地检测到多个相邻的圆圈。如果太大,可能会遗漏一些圆圈。
  • circles: 检测到的圆的信息输出向量(x,y,r),分别代表检测到圆的中心坐标和圆半径。
  • param1: Canny 边缘检测的高阈值,低阈值被自动置为高阈值的一半,默认为 100。也就是说检测图像中像素点的值大于param1是会检测为边缘。
  • param2: 表示在检测阶段圆心的累加器阈值。它越小的话,会误检测到更多根本不存在的小圆,而越大,能通过检测的圆就更加接近完美的圆形了。
  • minRadius: 表示图像中能检测到最小圆的半径的值。
  • maxRadius: 表示图像中检测到的圆的最大半径的值。
参数设置总结
  • param2值的设置根据要检测图像中圆的大小进行设置,minRadius最小圆半径和maxRadius最大圆半径可以辅助我们更好选择圆,如果没有特殊需要就都默认为0。minDist可以帮助我们筛选掉检测相近的圆。
  • 霍夫圆检测的原理:第一步通过Canny边缘检测算法检测边缘,发现可能的圆心,然后再计算边缘像素点到圆心的距离估计圆的半径。
2 HoughCircles 霍夫圆检测代码实现实现霍夫圆检测的实现代码非常简单,首先使用cv2.cvtColor函数将要检测的图像转换为灰度图像,然后调用cv2.HoughCircles霍夫圆检测函数进行检测,检测返回所有圆的中心坐标和半径信息向量circles(x,y,r)。
注意: 霍夫圆检测对噪声比较敏感,所以进行霍夫圆检测的之前可以先进行中值滤波cv2.medianBlur。
def circle_detect(image): # 灰度化 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 输出图像大小,方便根据图像大小调节minRadius和maxRadius print(image.shape) # 进行中值滤波 img = cv2.medianBlur(gray, 5)# 霍夫变换圆检测 circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 50, param1=100, param2=30, minRadius=5, maxRadius=100) for circle in circles[0]: # 圆的基本信息 print(circle[2]) # 坐标行列-圆心坐标 x = int(circle[0]) y = int(circle[1]) # 半径 r = int(circle[2]) # 在原图用指定颜色标记出圆的边界 cv2.circle(image, (x, y), r, (0, 0, 255), 3) # 画出圆的圆心 cv2.circle(image, (x, y),5, (0, 255, 0), -1)cv2.imshow("image",image)img = cv2.imread(r\'D:\\yolov5-5.0\\data\\images\\1.jpg\') circle_detect(image=img)cv2.waitKey(0)

最后再借助OpenCV中的画圆函数cv2.circle,cv2.circle函数参数具体如下:
教你用OpenCV 和 Python实现圆物检测

文章图片
  • img: 要在其上绘制圆的输入图像
  • center: 绘制圆的中心坐标(x,y),未设置shift参数时,默认为整数int类型。
  • radius: 绘制圆的半径,未设置shift参数时,默认为整数int类型
  • color: 绘制圆的边界线的颜色,OpenCV读取图像后,图像格式为BGR,即【0,255,255】表示用红色绘制圆的边缘。
  • thickness: 圆的边界线的粗细像素值。值为负(-1)时绘制实心圆。
  • lineType: 可选参数,线的类型:虚线、实线
  • shift: 可选参数,圆心坐标点和半径值的小数点位数。
3 检测效果【教你用OpenCV 和 Python实现圆物检测】通过合理的控制minDist、minRadius、maxRadius、param2这四个参数的值,最终的检测效果如下图:

教你用OpenCV 和 Python实现圆物检测

文章图片

后台回复:项目实战,即可获取代码下载使用。

教你用OpenCV 和 Python实现圆物检测

文章图片

    推荐阅读