opencv的HoughCircles()函数的用法

网上有很多文档和例子了,不过还是写一下吧,主要是加深一下记忆,总也不用就会生疏很多。

直接先上段代码

		Mat Image = imread(img_path);

        Size dsize = Size(Image.cols * 0.5, Image.rows * 0.5);
        Mat srcImage(dsize, Image.type());

        resize(Image, srcImage, srcImage.size());

        Mat midImage, dstImage;

        cvtColor(srcImage, midImage, COLOR_BGR2GRAY); //转化边缘检测后的图为灰度图
        GaussianBlur(midImage, midImage, Size(9, 9), 2, 2);
        vector circles;
        HoughCircles(midImage, circles, HOUGH_GRADIENT, 1, midImage.rows/5, 150, 100, 0, 0);

        for (size_t i = 0; i < circles.size(); i++)
        {
            Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
            int radius = cvRound(circles[i][2]);
            //绘制圆心
            circle(srcImage, center, 3, Scalar(0, 255, 0), -1, 8, 0);
            //绘制圆轮廓
            circle(srcImage, center, radius, Scalar(255, 50, 0), 3, 8, 0);
        }

        imshow("Output",srcImage);

函数形式:
void HoughCircles(InputArray image, OutputArray circles, int method, double dp, double minDist, double param1 = 100, double param2 = 100, int minRadius = 0, int maxRadius = 0)

参数说明:
InputArray: 输入图像,数据类型一般用Mat型即可,需要是8位单通道灰度图像

OutputArray:存储检测到的圆的输出矢量

method:使用的检测方法,目前opencv只有霍夫梯度法一种方法可用,该参数填HOUGH_GRADIENT即可(opencv 4.1.0下)

dp:double类型的dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器。上述文字不好理解的话,来看例子吧。例如,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便有输入图像一半那么大的宽度和高度。

minDist:为霍夫变换检测到的圆的圆心之间的最小距离

param1:它是第三个参数method设置的检测方法的对应的参数。对当前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。

param2:也是第三个参数method设置的检测方法的对应的参数,对当前唯一的方法霍夫梯度法HOUGH_GRADIENT,它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。

minRadius:表示圆半径的最小值

maxRadius:表示圆半径的最大值

你可能感兴趣的:(Image,Processing)