前言:
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 // 最大圆半径
);
-
InputArray image
:要检测圆的输入图像。通常应该是单通道灰度图像。 -
HoughMethods method
:霍夫变换的方法。通常使用HoughMethods.Gradient
,这是基于梯度的方法,适用于大多数情况。 -
double dp
:累加器分辨率与图像分辨率的倒数之比。一般设置为 1,表示与输入图像具有相同的分辨率。 -
double minDist
:检测到的圆之间的最小距离。这个参数可以用来控制是否合并接近的圆。通常,你可以根据你的应用来调整这个值。 -
double param1
:Canny 边缘检测的第一个阈值。边缘检测是霍夫变换的一部分,用于检测图像中的边缘。通常设置为 100。 -
double param2
:圆心检测阈值。这个阈值用于确定检测到的圆是否是真正的圆。通常设置为一个较小的值以减少错误检测。 -
int minRadius
和int 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();
}
}
}
结果: