From 553d74d9201d255145782eb3241eb198979dc647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tiago=20Concei=C3=A7=C3=A3o?= Date: Mon, 13 Sep 2021 01:37:19 +0100 Subject: [PATCH] More contour utility --- UVtools.Core/EmguCV/EmguContours.cs | 30 +++++++++++++++++++++++++- UVtools.WPF/MainWindow.LayerPreview.cs | 17 +-------------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/UVtools.Core/EmguCV/EmguContours.cs b/UVtools.Core/EmguCV/EmguContours.cs index 397d025..6688094 100644 --- a/UVtools.Core/EmguCV/EmguContours.cs +++ b/UVtools.Core/EmguCV/EmguContours.cs @@ -108,6 +108,33 @@ namespace UVtools.Core.EmguCV return result; } + /// + /// Gets contours that are positive pixels and group them by areas + /// Only compatible with Tree type of contour detection + /// + /// + public static List GetPositiveContoursInGroups(VectorOfVectorOfPoint contours, int[,] hierarchy) + { + var result = new List(); + var vectorSize = contours.Size; + var processedContours = new bool[vectorSize]; + for (int i = 0; i < vectorSize; i++) + { + if (processedContours[i]) continue; + processedContours[i] = true; + var index = result.Count; + result.Add(new VectorOfVectorOfPoint(contours[i])); + for (int n = i + 1; n < vectorSize; n++) + { + if (processedContours[n] || hierarchy[n, EmguContour.HierarchyParent] != i) continue; + processedContours[n] = true; + result[index].Push(contours[n]); + } + } + + return result; + } + /// /// Gets contours inside contours that are black pixels and group them by areas /// Only compatible with Tree type of contour detection @@ -123,12 +150,13 @@ namespace UVtools.Core.EmguCV if (processedContours[i]) continue; processedContours[i] = true; if (hierarchy[i, EmguContour.HierarchyParent] == -1) continue; + var index = result.Count; result.Add(new VectorOfVectorOfPoint(contours[i])); for (int n = i + 1; n < vectorSize; n++) { if (processedContours[n] || hierarchy[n, EmguContour.HierarchyParent] != i) continue; processedContours[n] = true; - result[^1].Push(contours[n]); + result[index].Push(contours[n]); } } diff --git a/UVtools.WPF/MainWindow.LayerPreview.cs b/UVtools.WPF/MainWindow.LayerPreview.cs index cc2ec8a..f1306e4 100644 --- a/UVtools.WPF/MainWindow.LayerPreview.cs +++ b/UVtools.WPF/MainWindow.LayerPreview.cs @@ -1214,22 +1214,7 @@ namespace UVtools.WPF using var vec = EmguContours.GetContoursInside(LayerCache.LayerContours, LayerCache.LayerContourHierarchy, operation.Location); if (vec.Size > 0) CvInvoke.DrawContours(LayerCache.ImageBgr, vec, -1, new MCvScalar(color.B, color.G, color.R), -1); - /*var hollowGroups = new List(); - var processedContours = new bool[LayerCache.LayerContours.Size]; - for (int i = 0; i < LayerCache.LayerContours.Size; i++) - { - if(processedContours[i]) continue; - processedContours[i] = true; - if (LayerCache.LayerContourHierarchy[i, EmguContour.HierarchyParent] == -1) continue; - hollowGroups.Add(new VectorOfVectorOfPoint(LayerCache.LayerContours[i])); - for (int n = i + 1; n < LayerCache.LayerContours.Size; n++) - { - if (processedContours[n] || LayerCache.LayerContourHierarchy[n, EmguContour.HierarchyParent] != i) continue; - processedContours[n] = true; - hollowGroups[^1].Push(LayerCache.LayerContours[n]); - } - - } + /*var hollowGroups = EmguContours.GetPositiveContoursInGroups(LayerCache.LayerContours, LayerCache.LayerContourHierarchy); foreach (var vec in hollowGroups) {