在计算机视觉领域,圆形检测是一项常见并且实用的技术。在这篇文章中,我们将介绍如何使用 C# 和 OpenCvSharp 库来进行圆形检测。OpenCvSharp 是 OpenCV 的 .NET 封装,提供了强大的视觉处理能力。
在开始使用之前,确保你已经安装了 OpenCvSharp 库。你可以通过 NuGet 包管理器来安装它:
PowerShellInstall-Package OpenCvSharp4
OpenCvSharp 提供了一个名为 HoughCircles
的方法,可以用来检测图像中的圆形。接下来,我们将详细介绍如何使用这个方法。
以下是一个基本的圆形检测示例,展示了如何从加载的图像中检测圆形:
C#using OpenCvSharp;
namespace OpenCv082902
{
internal class Program
{
static void Main(string[] args)
{
// 读取图像
Mat src = Cv2.ImRead("1.jpg", ImreadModes.Color);
// 将图像转换为灰度图
Mat gray = new Mat();
Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
// 使用高斯模糊减小噪声
Cv2.GaussianBlur(gray, gray, new Size(9, 9), 2, 2);
// 添加形态学操作 - 闭操作
Mat morph = new Mat();
Cv2.MorphologyEx(gray, morph, MorphTypes.Close, Cv2.GetStructuringElement(MorphShapes.Ellipse, new Size(5, 5)));
// 检测圆形
CircleSegment[] circles = Cv2.HoughCircles(
morph,
HoughModes.Gradient,
1,
morph.Rows / 8,
param1: 100,
param2: 30,
minRadius: 10,
maxRadius: 100);
// 定义面积阈值
double minArea = 30000; // 最小面积阈值
double maxArea = 60000; // 最大面积阈值
// 过滤并绘制满足面积条件的圆
foreach (CircleSegment circle in circles)
{
double radius = circle.Radius;
double area = Math.PI * Math.Pow(radius, 2);
// 如果圆的面积在设定的范围内,则绘制该圆
if (area >= minArea && area <= maxArea)
{
Point center = new Point(circle.Center.X, circle.Center.Y);
// 在图像上绘出圆心
Cv2.Circle(src, center, 3, Scalar.Red, -1, LineTypes.AntiAlias);
// 在图像上绘出圆的边界
Cv2.Circle(src, center, (int)radius, Scalar.Blue, 3, LineTypes.AntiAlias);
// 绘制圆面积
string text = $"Area: {area:F2}";
var fontFace = HersheyFonts.HersheyScriptSimplex;
double fontScale = 0.5;
int thickness = 1;
Size textSize = Cv2.GetTextSize(text, fontFace, fontScale, thickness, out int baseline);
Point textOrigin = new Point(center.X - textSize.Width / 2, center.Y + (int)radius + 20);
Cv2.PutText(src, text, textOrigin, fontFace, fontScale, Scalar.Green, thickness, LineTypes.AntiAlias);
}
}
// 显示结果
Cv2.ImShow("Filtered Circles by Area", src);
Cv2.WaitKey();
}
}
}
gray
: 输入的灰度图像。HoughMethods.Gradient
: 使用基于梯度的方法进行圆检测。1
: 累加器分辨率与图像分辨率的反比。gray.Rows / 8
: 圆心之间的最小距离。param1
: Canny
边缘检测的高阈值(低阈值是高阈值的一半)。param2
: 检测阶段圆心的累加器阈值。minRadius
: 圆的最小半径。maxRadius
: 圆的最大半径。可以调整参数来更好地适应不同的图像条件,比如改进对不同半径的检测,或优化性能。在某些情境下,添加形态学操作来改善前期图像处理也是非常有效的。
Java// 添加形态学操作 - 闭操作
Mat morph = new Mat();
Cv2.MorphologyEx(gray, morph, MorphTypes.Close, Cv2.GetStructuringElement(MorphShapes.Ellipse, new Size(5, 5)));
// 使用形态学处理后的图像进行圆形检测
CircleSegment[] // 使用形态学处理后的图像进行圆形检测
circles = Cv2.HoughCircles(
morph,
HoughModes.Gradient,
1,
morph.Rows / 8,
param1: 100,
param2: 30,
minRadius: 10,
maxRadius: 100);
// 同样的绘制步骤
通过这篇文章,我们学习了如何使用 C# 与 OpenCvSharp 库进行圆形检测。你可以尝试着调整不同的参数以适应你自己的场景。同时,还可以结合更多的计算机视觉方法,实现更复杂的功能。计算机视觉领域是广阔而富有挑战的,持续的学习和实践将助你在这一领域不断进步。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!