BinaryClass.cs 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882
  1. using OpenCvSharp;
  2. using PaintDotNet.Annotation;
  3. using PaintDotNet.Base;
  4. using PaintDotNet.Base.CommTool;
  5. using PaintDotNet.Base.Functionodel;
  6. using PaintDotNet.Base.SettingModel;
  7. using PaintDotNet.Data.Param;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Drawing;
  11. using System.IO;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using System.Windows.Forms;
  16. namespace PaintDotNet.DedicatedAnalysis.GrainSizeStandard.IntegrationClass
  17. {
  18. class BinaryClass
  19. {
  20. /// <summary>
  21. /// 是否针对全图进行二值化操作
  22. /// </summary>
  23. public bool processWholeMat = false;
  24. /// <summary>
  25. /// 调色板
  26. /// </summary>
  27. PaintDotNet.ColorsForm colorsForm1;
  28. /// <summary>
  29. /// 构造工作结构
  30. /// </summary>
  31. private Dictionary<int, DocumentItem> documentItems;
  32. /// <summary>
  33. /// 需要的数据在这里引用
  34. /// </summary>
  35. CustomControl.BinaryControlSmaller bmc;
  36. /// <summary>
  37. /// 需要的数据在这里引用
  38. /// </summary>
  39. CustomControl.BinaryControl bc;
  40. AppWorkspace appWorkspace;
  41. DocumentWorkspaceWindow documentWorkspace;
  42. ListView listView1;
  43. /// <summary>
  44. /// 是否要调用二值化的算法
  45. /// </summary>
  46. private bool toApplyBinary = true;
  47. /// <summary>
  48. /// 处理程序
  49. /// </summary>
  50. private ParamObject action = new Data.Action.Action901();
  51. /// <summary>
  52. /// 初始系统参数配置值
  53. /// </summary>
  54. private BinaryExtractionModel binaryExtractionModel;
  55. /// <summary>
  56. /// 相0的图片,处理多视场使用
  57. /// </summary>
  58. public Mat PhaseModels0Mat;
  59. /// <summary>
  60. /// 辅助线集成
  61. /// </summary>
  62. public GrainSizeGuideClass guideClass;
  63. public ComboBox comboBox1;
  64. //public object SelectedItem;
  65. //public GrainSizeGuideClass GuideClass
  66. //{
  67. // set
  68. // {
  69. // this.guideClass = value;
  70. // }
  71. //}
  72. /// <summary>
  73. /// 公开的事件,每次二值化之后需要的计算事件写在这里
  74. /// </summary>
  75. public event EventHandler BinaryImplFinishAction;
  76. private void OnBinaryImplFinishAction()
  77. {
  78. if (BinaryImplFinishAction != null)
  79. {
  80. BinaryImplFinishAction(this, new EventArgs());
  81. }
  82. }
  83. public void InitBinaryControlEvent()
  84. {
  85. if (bmc != null)
  86. {
  87. bmc.InitBinaryControlEvent();
  88. bmc.BinaryGetParamAction += new EventHandler(this.bcBinaryGetParamAction);
  89. bmc.AutoThresClickAction += new EventHandler(this.bcAutoThresClickAction);
  90. bmc.InverseClickAction += new EventHandler(this.bcBinaryGetParamAction);
  91. bmc.InverseClickAction += new EventHandler(this.bcApplyButtonImplAction);
  92. bmc.RadioButton1ChangedAction += new EventHandler(this.bcBinaryGetParamAction);
  93. bmc.RadioButton2ChangedAction += new EventHandler(this.bcBinaryGetParamAction);
  94. bmc.ApplyButtonImplAction += new EventHandler(this.bcApplyButtonImplAction);
  95. bmc.BinaryCheckedChangedAction += new EventHandler(this.bcBinaryCheckedChanged);
  96. bmc.BinaryEditClickAction += new EventHandler(this.bcBinaryEditClickAction);
  97. bmc.PanelColorClickAction += new EventHandler(this.bcPanelColorClickAction);//初始化颜色点击事件
  98. return;
  99. }
  100. if (bc == null)
  101. return;
  102. bc.InitBinaryControlEvent();
  103. bc.BinaryGetParamAction += new EventHandler(this.bcBinaryGetParamAction);
  104. bc.AutoThresClickAction += new EventHandler(this.bcAutoThresClickAction);
  105. bc.InverseClickAction += new EventHandler(this.bcBinaryGetParamAction);
  106. bc.InverseClickAction += new EventHandler(this.bcApplyButtonImplAction);
  107. bc.RadioButton1ChangedAction += new EventHandler(this.bcBinaryGetParamAction);
  108. bc.RadioButton2ChangedAction += new EventHandler(this.bcBinaryGetParamAction);
  109. bc.ApplyButtonImplAction += new EventHandler(this.bcApplyButtonImplAction);
  110. bc.BinaryCheckedChangedAction += new EventHandler(this.bcBinaryCheckedChanged);
  111. bc.BinaryEditClickAction += new EventHandler(this.bcBinaryEditClickAction);
  112. bc.PanelColorClickAction += new EventHandler(this.bcPanelColorClickAction);//初始化颜色点击事件
  113. }
  114. /// <summary>
  115. /// 相颜色点击事件
  116. /// </summary>
  117. /// <param name="sender"></param>
  118. /// <param name="e"></param>
  119. private void bcPanelColorClickAction(object sender, EventArgs e)
  120. {
  121. this.colorsForm1.UserPrimaryColor = ColorBgra.FromColor(bmc != null ? bmc.BinaryBackColor : bc.BinaryBackColor);
  122. this.colorsForm1.ShowDialog();
  123. }
  124. /// <summary>
  125. /// 二值筛选
  126. /// </summary>
  127. /// <param name="sender"></param>
  128. /// <param name="e"></param>
  129. private void bcBinaryEditClickAction(object sender, EventArgs e)
  130. {
  131. if (this.documentWorkspace.PhaseModels[0].mat == null)
  132. {
  133. MessageBox.Show(PdnResources.GetString("Menu.Pleaseperonfirst.text"));
  134. return;
  135. }
  136. GrainBinaryBoundaryEditingDialog boundaryEditingDialog = new GrainBinaryBoundaryEditingDialog(this.appWorkspace, this.listView1.FocusedItem.Index, bmc != null ? bmc.BinaryBackColor : bc.BinaryBackColor
  137. , this.documentWorkspace.PhaseModels[0].mat.Clone());
  138. ////1013###19326 晶粒度的晶界编辑页面,需要把辅助线带过去(客户编辑只处理辅助线位置的晶界)
  139. if (this.guideClass != null && this.comboBox1 != null && this.comboBox1.SelectedItem != null)
  140. {
  141. boundaryEditingDialog.GuideClass = this.guideClass;
  142. boundaryEditingDialog.SelectedItem = this.comboBox1.SelectedItem;
  143. }
  144. if (boundaryEditingDialog.ShowDialog() == DialogResult.OK)
  145. {
  146. this.documentWorkspace.PhaseModels[0].mat = boundaryEditingDialog.PhaseMat.Clone();
  147. OnBinaryImplFinishAction();
  148. }
  149. }
  150. /// <summary>
  151. /// 二值化勾选改变事件
  152. /// </summary>
  153. /// <param name="sender"></param>
  154. /// <param name="e"></param>
  155. private void bcBinaryCheckedChanged(object sender, EventArgs e)
  156. {
  157. if (bc == null && bmc == null)
  158. return;
  159. if ((bmc != null ? bmc.BinaryChecked : bc.BinaryChecked) && !(bmc != null ? bmc.OriginChecked : bc.OriginChecked))
  160. {
  161. this.documentWorkspace.PhaseModels[0].choise = true;
  162. }
  163. else
  164. {
  165. this.documentWorkspace.PhaseModels[0].choise = false;
  166. }
  167. if (toApplyBinary)
  168. this.applyButtonImpl();
  169. else
  170. OnBinaryImplFinishAction();
  171. toApplyBinary = true;
  172. if (this.listView1.FocusedItem == null || !(bmc != null ? bmc.BinaryChecked : bc.BinaryChecked))
  173. this.documentWorkspace.Refresh();
  174. }
  175. /// <summary>
  176. /// 自动阈值
  177. /// </summary>
  178. /// <param name="sender"></param>
  179. /// <param name="e"></param>
  180. private void bcAutoThresClickAction(object sender, EventArgs e)
  181. {
  182. if (bc == null && bmc == null)
  183. return;
  184. Bitmap bitmap = null;
  185. if (listView1.FocusedItem != null)
  186. bitmap = this.appWorkspace.DocumentWorkspaces[this.listView1.FocusedItem.Index].CompositionSurface.CreateAliasedBitmap();
  187. if (bitmap != null)
  188. {
  189. //先计算阈值
  190. Mat mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);
  191. Mat gray = mat.CvtColor(ColorConversionCodes.BGR2GRAY);
  192. double otsu = Cv2.Threshold(gray, gray, 0, 255, ThresholdTypes.Triangle/*.Otsu*/);
  193. //如果当前是两个区间,则需要重新计算一次
  194. if (this.ColorInterval == 2)
  195. {
  196. if (bmc != null)
  197. bmc.OnInverseClickAction();
  198. else
  199. bc.OnInverseClickAction();
  200. this.ColorInterval = (bmc != null ? bmc.getInverseStyle() : bc.getInverseStyle());
  201. }
  202. else
  203. {
  204. if (bmc != null)
  205. bmc.setInverseStyle(1);
  206. else
  207. bc.setInverseStyle(1);
  208. }
  209. //给控件赋值
  210. if (bmc != null)
  211. bmc.scope1Start = 0;
  212. else
  213. bc.scope1Start = 0;
  214. if (bmc != null)
  215. bmc.scope1End = otsu;
  216. else
  217. bc.scope1End = otsu;
  218. //处理直方图
  219. if (bmc != null)
  220. bmc.UpdateVerticalBarWithOneScope(0, Convert.ToInt32(bmc.scope1End));
  221. else
  222. bc.UpdateVerticalBarWithOneScope(0, Convert.ToInt32(bc.scope1End));
  223. mat.Dispose();
  224. GC.Collect();
  225. this.bcApplyButtonImplAction(sender, e);
  226. }
  227. else
  228. {
  229. MessageBox.Show(PdnResources.GetString("Menu.Pleaseselectapicturefirst.text"));
  230. }
  231. }
  232. /// <summary>
  233. /// 执行读取参数的事件
  234. /// </summary>
  235. /// <param name="sender"></param>
  236. /// <param name="e"></param>
  237. private void bcBinaryGetParamAction(object sender, EventArgs e)
  238. {
  239. if (bc == null && bmc == null)
  240. return;
  241. this.binaryExtractionModel.ColorInterval = (bmc != null ? bmc.getInverseStyle() : bc.getInverseStyle());//###
  242. this.binaryExtractionModel.BinaryStyle = (bmc != null ? bmc.BinaryStyle : bc.BinaryStyle);
  243. this.binaryExtractionModel.ColorOneStart = (int)(bmc != null ? bmc.scope1Start : bc.scope1Start);
  244. this.binaryExtractionModel.ColorOneEnd = (int)(bmc != null ? bmc.scope1End : bc.scope1End);
  245. this.binaryExtractionModel.ColorTwoStart = (int)(bmc != null ? bmc.scope2Start : bc.scope2Start);
  246. this.binaryExtractionModel.ColorTwoEnd = (int)(bmc != null ? bmc.scope2End : bc.scope2End);
  247. this.binaryExtractionModel.ColorThreeStart = (int)(bmc != null ? bmc.scope3Start : bc.scope3Start);
  248. this.binaryExtractionModel.ColorThreeEnd = (int)(bmc != null ? bmc.scope3End : bc.scope3End);
  249. foreach (Args args in action.Lists)
  250. {
  251. if (args.Key == "colorInterval")
  252. args.Value = this.binaryExtractionModel.ColorInterval;
  253. else if (args.Key == "binaryStyle")
  254. args.Value = (bmc != null ? bmc.BinaryStyle : bc.BinaryStyle);
  255. else if (args.Key == "scope1")
  256. {
  257. ((List<double>)args.Value)[0] = (int)(bmc != null ? bmc.scope1Start : bc.scope1Start);
  258. ((List<double>)args.Value)[1] = (int)(bmc != null ? bmc.scope1End : bc.scope1End);
  259. }
  260. else if (args.Key == "scope2")
  261. {
  262. ((List<double>)args.Value)[0] = (int)(bmc != null ? bmc.scope2Start : bc.scope2Start);
  263. ((List<double>)args.Value)[1] = (int)(bmc != null ? bmc.scope2End : bc.scope2End);
  264. }
  265. else if (args.Key == "scope3")
  266. {
  267. ((List<double>)args.Value)[0] = (int)(bmc != null ? bmc.scope3Start : bc.scope3Start);
  268. ((List<double>)args.Value)[1] = (int)(bmc != null ? bmc.scope3End : bc.scope3End);
  269. }
  270. }
  271. }
  272. /// <summary>
  273. /// 获取相的工作结构
  274. /// </summary>
  275. /// <param name="index">指明获取第几个相的工作结构</param>
  276. /// <returns></returns>
  277. public List<PhaseModel> getPhaseModels(int index)
  278. {
  279. return this.documentItems[index].phaseModels;
  280. }
  281. ///// <summary>
  282. ///// 判断是否存在视场
  283. ///// </summary>
  284. ///// <returns></returns>
  285. //public bool IsExsitView()
  286. //{
  287. // if (this.graphicsList != null && this.graphicsList.Count > 0
  288. // && this.graphicsList.FindAll(a => a.objectType == DrawClass.View).Count > 0)
  289. // {
  290. // return true;
  291. // }
  292. // return false;
  293. //}
  294. /// <summary>
  295. /// ListView图片选择改变事件,不显示视场
  296. /// </summary>
  297. /// <param name="bitmap">选择改变后的图片</param>
  298. public void listView1_SelectedIndexChangedHideDrawClassView(Bitmap bitmap)
  299. {
  300. Document document = Document.FromImage(bitmap);
  301. this.documentWorkspace.Document = document;
  302. this.documentWorkspace.Visible = true;
  303. GraphicsList itemGraphicsList = this.appWorkspace.DocumentWorkspaces[this.listView1.FocusedItem.Index].GraphicsList;
  304. GraphicsList graphicsList = new GraphicsList();
  305. for (int j = 0; j < itemGraphicsList.Count; j++)
  306. {
  307. if (itemGraphicsList[j].objectType != Annotation.Enum.DrawClass.View)
  308. graphicsList.Add(itemGraphicsList[j]);
  309. }
  310. this.documentWorkspace.GraphicsList = graphicsList;
  311. this.documentWorkspace.PhaseModels = new List<PhaseModel>();
  312. this.documentWorkspace.PhaseModels.AddRange(this.getPhaseModels(this.listView1.FocusedItem.Index));
  313. if ((bc != null || bmc != null) && this.documentWorkspace.PhaseModels[0].mat != null)
  314. {
  315. if (!(bmc != null ? bmc.BinaryChecked : bc.BinaryChecked) && this.documentWorkspace.PhaseModels[0].choise)
  316. {
  317. this.toApplyBinary = false;
  318. if (bmc != null)
  319. bmc.BinaryChecked = true;
  320. else
  321. bc.BinaryChecked = true;
  322. }
  323. }
  324. else
  325. {
  326. this.applyButtonImpl();
  327. }
  328. if ((bc != null || bmc != null) && !this.documentWorkspace.PhaseModels[0].choise)
  329. if (bmc != null)
  330. bmc.BinaryChecked = false;
  331. else
  332. bc.BinaryChecked = false;
  333. //显示直方图
  334. if (bc != null || bmc != null)
  335. if (bmc != null)
  336. bmc.CreateHistogram(bitmap, true, 339, 130, 0);
  337. else
  338. bc.CreateHistogram(bitmap, true, 339, 130, 0);
  339. }
  340. /// <summary>
  341. /// ListView图片选择改变事件
  342. /// </summary>
  343. /// <param name="bitmap">选择改变后的图片</param>
  344. public void listView1_SelectedIndexChanged(Bitmap bitmap)
  345. {
  346. Document document = Document.FromImage(bitmap);
  347. this.documentWorkspace.Document = document;
  348. this.documentWorkspace.Visible = true;
  349. this.documentWorkspace.GraphicsList = this.appWorkspace.DocumentWorkspaces[this.listView1.FocusedItem.Index].GraphicsList;
  350. this.documentWorkspace.PhaseModels = new List<PhaseModel>();
  351. this.documentWorkspace.PhaseModels.AddRange(this.getPhaseModels(this.listView1.FocusedItem.Index));
  352. if ((bc != null || bmc != null) && this.documentWorkspace.PhaseModels[0].mat != null)
  353. {
  354. if (!(bmc != null ? bmc.BinaryChecked : bc.BinaryChecked) && this.documentWorkspace.PhaseModels[0].choise)
  355. {
  356. this.toApplyBinary = false;
  357. if (bmc != null)
  358. bmc.BinaryChecked = true;
  359. else
  360. bc.BinaryChecked = true;
  361. }
  362. }
  363. else
  364. {
  365. this.applyButtonImpl();
  366. }
  367. if ((bc != null || bmc != null) && !this.documentWorkspace.PhaseModels[0].choise)
  368. if (bmc != null)
  369. bmc.BinaryChecked = false;
  370. else
  371. bc.BinaryChecked = false;
  372. //显示直方图
  373. if (bc != null || bmc != null)
  374. if (bmc != null)
  375. bmc.CreateHistogram(bitmap, true, 339, 130, 0);
  376. else
  377. bc.CreateHistogram(bitmap, true, 339, 130, 0);
  378. }
  379. /// <summary>
  380. /// ListView图片选择改变事件
  381. /// </summary>
  382. /// <param name="bitmap">选择改变后的图片</param>
  383. public void listView1_SelectedIndexChangedNoCheckedChanged(Bitmap bitmap)
  384. {
  385. Document document = Document.FromImage(bitmap);
  386. this.documentWorkspace.Document = document;
  387. this.documentWorkspace.Visible = true;
  388. this.documentWorkspace.GraphicsList = this.appWorkspace.DocumentWorkspaces[this.listView1.FocusedItem.Index].GraphicsList;
  389. this.documentWorkspace.PhaseModels = new List<PhaseModel>();
  390. this.documentWorkspace.PhaseModels.AddRange(this.getPhaseModels(this.listView1.FocusedItem.Index));
  391. if ((bc != null || bmc != null) && this.documentWorkspace.PhaseModels[0].mat != null)
  392. {
  393. if (!(bmc != null ? bmc.BinaryChecked : bc.BinaryChecked) && this.documentWorkspace.PhaseModels[0].choise)//to sure and test
  394. {
  395. this.toApplyBinary = false;
  396. if (bmc != null)
  397. bmc.BinaryChecked = true;
  398. else
  399. bc.BinaryChecked = true;
  400. }
  401. }
  402. else
  403. {
  404. this.applyButtonImpl();
  405. }
  406. ////to sure and test
  407. //if (bc != null && !this.documentWorkspace.PhaseModels[0].choise)
  408. // bc.BinaryChecked = false;
  409. //显示直方图
  410. if (bc != null || bmc != null)
  411. if (bmc != null)
  412. bmc.CreateHistogram(bitmap, true, 339, 130, 0);
  413. else
  414. bc.CreateHistogram(bitmap, true, 339, 130, 0);
  415. }
  416. /// <summary>
  417. /// 构造相的工作结构
  418. /// </summary>
  419. /// <param name="phaseNames">相的命名,如果只有二值则只传PdnResources.GetString("Menu.BinaryAction.BinaryExtraction.Text")即可,没有特殊情况命名第一个相为PdnResources.GetString("Menu.BinaryAction.BinaryExtraction.Text")</param>
  420. /// <param name="bmc"></param>
  421. /// <param name="appWorkspace"></param>
  422. /// <param name="documentWorkspace"></param>
  423. public void createDocumentItemsSmaller(string[] phaseNames, CustomControl.BinaryControlSmaller bmc, AppWorkspace appWorkspace
  424. , DocumentWorkspaceWindow documentWorkspace, ListView listView1)
  425. {
  426. this.bmc = bmc;
  427. this.appWorkspace = appWorkspace;
  428. this.documentWorkspace = documentWorkspace;
  429. this.listView1 = listView1;
  430. this.initParams();
  431. for (int i = 0; i < phaseNames.Length; i++)
  432. {
  433. PhaseModel model = new PhaseModel();
  434. model.choise = true;
  435. model.mat = null;
  436. model.color = (i == 0 && bmc != null) ? bmc.BinaryBackColor.ToArgb() : Color.Green.ToArgb();//###
  437. model.position = documentWorkspace.PhaseModels.Count + 1;
  438. model.name = phaseNames[i];
  439. documentWorkspace.PhaseModels.Add(model);
  440. }
  441. this.documentItems = new Dictionary<int, DocumentItem>();
  442. // 构造工作结构
  443. for (int i = 0; i < appWorkspace.DocumentWorkspaces.Length; i++)
  444. {
  445. Bitmap bitmap = appWorkspace.DocumentWorkspaces[i].CompositionSurface.CreateAliasedBitmap();
  446. GraphicsList graphicsList = new GraphicsList();
  447. for (int j = 0; j < appWorkspace.DocumentWorkspaces[i].GraphicsList.Count; j++)
  448. {
  449. graphicsList.Add(appWorkspace.DocumentWorkspaces[i].GraphicsList[j]);
  450. }
  451. List<PhaseModel> phaseModels = new List<PhaseModel>();
  452. for (int j = 0; j < phaseNames.Length; j++)
  453. {
  454. //二值化相关
  455. if (j == 0)
  456. {
  457. PhaseModel analysisModel = appWorkspace.DocumentWorkspaces[i].AnalysisPhaseModel;
  458. if (analysisModel == null)
  459. {
  460. PhaseModel model = new PhaseModel();
  461. model.choise = true;
  462. model.mat = null;
  463. model.color = bmc != null ? bmc.BinaryBackColor.ToArgb() : Color.Green.ToArgb();
  464. model.position = phaseModels.Count + 1;
  465. model.name = phaseNames[j];
  466. phaseModels.Add(model);
  467. }
  468. else
  469. phaseModels.Add(analysisModel);
  470. }
  471. else
  472. {
  473. PhaseModel model = new PhaseModel();
  474. model.choise = true;
  475. model.mat = null;
  476. model.color = Color.Green/*panel2.BackColor*/.ToArgb();//###
  477. model.position = phaseModels.Count + 1;
  478. model.name = phaseNames[j];
  479. phaseModels.Add(model);
  480. }
  481. }
  482. this.documentItems.Add(i, new DocumentItem(bitmap, graphicsList, phaseModels));
  483. }
  484. this.InitParameterToControl();//###
  485. this.InitBinaryControlEvent();
  486. }
  487. /// <summary>
  488. /// 构造相的工作结构
  489. /// </summary>
  490. /// <param name="phaseNames">相的命名,如果只有二值则只传(二值提取)即可,没有特殊情况命名第一个相为(二值提取)</param>
  491. /// <param name="bc"></param>
  492. /// <param name="appWorkspace"></param>
  493. /// <param name="documentWorkspace"></param>
  494. public void createDocumentItems(string[] phaseNames, CustomControl.BinaryControl bc, AppWorkspace appWorkspace
  495. , DocumentWorkspaceWindow documentWorkspace, ListView listView1)
  496. {
  497. this.bc = bc;
  498. this.appWorkspace = appWorkspace;
  499. this.documentWorkspace = documentWorkspace;
  500. this.listView1 = listView1;
  501. this.initParams();
  502. for (int i = 0; i < phaseNames.Length; i++)
  503. {
  504. PhaseModel model = new PhaseModel();
  505. model.choise = true;
  506. model.mat = null;
  507. model.color = (i == 0 && bc != null) ? bc.BinaryBackColor.ToArgb() : Color.Green.ToArgb();//###
  508. model.position = documentWorkspace.PhaseModels.Count + 1;
  509. model.name = phaseNames[i];
  510. documentWorkspace.PhaseModels.Add(model);
  511. }
  512. this.documentItems = new Dictionary<int, DocumentItem>();
  513. // 构造工作结构
  514. for (int i = 0; i < appWorkspace.DocumentWorkspaces.Length; i++)
  515. {
  516. Bitmap bitmap = appWorkspace.DocumentWorkspaces[i].CompositionSurface.CreateAliasedBitmap();
  517. GraphicsList graphicsList = new GraphicsList();
  518. for (int j = 0; j < appWorkspace.DocumentWorkspaces[i].GraphicsList.Count; j++)
  519. {
  520. graphicsList.Add(appWorkspace.DocumentWorkspaces[i].GraphicsList[j]);
  521. }
  522. List<PhaseModel> phaseModels = new List<PhaseModel>();
  523. for (int j = 0; j < phaseNames.Length; j++)
  524. {
  525. //二值化相关
  526. if (j == 0)
  527. {
  528. PhaseModel analysisModel = appWorkspace.DocumentWorkspaces[i].AnalysisPhaseModel;
  529. if (analysisModel == null)
  530. {
  531. PhaseModel model = new PhaseModel();
  532. model.choise = true;
  533. model.mat = null;
  534. model.color = bc != null ? bc.BinaryBackColor.ToArgb() : Color.Green.ToArgb();
  535. model.position = phaseModels.Count + 1;
  536. model.name = phaseNames[j];
  537. phaseModels.Add(model);
  538. }
  539. else
  540. phaseModels.Add(analysisModel);
  541. }
  542. else
  543. {
  544. PhaseModel model = new PhaseModel();
  545. model.choise = true;
  546. model.mat = null;
  547. model.color = Color.Green/*panel2.BackColor*/.ToArgb();//###
  548. model.position = phaseModels.Count + 1;
  549. model.name = phaseNames[j];
  550. phaseModels.Add(model);
  551. }
  552. }
  553. this.documentItems.Add(i, new DocumentItem(bitmap, graphicsList, phaseModels));
  554. }
  555. this.InitParameterToControl();//###
  556. this.InitBinaryControlEvent();
  557. }
  558. /// <summary>
  559. /// 无视场执行运算
  560. /// </summary>
  561. public OpenCvSharp.Mat PerformProcess(OpenCvSharp.Mat src) { return action.PerformProcess(src); }
  562. /// <summary>
  563. /// 多视场执行运算
  564. /// </summary>
  565. /// <param name="src">视场mat</param>
  566. /// <param name="mat">原图mat</param>
  567. /// <returns></returns>
  568. public OpenCvSharp.Mat PerformProcess(OpenCvSharp.Mat src, OpenCvSharp.Mat mat) { return action.PerformProcess(src, mat); }
  569. public int ColorInterval
  570. {
  571. get
  572. {
  573. return this.binaryExtractionModel.ColorInterval;
  574. }
  575. set
  576. {
  577. this.binaryExtractionModel.ColorInterval = value;
  578. }
  579. }
  580. private void colorsForm1Changed(object sender, EventArgs e)
  581. {
  582. Color color = this.colorsForm1.UserPrimaryColor.ToColor();
  583. this.SetBinaryBackColor(color);//改变参数配置的相颜色
  584. this.colorsForm1.Close();
  585. }
  586. /// <summary>
  587. /// 把参数的值设置到控件上
  588. /// </summary>
  589. public void InitParameterToControl()
  590. {
  591. //
  592. //调色板
  593. //
  594. this.colorsForm1 = new ColorsForm();
  595. this.colorsForm1.StartPosition = FormStartPosition.CenterScreen;
  596. this.colorsForm1.setSaveBtn_Click(new System.EventHandler(this.colorsForm1Changed));
  597. if (this.binaryExtractionModel != null)
  598. {
  599. if (bc != null || bmc != null)
  600. {
  601. //阈值相关
  602. //1个颜色区间还是2个
  603. if (bmc != null)
  604. bmc.setInverseStyle((this.binaryExtractionModel.ColorInterval == 1) ? 1 : 2);
  605. else
  606. bc.setInverseStyle((this.binaryExtractionModel.ColorInterval == 1) ? 1 : 2);
  607. //删除事件
  608. if (bmc != null)
  609. bmc.DeleteEventHandler();
  610. else
  611. bc.DeleteEventHandler();
  612. if (bmc != null)
  613. bmc.scope1End = this.binaryExtractionModel.ColorOneEnd;
  614. else
  615. bc.scope1End = this.binaryExtractionModel.ColorOneEnd;
  616. if (bmc != null)
  617. bmc.scope1Start = this.binaryExtractionModel.ColorOneStart;
  618. else
  619. bc.scope1Start = this.binaryExtractionModel.ColorOneStart;
  620. if (bmc != null)
  621. bmc.scope2End = this.binaryExtractionModel.ColorTwoEnd;
  622. else
  623. bc.scope2End = this.binaryExtractionModel.ColorTwoEnd;
  624. if (bmc != null)
  625. bmc.scope2Start = this.binaryExtractionModel.ColorTwoStart;
  626. else
  627. bc.scope2Start = this.binaryExtractionModel.ColorTwoStart;
  628. if (bmc != null)
  629. bmc.scope3End = this.binaryExtractionModel.ColorThreeEnd;
  630. else
  631. bc.scope3End = this.binaryExtractionModel.ColorThreeEnd;
  632. if (bmc != null)
  633. bmc.scope3Start = this.binaryExtractionModel.ColorThreeStart;
  634. else
  635. bc.scope3Start = this.binaryExtractionModel.ColorThreeStart;
  636. if (bmc != null)
  637. bmc.BinaryStyle = this.binaryExtractionModel.BinaryStyle;
  638. else
  639. bc.BinaryStyle = this.binaryExtractionModel.BinaryStyle;
  640. if (bmc != null)
  641. bmc.BinaryBackColor = Color.FromArgb(this.binaryExtractionModel.PhaseColor);
  642. else
  643. bc.BinaryBackColor = Color.FromArgb(this.binaryExtractionModel.PhaseColor);
  644. //添加事件
  645. if (bmc != null)
  646. bmc.AddEventHandler();
  647. else
  648. bc.AddEventHandler();
  649. if (bmc != null)
  650. bmc.InitParameterToControl();
  651. else
  652. bc.InitParameterToControl();
  653. }
  654. this.applyButtonImpl();
  655. }
  656. }
  657. public void SetBinaryBackColor(Color color)
  658. {
  659. if (bmc != null)
  660. bmc.BinaryBackColor = color;//设置panel背景
  661. else
  662. bc.BinaryBackColor = color;//设置panel背景
  663. this.binaryExtractionModel.PhaseColor = color.ToArgb();
  664. //###
  665. foreach (Args args in action.Lists)
  666. {
  667. if (args.Key == "phaseColor")
  668. {
  669. args.Value = color.ToArgb();//this.binaryExtractionModel.PhaseColor
  670. break;
  671. }
  672. }
  673. this.applyButtonImpl();
  674. }
  675. /// <summary>
  676. /// 保证二值化颜色赋值到action
  677. /// </summary>
  678. public void loadParams()
  679. {
  680. if (bc == null && bmc == null)
  681. return;
  682. foreach (Args args in action.Lists)
  683. {
  684. switch (args.Key)
  685. {
  686. case "scope1"://不反选时候的范围
  687. if (bmc != null)
  688. bmc.ScopeValue1ChangedAction += new EventHandler(((DecimalScope)args).numberScope_ValueChanged);
  689. else
  690. bc.ScopeValue1ChangedAction += new EventHandler(((DecimalScope)args).numberScope_ValueChanged);
  691. break;
  692. case "scope2"://反选时候的范围1
  693. if (bmc != null)
  694. bmc.ScopeValue2ChangedAction += new EventHandler(((DecimalScope)args).numberScope_ValueChanged);
  695. else
  696. bc.ScopeValue2ChangedAction += new EventHandler(((DecimalScope)args).numberScope_ValueChanged);
  697. break;
  698. case "scope3"://反选时候的范围2
  699. if (bmc != null)
  700. bmc.ScopeValue3ChangedAction += new EventHandler(((DecimalScope)args).numberScope_ValueChanged);
  701. else
  702. bc.ScopeValue3ChangedAction += new EventHandler(((DecimalScope)args).numberScope_ValueChanged);
  703. break;
  704. case "phaseColor":
  705. args.Value = this.binaryExtractionModel.PhaseColor;
  706. break;
  707. default:
  708. break;
  709. }
  710. }
  711. }
  712. /// <summary>
  713. /// 执行二值方法的事件
  714. /// </summary>
  715. /// <param name="sender"></param>
  716. /// <param name="e"></param>
  717. private void bcApplyButtonImplAction(object sender, EventArgs e)
  718. {
  719. this.applyButtonImpl(/*bitmap*/);
  720. }
  721. /// <summary>
  722. /// 参数改变时,重新处理图像
  723. /// </summary>
  724. /// <param name="sender"></param>
  725. /// <param name="e"></param>
  726. public void applyButtonImpl(/*Bitmap bitmap*/)
  727. {
  728. if (bc == null && bmc == null)
  729. return;
  730. //long start = Cv2.GetTickCount();
  731. if (listView1.FocusedItem != null && (bmc != null ? bmc.BinaryChecked : bc.BinaryChecked))
  732. {
  733. Bitmap bitmap = this.appWorkspace.DocumentWorkspaces[this.listView1.FocusedItem.Index].CompositionSurface.CreateAliasedBitmap();
  734. //判断是否存在视场,如果存在视场,则把视场提取出来,进行处理
  735. if (!processWholeMat && documentWorkspace.GraphicsList.IsExsitView())
  736. {
  737. documentWorkspace.PhaseModels[0].mat = this.PerformProcess(
  738. OpenCvSharp.Extensions.BitmapConverter.ToMat(documentWorkspace.GetFullSizeWithRegion()),
  739. OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap));
  740. documentWorkspace.PhaseModels[0].color = (bmc != null ? bmc.BinaryBackColor.ToArgb() : bc.BinaryBackColor.ToArgb());
  741. documentWorkspace.Refresh();
  742. }
  743. else if (processWholeMat && documentWorkspace.GraphicsList.IsExsitView())
  744. {
  745. if (PhaseModels0Mat != null)
  746. {
  747. PhaseModels0Mat.Dispose();
  748. PhaseModels0Mat = null;
  749. }
  750. Mat OrgImg0 = this.PerformProcess(OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap));
  751. PhaseModels0Mat = OrgImg0.Clone();
  752. Vec4b vec4 = new Vec4b(0, 0, 0, 0);
  753. //视场图像
  754. Mat exsitViewMatOrg = OpenCvSharp.Extensions.BitmapConverter.ToMat(documentWorkspace.GetFullSizeWithRegion());
  755. for (int y = 0; y < exsitViewMatOrg/*temp*/.Rows; y++)
  756. {
  757. for (int x = 0; x < exsitViewMatOrg/*temp*/.Cols; x++)
  758. {
  759. if (exsitViewMatOrg.At<Vec4b>(y, x).Item3 == 0)
  760. OrgImg0.Set(y, x, vec4);//不在视场图像范围内
  761. }
  762. }
  763. documentWorkspace.PhaseModels[0].mat = OrgImg0;
  764. documentWorkspace.PhaseModels[0].color = (bmc != null ? bmc.BinaryBackColor.ToArgb() : bc.BinaryBackColor.ToArgb());
  765. documentWorkspace.Refresh();
  766. }
  767. else
  768. {
  769. documentWorkspace.PhaseModels[0].mat = this.PerformProcess(OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap));
  770. documentWorkspace.PhaseModels[0].color = (bmc != null ? bmc.BinaryBackColor.ToArgb() : bc.BinaryBackColor.ToArgb());
  771. documentWorkspace.Refresh();
  772. }
  773. }
  774. //double time = (Cv2.GetTickCount() - start) / Cv2.GetTickFrequency();
  775. //System.Console.WriteLine("执行时间:" + time);
  776. //AddRectangleToRectangleFCaps();//0916###18745
  777. OnBinaryImplFinishAction();
  778. }
  779. /// <summary>
  780. /// 初始化二值化相关的变量
  781. /// </summary>
  782. public void initParams()
  783. {
  784. this.binaryExtractionModel = XmlSerializeHelper.DESerializer<BinaryExtractionModel>(FileOperationHelper.ReadStringFromFile(Application.StartupPath + "\\Config\\" + Startup.instance.SettingPrefix + "\\BinaryExtraction\\Default.xml", FileMode.Open));
  785. }
  786. #region 内部类
  787. internal class LocalListViewItem
  788. {
  789. public DocumentWorkspace Value { get; }
  790. public string Display { get; }
  791. public LocalListViewItem(DocumentWorkspace Value, string Display)
  792. {
  793. this.Value = Value;
  794. this.Display = Display;
  795. }
  796. }
  797. internal class DocumentItem
  798. {
  799. public Bitmap bitmap;
  800. public GraphicsList graphicsList;
  801. public List<PhaseModel> phaseModels;
  802. public DocumentItem(Bitmap bitmap, GraphicsList graphicsList, List<PhaseModel> phaseModels)
  803. {
  804. this.bitmap = bitmap;
  805. this.graphicsList = graphicsList;
  806. this.phaseModels = phaseModels;
  807. }
  808. }
  809. #endregion
  810. }
  811. }