using OpenCvSharp; using PaintDotNet.Base.DedicatedAnalysis.Porosity.Model; using System.Collections.Generic; using System.Drawing; namespace PaintDotNet.Base.DedicatedAnalysis.Porosity { /// /// 孔隙标准 /// public abstract class PorositysStandard { public static Color[] RAINBOW_COLORS = { Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Cyan, Color.Purple }; /// /// 设置 /// public PorositysGlobalSettings globalSettings = new PorositysGlobalSettings(); #region 识别测量区域中的微粒 /// /// 识别测量区域中的微粒 /// /// 视场 /// 识别出的微粒列表 public virtual List identifyParticles(Mat field) { Cv2.Threshold(field, field, 175, 255, ThresholdTypes.BinaryInv); OpenCvSharp.Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(field, out contours, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxNone); List particles = new List(); for (int i = 0; i < contours.Length; i++) { if (hierarchy[i].Parent != -1) { continue; } OpenCvSharp.Point[] contour = contours[i]; particles.Add(new Particle(contour, this)); } return particles; } #endregion #region 划分孔隙 /// /// 划分孔隙 /// /// 使用distancesBetweenParticles,distancesBetweenStringers划分孔隙 /// 过滤后的微粒列表 /// 孔隙列表 public virtual List divideInclusion(List particles) { return this.particlesDividePorosity(particles); } #endregion #region 过滤微粒 /// /// 过滤微粒 /// /// 使用minimumLength,minimumWidth最小尺寸来过滤微粒 /// 过滤前的微粒列表 /// 过滤后的微粒列表 public virtual List filterParticles(List particles) { for (int i = particles.Count - 1; i >= 0; i--) { Particle particle = particles[i]; if (particle.physicalLength < this.globalSettings.minimumLength || particle.physicalWidth < this.globalSettings.minimumWidth) { particles.Remove(particle); } } return particles; } #endregion #region 微粒划分孔隙 /// /// 微粒划分孔隙 /// /// 过滤后的微粒列表 /// 孔隙列表 protected virtual List particlesDividePorosity(List particles) { List Porositys = new List(); // 第一次划分 微粒划分孔隙 foreach (Particle particle in particles) { if (Porositys.Count == 0) { Porositys Porosity = new Porositys(this); Porosity.addParticles(particle); Porositys.Add(Porosity); continue; } Porositys newPorosity = new Porositys(this); newPorosity.addParticles(particle); Porositys.Add(newPorosity); } return Porositys; } #endregion /// /// 判断孔隙类型 /// public abstract void determineType(Porositys Porosity); /// /// 边缘误差修正 /// /// 根据视场边界修正所计算的孔隙 /// public abstract void edgeErrorsCorrection(List Porositys); } }