MethodOfAssessment.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using OpenCvSharp;
  2. using PaintDotNet.Base.DedicatedAnalysis.Porosity.Model;
  3. using PaintDotNet.Base.Functionodel;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Drawing;
  7. using System.Linq;
  8. using static PaintDotNet.Base.DedicatedAnalysis.Porosity.PorositysGlobalSettings;
  9. namespace PaintDotNet.Base.DedicatedAnalysis.Porosity
  10. {
  11. /// <summary>
  12. /// 评定方法
  13. /// </summary>
  14. public abstract class MethodOfAssessment
  15. {
  16. public static MethodOfAssessment activeMethod;
  17. /// <summary>
  18. /// 所属的标准
  19. /// </summary>
  20. public PorositysStandard porositysStandard;
  21. /// <summary>
  22. /// 测量区域
  23. /// </summary>
  24. public Mat field;
  25. /// <summary>
  26. /// 相集合
  27. /// </summary>
  28. public List<PhaseModel> phaseModelList;
  29. public string resourcesName;
  30. public string fileName;
  31. // 标准的结果模型
  32. // 试样总检验面积
  33. // 视场面积
  34. // 放大倍数
  35. /// <summary>
  36. /// 产生报告
  37. /// </summary>
  38. public AnalysisResult generateReport(Mat originalImage, Mat binary, Mat oldMat,List<RectangleF> rectangles, List<dynamic> rectangleTypeList, List<PhaseModel> phaseModelList, PorosityConfig porosityConfig,bool isOne)
  39. {
  40. Mat binaryBGR2GRAY = binary.CvtColor(ColorConversionCodes.BGR2GRAY);
  41. Cv2.Threshold(binaryBGR2GRAY, binaryBGR2GRAY, 249, 255, ThresholdTypes.Binary);
  42. List<Particle> particles = this.porositysStandard.identifyParticles(binaryBGR2GRAY);
  43. particles = this.porositysStandard.filterParticles(particles);
  44. List<Porositys> porositys = this.porositysStandard.divideInclusion(particles);
  45. AnalysisResult analysisResult = GetAnalysisResult();
  46. analysisResult.porositysStandard = this.porositysStandard;
  47. analysisResult.mat = originalImage;
  48. analysisResult.binaryMat = binary;
  49. analysisResult.porositys = porositys;
  50. analysisResult.rectangles = rectangles;
  51. analysisResult.rectangleTypeList = rectangleTypeList;
  52. analysisResult.oldMat = oldMat;
  53. analysisResult.porosityConfig = porosityConfig;
  54. analysisResult.phaseModels = phaseModelList;
  55. analysisResult.isOne = isOne;
  56. analysisResult.buildResultBody();
  57. //binary.Dispose();
  58. return analysisResult;
  59. }
  60. public abstract AnalysisResult GetAnalysisResult();
  61. public abstract List<string> getResultConclusionHead();
  62. public abstract List<string> buildResultConclusion(List<AnalysisResult> analysisResults, PorosityConfig porosityConfig);
  63. /// <summary>
  64. /// 分析结果
  65. /// </summary>
  66. public abstract class AnalysisResult
  67. {
  68. /// <summary>
  69. /// 所属标准
  70. /// </summary>
  71. public PorositysStandard porositysStandard;
  72. /// <summary>
  73. /// 所属图片
  74. /// </summary>
  75. public Mat mat;
  76. /// <summary>
  77. /// 所属图片
  78. /// </summary>
  79. public Mat binaryMat;
  80. /// <summary>
  81. /// 扣的图片(视场)
  82. /// </summary>
  83. public Mat oldMat;
  84. /// <summary>
  85. /// 是否一个视场
  86. /// </summary>
  87. public bool isOne;
  88. /// <summary>
  89. ///
  90. /// </summary>
  91. public List<dynamic> rectangleTypeList;
  92. /// <summary>
  93. /// 参数
  94. /// </summary>
  95. public PorosityConfig porosityConfig;
  96. /// <summary>
  97. /// 孔隙列表
  98. /// </summary>
  99. public List<Porositys> porositys;
  100. public List<RectangleF> rectangles;
  101. public List<PhaseModel> phaseModels;
  102. public List<string> publicResultHead = new List<string> {"图片","视场"};
  103. public Dictionary<FieldOfView, List<string>> resultBody = new Dictionary<FieldOfView, List<string>>();
  104. /// <summary>
  105. /// 视场模型
  106. /// </summary>
  107. public class FieldOfView
  108. {
  109. public string name;
  110. public RectangleF rectangle;
  111. public List<Porositys> porositys;
  112. /// <summary>
  113. /// 过滤有效的孔隙
  114. /// </summary>
  115. /// <returns></returns>
  116. public List<Porositys> effectiveFilteringporosity(List<Porositys> porositys)
  117. {
  118. List<Porositys> porositys1 = new List<Porositys>();
  119. foreach (var item in porositys)
  120. {
  121. if (this.rectangle.Contains(item.rectProfile) || this.rectangle.IntersectsWith(item.rectProfile))
  122. {
  123. porositys1.Add(item);
  124. }
  125. }
  126. return porositys1;
  127. }
  128. }
  129. public List<string> getResultHead()
  130. {
  131. List<string> resultHead = new List<string>();
  132. resultHead.AddRange(publicResultHead);
  133. resultHead.AddRange(getDedicatedResultHead());
  134. return resultHead;
  135. }
  136. public abstract List<string> getDedicatedResultHead();
  137. public abstract void buildResultBody();
  138. /// <summary>
  139. /// 孔隙评级
  140. /// </summary>
  141. /// 评级图暂已硬编码形式实现
  142. public abstract double ratingporosity(string type, double value);
  143. }
  144. }
  145. }