123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- using OpenCvSharp;
- using PaintDotNet.Base.DedicatedAnalysis.Porosity.Model;
- using System.Collections.Generic;
- using System.Drawing;
- namespace PaintDotNet.Base.DedicatedAnalysis.Porosity
- {
- /// <summary>
- /// 孔隙标准
- /// </summary>
- public abstract class PorositysStandard
- {
- public static Color[] RAINBOW_COLORS = { Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Cyan, Color.Purple };
- /// <summary>
- /// 设置
- /// </summary>
- public PorositysGlobalSettings globalSettings = new PorositysGlobalSettings();
- #region 识别测量区域中的微粒
- /// <summary>
- /// 识别测量区域中的微粒
- /// </summary>
- /// <param name="field">视场</param>
- /// <returns>识别出的微粒列表</returns>
- public virtual List<Particle> 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<Particle> particles = new List<Particle>();
-
- 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 划分孔隙
- /// <summary>
- /// 划分孔隙
- /// </summary>
- /// 使用distancesBetweenParticles,distancesBetweenStringers划分孔隙
- /// <param name="particles">过滤后的微粒列表</param>
- /// <returns>孔隙列表</returns>
- public virtual List<Porositys> divideInclusion(List<Particle> particles)
- {
- return this.particlesDividePorosity(particles);
- }
- #endregion
- #region 过滤微粒
- /// <summary>
- /// 过滤微粒
- /// </summary>
- /// 使用minimumLength,minimumWidth最小尺寸来过滤微粒
- /// <param name="particles">过滤前的微粒列表</param>
- /// <returns>过滤后的微粒列表</returns>
- public virtual List<Particle> filterParticles(List<Particle> 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 微粒划分孔隙
- /// <summary>
- /// 微粒划分孔隙
- /// </summary>
- /// <param name="particles">过滤后的微粒列表</param>
- /// <returns>孔隙列表</returns>
- protected virtual List<Porositys> particlesDividePorosity(List<Particle> particles)
- {
- List<Porositys> Porositys = new List<Porositys>();
- // 第一次划分 微粒划分孔隙
- 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
- /// <summary>
- /// 判断孔隙类型
- /// </summary>
- public abstract void determineType(Porositys Porosity);
- /// <summary>
- /// 边缘误差修正
- /// </summary>
- /// 根据视场边界修正所计算的孔隙
- /// <param name="Porosity"></param>
- public abstract void edgeErrorsCorrection(List<Porositys> Porositys);
- }
-
- }
|