参数maxRadius: 最大圆形半径

发布时间:2025-06-24 19:01:28  作者:北方职教升学中心  阅读量:932


HoughCircles 实现了 Hough 变换的一个变种,专门用于检测圆形。可用的方法包括 HOUGH_GRADIENT 和 HOUGH_GRADIENT_ALT。

  • 参数method: 检测方法,参见 HoughModes。

  • 参数param1: 第一个特定于方法的参数。0.8 或甚至更小。

  • 参数param2: 第二个特定于方法的参数。然而,它可能无法正确找到半径。

    该函数使用霍夫变换的一种修改版本在灰度图像中查找圆形。如果你想更好地检测小圆形,可以将其减小到 0.85、该值越接近 1,算法选择的圆形形状越好。在 HOUGH_GRADIENT 和 HOUGH_GRADIENT_ALT 的情况下,它是传递给 Canny 边缘检测器的较高阈值(较低的阈值是较高阈值的一半)。

    HoughCircles 是 OpenCV 中用于检测图像中圆形的一个函数。HOUGH_GRADIENT_ALT 总是计算圆形的半径。或者,在使用 HOUGH_GRADIENT 方法的情况下,你可以将 maxRadius 设置为一个负数,以仅返回中心而不进行半径搜索,并使用额外的过程来找到正确的半径。

  • 参数maxRadius: 最大圆形半径。在 HOUGH_GRADIENT 的情况下,它是检测阶段的累加器阈值,用于圆心。如果 dp=2,累加器的宽度和高度各为输入图像的一半。如果 < 0,HOUGH_GRADIENT 返回中心而不查找半径。如果太大,某些圆形可能会被遗漏。

    函数原型

    voidcv::HoughCircles(InputArray 	image,OutputArray 	circles,intmethod,doubledp,doubleminDist,doubleparam1 =100,doubleparam2 =100,intminRadius =0,intmaxRadius =0)

    参数

    • 参数image: 8 位单通道灰度输入图像。

    • 参数circles: 输出的检测到的圆形向量。对于 HOUGH_GRADIENT_ALT,推荐的值是 dp=1.5,除非需要检测一些非常小的圆形。
      对图像进行轻微的平滑处理也有帮助,除非图像本身已经很平滑。注意 HOUGH_GRADIENT_ALT 使用 Scharr 算法来计算图像的导数,所以阈值通常应该更高,例如 300 或者适用于正常曝光和对比度较高的图像。Hough 变换是一种用于检测图像中特定形状的技术,尤其是直线和圆形。对应的累加器值较大的圆形将优先返回。该值越小,可能检测到的虚假圆形越多。
      例子:

      #include<opencv2/imgproc.hpp>#include<opencv2/highgui.hpp>#include<math.h>usingnamespacecv;usingnamespacestd;intmain(intargc,char**argv){Mat img,gray;if(argc !=2||!(img=imread(argv[1],IMREAD_COLOR)).data)return-1;cvtColor(img,gray,COLOR_BGR2GRAY);// smooth it, otherwise a lot of false circles may be detectedGaussianBlur(gray,gray,Size(9,9),2,2);vector<Vec3f>circles;HoughCircles(gray,circles,HOUGH_GRADIENT,2,gray.rows/4,200,100);for(size_t i =0;i <circles.size();i++){Point center(cvRound(circles[i][0]),cvRound(circles[i][1]));intradius =cvRound(circles[i][2]);// draw the circle centercircle(img,center,3,Scalar(0,255,0),-1,8,0);// draw the circle outlinecircle(img,center,radius,Scalar(0,0,255),3,8,0);}namedWindow("circles",1);imshow("circles",img );waitKey(0);return0;}

      注意:

      通常该函数能够很好地检测圆形的中心。如果你知道半径范围,可以通过指定 minRadius 和 maxRadius 来帮助函数。

    • 参数minRadius: 最小圆形半径。大多数情况下 0.9 应该是合适的。在 HOUGH_GRADIENT_ALT 算法中,这是圆形的“完美度”度量。每个向量编码为包含 3 或 4 个元素的浮点数向量(x, y, 半径)或(x, y, 半径, 投票数)。如果该参数太小,可能会错误地检测到多个相邻的圆形。

      • 操作系统:ubuntu22.04
      • OpenCV版本:OpenCV4.9
      • IDE:Visual Studio Code
      • 编程语言:C++11

      算法描述

      在灰度图像中使用霍夫变换查找圆形。

    代码示例

    #include<iostream>#include<opencv2/opencv.hpp>intmain(intargc,char**argv ){// 加载图像cv::Mat img =cv::imread("/media/dingxin/data/study/OpenCV/sources/images/qiu.jpg",cv::IMREAD_COLOR );if(!img.data ){std::cout <<"No image data"<<std::endl;return-1;}cv::imshow("Original Image",img );// 转换为灰度图cv::Mat gray;cvtColor(img,gray,cv::COLOR_BGR2GRAY );// 高斯模糊减少噪声cv::GaussianBlur(gray,gray,cv::Size(9,9),2,2);std::vector<cv::Vec3f >circles;// 存储检测到的圆形信息// 设置参数doubledp      =1;// 累加器分辨率doubleminDist =img.rows /8;// 圆心之间的最小距离doubleparam1  =100;// 边缘检测的高阈值doubleparam2  =30;// 累加器阈值intminRadius  =0;// 最小半径intmaxRadius  =0;// 最大半径// 使用 HoughCircles 检测圆形cv::HoughCircles(gray,circles,cv::HOUGH_GRADIENT,dp,minDist,param1,param2,minRadius,maxRadius );// 绘制检测到的圆形for(size_t i =0;i <circles.size();i++){cv::Vec3i c =circles[i ];cv::Point center(cvRound(c[0]),cvRound(c[1]));intradius =cvRound(c[2]);// 绘制圆心cv::circle(img,center,1,cv::Scalar(0,100,100),3,cv::LINE_AA );// 绘制圆周cv::circle(img,center,radius,cv::Scalar(255,0,0),3,cv::LINE_AA );}// 显示带有检测出圆形的图像cv::imshow("Detected Circles",img );// 等待按键后关闭窗口cv::waitKey(0);return0;}

    运行结果

    在这里插入图片描述

  • 例如,使用大小为 7x7 的高斯核和 1.5x1.5 的 sigma 进行 GaussianBlur() 或类似的模糊处理可能会有帮助。如果 <= 0,使用最大图像尺寸。但同时也要尝试限制搜索范围 [minRadius, maxRadius] 以避免出现许多虚假圆形。例如,如果 dp=1,累加器具有与输入图像相同的分辨率。

  • 参数dp: 累加器分辨率与图像分辨率的逆比。

  • 参数minDist: 检测到的圆形中心之间的最小距离。