c#基于opencvsharp的水果面积计算源码+程序,实现水果面积大小的筛选,自动识别计算多...
想要更高精度的话,可以试试用Cv2.MinAreaRect()获取旋转矩形,对香蕉这种长条形水果的测量误差能降低40%左右。FindContoursAsArray这个方法返回所有轮廓点的集合,注意这里用External模式只要最外层轮廓,防止把水果表面的凹陷也算进去。今天就带大家用C#实现一个自动计算多张水果图片面积的小工具,核心代码不到100行,咱们直接开撸!c#基于opencvsharp的水果
c#基于opencvsharp的水果面积计算源码+程序,实现水果面积大小的筛选,自动识别计算多组水果图片。
最近在搞一个水果分拣系统的原型,发现用OpenCvSharp做图像处理真是方便。今天就带大家用C#实现一个自动计算多张水果图片面积的小工具,核心代码不到100行,咱们直接开撸!
先装个NuGet包:
Install-Package OpenCvSharp4.Windows
图像预处理阶段最关键。咱们先用阈值分割把水果从背景抠出来:
using (var src = new Mat("apple.jpg"))
{
// 灰度化降维打击
Cv2.CvtColor(src, src, ColorConversionCodes.BGR2GRAY);
// 大津算法自动找阈值
Cv2.Threshold(src, src, 0, 255, ThresholdTypes.Otsu);
// 开运算去噪点
Cv2.MorphologyEx(src, src, MorphTypes.Open, Cv2.GetStructuringElement(MorphShape.Rect, new Size(5,5)));
}
这里ThresholdTypes.Otsu参数让算法自动计算最佳阈值,比手动调参智能多了。开运算用5x5矩形核能有效消除散落的噪点,实测对草莓表面的籽有奇效。
接下来是重头戏——轮廓检测:
var contours = src.FindContoursAsArray(
RetrievalModes.External,
ContourApproximationModes.ApproxSimple);
// 按面积过滤有效轮廓
var validContours = contours.Where(c => Cv2.ContourArea(c) > 1000).ToList();
FindContoursAsArray这个方法返回所有轮廓点的集合,注意这里用External模式只要最外层轮廓,防止把水果表面的凹陷也算进去。面积阈值设1000像素是经过实测的,能过滤掉树叶等小干扰物。
计算面积后直接标注在图上:
using (var dst = new Mat("apple.jpg"))
{
foreach (var contour in validContours)
{
var area = Cv2.ContourArea(contour);
var rect = Cv2.BoundingRect(contour);
// 画框+文字标注
Cv2.Rectangle(dst, rect, Scalar.Red, 2);
Cv2.PutText(dst, $"{area}px", rect.Location,
HersheyFonts.HersheySimplex, 0.7, Scalar.Green, 2);
}
Cv2.ImWrite("result.jpg", dst);
}
这里用BoundingRect获取最小外接矩形,比直接画轮廓更清晰。注意PutText的字体大小要和图像分辨率适配,实测0.7倍在1080p图片上效果最佳。
批量处理就更简单了,直接遍历文件夹:
foreach (var file in Directory.GetFiles(@"D:\fruits\"))
{
using (var processor = new FruitAreaProcessor(file))
{
processor.Process();
Console.WriteLine($"{Path.GetFileName(file)} 面积:{processor.TotalArea}px");
}
}
建议用using管理Mat对象,实测内存占用能减少30%。TotalArea属性简单做个累加就能实现多水果面积统计。
遇到过最坑的bug是OpenCV的轮廓点坐标系和C#不同,导致标注位置错乱。后来发现要把BoundingRect的Y坐标加上矩形高度才是正确位置,这种细节文档里可不会说。
完整代码已打包,包含猕猴桃、橙子等测试图片。运行时记得把平台改成x64,不然会报dll缺失错误。想要更高精度的话,可以试试用Cv2.MinAreaRect()获取旋转矩形,对香蕉这种长条形水果的测量误差能降低40%左右。

更多推荐
所有评论(0)