编辑
2025-09-25
C#
00

目录

安装 OpenCvSharp
使用 HoughCircles 方法进行圆形检测
基本圆形检测示例
参数解释
圆形检测的高级应用
总结

在计算机视觉领域,圆形检测是一项常见并且实用的技术。在这篇文章中,我们将介绍如何使用 C# 和 OpenCvSharp 库来进行圆形检测。OpenCvSharp 是 OpenCV 的 .NET 封装,提供了强大的视觉处理能力。

安装 OpenCvSharp

在开始使用之前,确保你已经安装了 OpenCvSharp 库。你可以通过 NuGet 包管理器来安装它:

PowerShell
Install-Package OpenCvSharp4

使用 HoughCircles 方法进行圆形检测

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(); } } }

image.png

参数解释

  • 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 许可协议。转载请注明出处!