COpenCvSharp计算每个轮廓面积的指南

一赫技术 2024-08-13 11:08:56

在计算机视觉领域中,找到和分析图像中的轮廓(contours)是一个非常基础且重要的任务。轮廓可以帮助我们识别和处理图像中的对象。在本文中,我们将详细探讨如何使用 OpenCvSharp 库来找到图像中的轮廓并计算每个轮廓的面积。我们将使用一个完整的示例代码来解释整个流程。

准备工作

首先,我们需要确保已经安装了 OpenCvSharp。你可以通过 NuGet 包管理器来安装 OpenCvSharp4 和 OpenCvSharp4.runtime.win。

dotnet add package OpenCvSharp4dotnet add package OpenCvSharp4.runtime.win计算轮廓面积的步骤读取图像将图像转换为灰度图应用阈值处理或边缘检测查找轮廓计算每个轮廓的面积

下面是详细的示例代码。

using OpenCvSharp;namespace App5{ internal Program { static void Main(string[] args) { // 读取图像 Mat src = Cv2.ImRead("0.jpg", ImreadModes.Color); if (src.Empty()) { Console.WriteLine("无法读取图像"); return; } // 2. 将图像转换为灰度图 Mat gray = new Mat(); Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY); Cv2.ImShow("灰度图", gray); // 3. 应用阈值处理 Mat binary = new Mat(); Cv2.Threshold(gray, binary, 128, 255, ThresholdTypes.Binary); Cv2.ImShow("阈值", binary); // 4. 查找轮廓 Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(binary, out contours, out hierarchy, RetrievalModes.CComp, ContourApproximationModes.ApproxSimple); // 5. 遍历所有轮廓并过滤 for (int i = 0; i < contours.Length; i++) { // 过滤尺度太小的轮廓 double area = Cv2.ContourArea(contours[i]); if (area < 100) // 可调节的最小轮廓面积阈值 { continue; } // 只绘制最外层的轮廓(忽略嵌套的子轮廓) if (hierarchy[i].Parent == -1) { // 输出每个有效轮廓的面积 Console.WriteLine($"轮廓 {i + 1} 的面积: {area}"); // 绘制轮廓 Cv2.DrawContours(src, contours, i, Scalar.Red, 2); // 计算轮廓的中心点 Moments moments = Cv2.Moments(contours[i]); int cx = (int)(moments.M10 / moments.M00); int cy = (int)(moments.M01 / moments.M00); // 标注面积 Cv2.PutText(src, area.ToString("F2"), new Point(cx, cy), HersheyFonts.HersheySimplex, 0.6, Scalar.Red, 2); } } // 显示并保存结果图像 Cv2.ImShow("对像与面积", src); Cv2.WaitKey(); } }}遍历并过滤轮廓// 遍历所有轮廓并过滤for (int i = 0; i < contours.Length; i++){ // 过滤尺度太小的轮廓 double area = Cv2.ContourArea(contours[i]); if (area < 100) // 可调节的最小轮廓面积阈值 { continue; } // 只绘制最外层的轮廓(忽略嵌套的子轮廓) if (hierarchy[i].Parent == -1) { // 输出每个有效轮廓的面积 Console.WriteLine($"轮廓 {i + 1} 的面积: {area}"); // 绘制轮廓 Cv2.DrawContours(src, contours, i, Scalar.Red, 2); // 计算轮廓的中心点 Moments moments = Cv2.Moments(contours[i]); int cx = (int)(moments.M10 / moments.M00); int cy = (int)(moments.M01 / moments.M00); // 标注面积 Cv2.PutText(src, area.ToString("F2"), new Point(cx, cy), HersheyFonts.HersheySimplex, 0.6, Scalar.Red, 2); }}过滤面积过小的轮廓:通过计算轮廓面积,过滤掉面积小于100的轮廓。仅绘制最外层轮廓:通过检查hierarchy[i].Parent == -1,只绘制最外层的轮廓,忽略嵌套轮廓。输出有效轮廓的面积:在控制台输出每个有效轮廓的面积。绘制轮廓:在原图上用红色绘制有效轮廓。计算和标注轮廓中心点:计算每个轮廓的中心点并标注面积值。

总结

本文介绍了如何使用 OpenCvSharp 库计算图像中每个轮廓的面积。我们通过一个完整的示例代码展示了从读取图像、灰度处理、二值化、查找轮廓到计算面积的整个流程。希望这能对你在图像处理上的工作有所帮助。

0 阅读:2

一赫技术

简介:感谢大家的关注