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) {