#私藏项目实操分享#教你用OpenCV 和 Python实现圆物检测《-》HoughCircles

人生必须的知识就是引人向光明方面的明灯。这篇文章主要讲述#私藏项目实操分享#教你用OpenCV 和 Python实现圆物检测《-》HoughCircles相关的知识,希望能为你提供帮助。
基于python使用OpenCV实现在一张图片中检测出圆形,并且根据圆检测结果信息,绘制 标记出圆的边界和圆心。

#私藏项目实操分享#教你用OpenCV 和 Python实现圆物检测《-》HoughCircles

文章图片

1 HoughCircles 霍夫圆检测函数在Opencv中使用HoughCircles函数可以实现圆的检测,具体函数参数如下:
#私藏项目实操分享#教你用OpenCV 和 Python实现圆物检测《-》HoughCircles

文章图片

  • 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(rD:\\yolov5-5.0\\data\\images\\1.jpg)
circle_detect(image=img)

cv2.waitKey(0)

最后再借助OpenCV中的画圆函数cv2.circle,cv2.circle函数参数具体如下:
#私藏项目实操分享#教你用OpenCV 和 Python实现圆物检测《-》HoughCircles

文章图片

  • img: 要在其上绘制圆的输入图像
  • center: 绘制圆的中心坐标(x,y),未设置shift参数时,默认为整数int类型。
  • radius: 绘制圆的半径,未设置shift参数时,默认为整数int类型
  • color: 绘制圆的边界线的颜色,OpenCV读取图像后,图像格式为BGR,即【0,255,255】表示用红色绘制圆的边缘。
  • thickness: 圆的边界线的粗细像素值。值为负(-1)时绘制实心圆。
  • lineType: 可选参数,线的类型:虚线、实线
  • shift: 可选参数,圆心坐标点和半径值的小数点位数。


3 检测效果通过合理的控制minDist、minRadius、maxRadius、param2这四个参数的值,最终的检测效果如下图:
#私藏项目实操分享#教你用OpenCV 和 Python实现圆物检测《-》HoughCircles

文章图片

后台回复:??项目实战??,即可获取代码
【#私藏项目实操分享#教你用OpenCV 和 Python实现圆物检测《-》HoughCircles】


    推荐阅读