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()
检测结果如下,效果还不错。
圆心坐标和圆半径的数据: