diff --git a/XP.ImageProcessing.Processors/检测分析/BgaVoidRateProcessor.cs b/XP.ImageProcessing.Processors/检测分析/BgaVoidRateProcessor.cs index d78fae9..450d0f1 100644 --- a/XP.ImageProcessing.Processors/检测分析/BgaVoidRateProcessor.cs +++ b/XP.ImageProcessing.Processors/检测分析/BgaVoidRateProcessor.cs @@ -333,14 +333,13 @@ public class BgaVoidRateProcessor : ImageProcessorBase } int voidPixels = CvInvoke.CountNonZero(voidImg); - bga.VoidPixels = voidPixels; - bga.VoidRate = bgaPixels > 0 ? (double)voidPixels / bgaPixels * 100.0 : 0; // 检测每个气泡的轮廓 using var contours = new VectorOfVectorOfPoint(); using var hierarchy = new Mat(); CvInvoke.FindContours(voidImg, contours, hierarchy, RetrType.External, ChainApproxMethod.ChainApproxSimple); + int filteredVoidArea = 0; for (int i = 0; i < contours.Size; i++) { double area = CvInvoke.ContourArea(contours[i]); @@ -349,6 +348,7 @@ public class BgaVoidRateProcessor : ImageProcessorBase var moments = CvInvoke.Moments(contours[i]); if (moments.M00 < 1) continue; + filteredVoidArea += (int)Math.Round(area); bga.Voids.Add(new VoidInfo { Index = bga.Voids.Count + 1, @@ -361,6 +361,10 @@ public class BgaVoidRateProcessor : ImageProcessorBase }); } + // 空隙率基于过滤后的轮廓面积计算 + bga.VoidPixels = filteredVoidArea; + bga.VoidRate = bgaPixels > 0 ? (double)filteredVoidArea / bgaPixels * 100.0 : 0; + // 按面积从大到小排序 bga.Voids.Sort((a, b) => b.Area.CompareTo(a.Area)); for (int i = 0; i < bga.Voids.Count; i++) bga.Voids[i].Index = i + 1;