在农业领域,精准计数玉米粒对于产量评估、质量控制等方面具有重要意义。传统的手工计数方式耗时耗力且容易出错,因此,利用计算机视觉技术实现自动化的玉米粒计数成为一种趋势。C# 作为.NET平台下的主流编程语言,结合 OpenCvSharp 库,能够高效地处理图像数据,实现玉米粒的精准计数。本文将详细介绍如何使用 C# 和 OpenCvSharp 实现玉米粒计数的完整流程。
OpenCvSharp4 和OpenCvSharp4.runtime.win(如果是在 Windows 平台上开发)。使用 OpenCvSharp 读取玉米粒图像:
Mat src = Cv2.ImRead("corn.jpg", ImreadModes.Color);
将彩色图像转换为灰度图像,以便后续处理:
Mat gray = new Mat();
Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
通过二值化将玉米粒与背景分离,设置合适的阈值:
Mat binary = new Mat();
Cv2.Threshold(gray, binary, 240, 255, ThresholdTypes.Binary);
使用膨胀操作增强玉米粒的边界,使其更易于检测:
Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(15, 15));
Mat dilated = new Mat();
Cv2.Dilate(binary, dilated, kernel, iterations: 2);
计算二值图像中每个非零像素点到最近零像素点的距离,有助于后续的轮廓检测:
Mat dist = new Mat();
Cv2.BitwiseNot(dilated, dilated);
Cv2.DistanceTransform(dilated, dist, DistanceTypes.L1, DistanceTransformMasks.Mask3);
Cv2.Normalize(dist, dist, 0, 1.0, NormTypes.MinMax);
对距离变换后的图像进行二值化处理,突出玉米粒轮廓:
Mat morphImg = new Mat();
dist.ConvertTo(morphImg, MatType.CV_8U);
Cv2.Threshold(morphImg, morphImg, 0.99, 255, ThresholdTypes.Binary);
使用开操作去除小的噪声点,保留主要轮廓:
kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(7, 3));
Cv2.MorphologyEx(morphImg, morphImg, MorphTypes.Open, kernel);
使用Cv2.FindContours 函数检测图像中的轮廓:
Point[][] contours;
HierarchyIndex[] hierarchy;
Cv2.FindContours(morphImg, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
在原图上绘制检测到的玉米粒轮廓,并标注数量:
Mat result = src.Clone();
for (int i = 0; i < contours.Length; i++)
{
Rect rect = Cv2.BoundingRect(contours[i]);
Cv2.Circle(result, new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2), 20, new Scalar(0, 0, 255), -1);
Cv2.PutText(result, (i + 1).ToString(), new Point(rect.X + rect.Width / 2 - 8, rect.Y + rect.Height / 2 + 8), HersheyFonts.HersheySimplex, 0.8, new Scalar(0, 255, 0), 2);
}
将处理后的图像显示在界面上:
Cv2.ImShow("Result", result);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();
通过 C# 和 OpenCvSharp 实现的玉米粒计数系统,能够高效、准确地完成玉米粒的计数任务,为农业生产和研究提供有力支持。随着计算机视觉技术的不断发展,未来将有更多创新的方法应用于玉米粒计数,进一步提高计数的精度和效率。
原文作者:后端Q;如有侵权,请联系管理员删除。