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