编辑
2025-09-26
C#
00

目录

安装OpenCvSharp
示例代码
引入必要的命名空间
目标图片
完整代码
结论

在计算机视觉领域,物品识别和计数是一项常见的任务。OpenCvSharp 是 OpenCV 的 .NET 封装,使得我们可以在 C# 中方便地使用 OpenCV 的功能。本文将详细介绍如何使用 OpenCvSharp 识别物品数量,并提供一个完整的示例。

安装OpenCvSharp

在开始之前,确保你已经安装了 OpenCvSharp。你可以使用 NuGet 包管理器来安装它。在 Visual Studio 中打开“工具” -> “NuGet 包管理器” -> “管理解决方案的 NuGet 包”,然后搜索并安装 OpenCvSharp4OpenCvSharp4.runtime.win

或者,你可以在项目文件中添加以下内容:

XML
<PackageReference Include="OpenCvSharp4" Version="4.5.3.20210404" /> <PackageReference Include="OpenCvSharp4.runtime.win" Version="4.5.3.20210404" />

示例代码

下面是一个完整的示例代码,用于识别图像中的物品数量。我们将使用一个简单的二值化和轮廓检测的方法来实现这一目标。

引入必要的命名空间

C#
using System; using OpenCvSharp;

目标图片

image.png

完整代码

以下是完整的代码示例:

C#
static void Main(string[] args) { // 读取图像 Mat src = Cv2.ImRead("4.jpg"); if (src.Empty()) { Console.WriteLine("无法读取图像!"); return; } // 转换为HSV颜色空间 Mat hsv = new Mat(); Cv2.CvtColor(src, hsv, ColorConversionCodes.BGR2HSV); // 定义绿色的颜色范围 Scalar lowerGreen = new Scalar(35, 100, 100); Scalar upperGreen = new Scalar(85, 255, 255); // 创建掩码 Mat mask = new Mat(); Cv2.InRange(hsv, lowerGreen, upperGreen, mask); // 形态学操作(去除噪点) Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(5, 5)); Cv2.MorphologyEx(mask, mask, MorphTypes.Close, kernel); // 轮廓检测 Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(mask, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple); // 创建输出图像 Mat contourOutput = src.Clone(); int colorCount = 0; foreach (var contour in contours) { // 过滤掉面积小的轮廓 double area = Cv2.ContourArea(contour); if (area > 500) // 你可以根据需要调整该值 { // 绘制轮廓 Cv2.DrawContours(contourOutput, new[] { contour }, -1, Scalar.White, 2); // 获取轮廓的中心点 Moments moments = Cv2.Moments(contour); int centerX = (int)(moments.M10 / moments.M00); int centerY = (int)(moments.M01 / moments.M00); // 绘制编号 Cv2.PutText(contourOutput, (++colorCount).ToString(), new Point(centerX, centerY), HersheyFonts.HersheySimplex, 0.5, Scalar.White, 2); } } // 显示结果 Cv2.ImShow("Source Image", src); Cv2.ImShow("Mask", mask); Cv2.NamedWindow("Contours", WindowFlags.Normal); Cv2.ImShow("Contours", contourOutput); Cv2.WaitKey(0); // 输出色块数量 Console.WriteLine($"色块数量: {colorCount}"); }

image.png

结论

本文介绍了如何使用 OpenCvSharp 在 C# 中识别图像中的物品数量。

  1. 读取图像:确保图像能够成功读取。
  2. 转换为HSV颜色空间:将图像从BGR颜色空间转换为HSV颜色空间。
  3. 定义绿色的颜色范围:定义要检测的绿色的HSV颜色范围。
  4. 创建掩码:根据绿色的颜色范围创建二值掩码。
  5. 形态学操作(去除噪点):使用形态学操作去除小噪点。
  6. 轮廓检测:检测掩码中的轮廓。
  7. 创建输出图像:克隆原始图像以绘制检测结果。
  8. 绘制轮廓和编号
    • 过滤掉面积小的轮廓。
    • 绘制轮廓。
    • 获取轮廓的中心点。
    • 在中心点绘制编号。
  9. 显示结果:显示原图像、掩码和绘制轮廓后的图像。
  10. 输出色块数量:输出检测到的色块数量。

通过这种方式,你可以检测图像中的绿色色块,并在每个色块上绘制编号。请确保图像路径正确,并且图像能够成功读取。你可以根据需要调整颜色范围和形态学操作的参数。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!