OpenCV 圆检测

2019-09-08 21:26:41 浏览数 (1)

OpenCV 的 HoughCircles() 函数可以用来在一张单通道图像里检测圆形物体。下面是各参数的介绍:

代码语言:javascript复制
HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) -> circles

image为单通道图像。若是彩图,须先转化为灰度图,或只取某单个颜色通道。

method 定义检测图像中圆的方法。目前唯一实现是cv2.HOUGH_GRADIENT

dp:累加器分辨率与图像分辨率的反比。dp取值越大,累加器数组越小。

minDist:检测到的各个圆的中心坐标之间的最小距离(以像素为单位)。如果过小,可能检测到多个相邻的圆。反之,过大则可能导致很多圆检测不到。

param1:用于处理边缘检测的梯度值方法。

param2:cv2.HOUGH_GRADIENT方法的累加器阈值。阈值越小,能检测到的圆越多。

minRadius:半径的最小值(以像素为单位)。

maxRadius:半径的最大值(以像素为单位)。

下面以这张气球串的照片为例进行讲解。

我们需要先将其转为灰度图,再模糊降噪:

代码语言:javascript复制
import cv2  img0 = cv2.imread('1.png')print(img0.shape)cv2.imshow("Original image", img0)gray = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY)#转灰度图cimg = cv2.medianBlur(gray, 3)#模糊降噪cv2.imshow("Cimg", cimg)

降噪后的灰度图:

最后进行圆检测:

代码语言:javascript复制
#HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) -> circles # image须是灰度图circles = cv2.HoughCircles(cimg, cv2.HOUGH_GRADIENT,1,20,                           param1=3,param2=40,minRadius=5,maxRadius=40)if circles is not None:    for (cx,cy, r) in circles[0, :]:        print(cx,cy,"  ", r) # 圆心x坐标,y坐标,和圆半径(注意都是浮点数!)        cv2.circle(img0, (cx, cy), r, (255,0,0), 2) #画圆cv2.imshow("detection", img0)cv2.waitKey()cv2.destroyAllWindows()

检测结果如下,效果还不错。

圆心坐标和圆半径的数据:

0 人点赞