圆检测参考
霍夫圆检测对噪声比较敏感,所以要先对图像做中值滤波。由于效率问题,OPencv中霍夫变换圆检测是基于图像梯度的实现,分为两步。 * 检测边缘,发现可能圆心 * 基于第一步的基础上从候选圆心开始计算最佳半径的大小。第三个参数,double类型的dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器。例如,dp=1时表示霍夫空间与输入图像空间的大小一致,dp=2时霍夫空间是输入图像空间的一半,以此类推
第四个参数,minDist为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心。即让我们的算法能明显区分的两个不同圆之间的最小距离。这个参数如果太小的话,多个相邻的圆可能被错误地检测成了一个重合的圆。反之,这个参数设置太大的话,某些圆就不能被检测出来了。
第五个参数,double类型的param1,有默认值100。它是第三个参数method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示传递给边缘检测时使用Canny算子的高阈值,而低阈值为高阈值的一半。
第六个参数,double类型的param2,也有默认值100。它是第三个参数method设置的检测方法的对应的参数。为步骤1.5和步骤2.5中所共有的阈值对当前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。
第七个参数,int类型的minRadius,有默认值0,表示圆半径的最小值。
第八个参数,int类型的maxRadius,也有默认值0,表示圆半径的最大值。需要注意的是,使用此函数可以很容易地检测出圆的圆心,但是它可能找不到合适的圆半径。
def detect_circles_demo(image): dst = cv.pyrMeanShiftFiltering(image, 10, 100); #must reduce the noise cimage = cv.cvtColor(dst, cv.COLOR_RGB2GRAY); circles = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1 = 150, param2 = 20, minRadius = 0, maxRadius = 0); print(type(circles)); circles = np.uint16(np.around(circles)); for i in circles[0, :]: cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2); cv.circle(image, (i[0], i[1]), 2, (255, 0, 255), 2); cv.imshow("detect_circle_dmeo", image);