C#-OpenCvSharp-霍夫变换检测圆(附源码)

前言:

Cv2.HoughCircles 是 OpenCvSharp 中用于检测图像中的圆的方法。它基于霍夫变换(Hough Transform)来识别图像中的圆。

核心函数:

Cv2.HoughCircles ()

CirclesSegment[] HoughCircles(
    InputArray image,         // 输入图像,应该是单通道灰度图像
    HoughMethods method,      // 霍夫变换的方法,通常使用 HoughMethods.Gradient
    double dp,                // 累加器分辨率与图像分辨率的倒数之比,一般设置为 1
    double minDist,           // 检测到的圆之间的最小距离
    double param1 = 100,      // Canny 边缘检测的第一个阈值
    double param2 = 100,      // 圆心检测阈值,通常设置为较小值以减少错误检测
    int minRadius = 0,        // 最小圆半径
    int maxRadius = 0         // 最大圆半径
);
  1. InputArray image:要检测圆的输入图像。通常应该是单通道灰度图像。

  2. HoughMethods method:霍夫变换的方法。通常使用 HoughMethods.Gradient,这是基于梯度的方法,适用于大多数情况。

  3. double dp:累加器分辨率与图像分辨率的倒数之比。一般设置为 1,表示与输入图像具有相同的分辨率。

  4. double minDist:检测到的圆之间的最小距离。这个参数可以用来控制是否合并接近的圆。通常,你可以根据你的应用来调整这个值。

  5. double param1:Canny 边缘检测的第一个阈值。边缘检测是霍夫变换的一部分,用于检测图像中的边缘。通常设置为 100。

  6. double param2:圆心检测阈值。这个阈值用于确定检测到的圆是否是真正的圆。通常设置为一个较小的值以减少错误检测。

  7. int minRadiusint maxRadius:要检测的圆的最小和最大半径。如果你知道你要检测的圆的半径范围,可以设置这两个值。如果不确定,可以将它们都设置为 0,方法会自动寻找任何大小的圆。

返回值

Cv2.HoughCircles 方法返回一个 CirclesSegment 数组,其中每个元素代表一个检测到的圆。每个 CirclesSegment 包含以下信息:

  • Center:圆心坐标。
  • Radius:圆的半径。

代码
 

using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 霍夫变换检测圆
{
    class Program
    {
        static void Main(string[] args)
        {
            // 读取图像
            Mat image = Cv2.ImRead("C:/Users/CGW/Desktop/digits/气泡.jpg", ImreadModes.Color);
            Cv2.ImShow("原图", image);
            // 转换为灰度图像
            Mat gray = new Mat();
            Cv2.CvtColor(image, gray, ColorConversionCodes.BGR2GRAY);

            // 使用 HoughCircles 方法检测圆
            CircleSegment[] circles = Cv2.HoughCircles(
                gray,
                HoughModes.Gradient, // 使用梯度法进行霍夫圆变换
                dp: 1, // 分辨率因子
                minDist: 30, // 圆之间的最小距离
                param1: 100, // Canny 边缘检测的高阈值
                param2: 30, // 圆心累加器的阈值
                minRadius: 5, // 最小半径
                maxRadius: 50 // 最大半径(如果为0,则根据图像尺寸自动调整)
            );

            // 绘制检测到的圆
            // 如果找到了圆,绘制它们
            for (int i = 0; i < circles.Length; i++)
            {
                Point2f center = circles[i].Center;
                Cv2.Circle(image, (int)center.X, (int)center.Y, 1, new Scalar(0, 100, 100), 3, LineTypes.AntiAlias);
                // circle outline                    
                Cv2.Circle(image, (int)center.X, (int)center.Y, (int)circles[i].Radius, new Scalar(0, 255, 0), 3, LineTypes.AntiAlias);
            }

            // 显示结果
         
            Cv2.ImShow("Detected Circles", image);
            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }
    }
}

结果:

猜你喜欢

转载自blog.csdn.net/m0_55074196/article/details/133745562