| 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);    }    }
 |