FormPMAlignTool.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. using ChoiceTech.Halcon.Control;
  2. using CommonMethods;
  3. using HalconDotNet;
  4. using Logger;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.ComponentModel;
  8. using System.Data;
  9. using System.Drawing;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using System.Windows.Forms;
  15. using ViewROI;
  16. namespace PMAlignTool
  17. {
  18. public partial class FormPMAlignTool : Form
  19. {
  20. private PMAlign myPMAlign = new PMAlign();
  21. public IToolInfo myToolInfo = new IToolInfo();
  22. public HWindowTool_Smart myHwindow = new HWindowTool_Smart();
  23. private HDrawingObject serachRegion_drawing_object = new HDrawingObject();
  24. public List<HDrawingObject> templateModelListAdd = new List<HDrawingObject>() { };
  25. public List<HDrawingObject> templateModelListSub = new List<HDrawingObject>() { };
  26. public FormPMAlignTool(ref object pmalign)
  27. {
  28. InitializeComponent();
  29. _instance = this;
  30. if (pmalign.GetType().FullName != "System.Object")
  31. {
  32. myToolInfo = (IToolInfo)pmalign;
  33. myPMAlign = (PMAlign)myToolInfo.tool;
  34. myPMAlign.toolName = myToolInfo.toolName;
  35. myPMAlign.bingdingJobName = myToolInfo.bingingJobName;
  36. myPMAlign.DispImage();
  37. myPMAlign.InitTool();
  38. }
  39. }
  40. /// <summary>
  41. /// 窗体对象实例
  42. /// </summary>
  43. private static FormPMAlignTool _instance;
  44. public static FormPMAlignTool Instance
  45. {
  46. get
  47. {
  48. if (_instance != null)
  49. {
  50. lock (_instance)
  51. {
  52. if (_instance == null)
  53. {
  54. object pmalign = new object();
  55. _instance = new FormPMAlignTool(ref pmalign);
  56. }
  57. return _instance;
  58. }
  59. }
  60. else
  61. {
  62. object pmalign = new object();
  63. _instance = new FormPMAlignTool(ref pmalign);
  64. return _instance;
  65. }
  66. }
  67. }
  68. private void FormPMAlignTool_Load(object sender, EventArgs e)
  69. {
  70. this.panel1.Controls.Add(myHwindow);
  71. myHwindow.Dock = DockStyle.Fill;
  72. InitTool();
  73. }
  74. bool isInitTool = false;
  75. private void InitTool()
  76. {
  77. isInitTool = true;
  78. #region 图像预处理
  79. cNumErosionValue1.Value = myPMAlign.imageProcess.erosionValue1.algValue;
  80. cbCErosion1.Checked = myPMAlign.imageProcess.erosionValue1.isEnable;
  81. cmbErsion1.TextStr = myPMAlign.imageProcess.erosionValue1.algName;
  82. cNumDilationValue2.Value = myPMAlign.imageProcess.dilationValue.algValue;
  83. cbCDilation1.Checked = myPMAlign.imageProcess.dilationValue.isEnable;
  84. cmbDilation.TextStr = myPMAlign.imageProcess.dilationValue.algName;
  85. cNumErosionValue2.Value = myPMAlign.imageProcess.erosionValue2.algValue;
  86. cbCErosion2.Checked = myPMAlign.imageProcess.erosionValue2.isEnable;
  87. cmbErsion2.TextStr = myPMAlign.imageProcess.erosionValue2.algName;
  88. #endregion
  89. #region 界面参数
  90. nud_minScore.Value = myPMAlign.minScore;
  91. nud_matchNum.Value = myPMAlign.matchNum;
  92. nud_angleStep.Value = myPMAlign.angleStep;
  93. nud_Timeout.Value = myPMAlign.timeOut;
  94. nud_angleStart.Value = myPMAlign.startAngle;
  95. nud_angleRange.Value = myPMAlign.angleRange;
  96. nud_ScaleStart.Value = myPMAlign.minScale;
  97. nud_ScaleRange.Value = myPMAlign.maxScale;
  98. tkb_contrast.Value = myPMAlign.contrast;
  99. #endregion
  100. if (myPMAlign.oldTrainImage == null && File.Exists(myPMAlign.trainImgPath) && File.Exists(myPMAlign.trainModelPath))
  101. {
  102. try
  103. {
  104. HOperatorSet.ReadImage(out myPMAlign.oldTrainImage, myPMAlign.trainImgPath);
  105. HOperatorSet.ReadImage(out myPMAlign.modelPartImage, myPMAlign.trainModelPath);
  106. }
  107. catch (Exception)
  108. {
  109. }
  110. }
  111. if (myPMAlign.modelPartImage != null)
  112. {
  113. hWindowTool_Smart1.DispImage(myPMAlign.modelPartImage);
  114. }
  115. tsbtRunTool_Click(null, null);
  116. isInitTool = false;
  117. }
  118. private ShapeMode selectType;
  119. private void btnOperateROI_Click(object sender, EventArgs e)
  120. {
  121. HDrawingObject temp_object = new HDrawingObject();
  122. temp_object.ClearDrawingObject();
  123. Button btnClick = sender as Button;
  124. selectType = (ShapeMode)Enum.Parse(typeof(ShapeMode), btnClick.Tag.ToString());
  125. switch (selectType)
  126. {
  127. case ShapeMode.RECTANGLE1:
  128. temp_object = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, new HTuple[] { 100, 100, 300, 400 });
  129. break;
  130. case ShapeMode.RECTANGLE2:
  131. temp_object = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE2, new HTuple[] { 200, 200, 0, 100,300 });
  132. break;
  133. case ShapeMode.CIRCLE:
  134. temp_object = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.CIRCLE, new HTuple[] { 200, 200, 100 });
  135. break;
  136. case ShapeMode.ELLIPSE:
  137. break;
  138. case ShapeMode.Other:
  139. break;
  140. default:
  141. break;
  142. }
  143. GC.KeepAlive(temp_object);
  144. temp_object.OnSelect(OnSelectDrawingObject);
  145. temp_object.OnAttach(OnSelectDrawingObject);
  146. temp_object.OnResize(OnSelectDrawingObject);
  147. temp_object.OnDrag(OnSelectDrawingObject);
  148. myHwindow.DispHWindow.AttachDrawingObjectToWindow(temp_object);
  149. if(rdo_templateRegionAdd.Checked)
  150. {
  151. temp_object.SetDrawingObjectParams("color","green");
  152. templateModelListAdd.Add(temp_object);
  153. }
  154. else
  155. {
  156. temp_object.SetDrawingObjectParams("color", "red");
  157. templateModelListSub.Add(temp_object);
  158. }
  159. }
  160. /// <summary>
  161. /// 参数回调
  162. /// </summary>
  163. /// <param name="dobj"></param>
  164. /// <param name="hwin"></param>
  165. /// <param name="type"></param>
  166. private void OnSelectDrawingObject(HDrawingObject dobj, HWindow hwin, string type)
  167. {
  168. HObject selectObj = dobj.GetDrawingObjectIconic();
  169. myPMAlign.templateRegion = selectObj.Clone();
  170. switch (selectType)
  171. {
  172. case ShapeMode.RECTANGLE1:
  173. break;
  174. case ShapeMode.RECTANGLE2:
  175. break;
  176. case ShapeMode.CIRCLE:
  177. break;
  178. case ShapeMode.ELLIPSE:
  179. break;
  180. case ShapeMode.Other:
  181. break;
  182. default:
  183. break;
  184. }
  185. selectObj.Dispose();
  186. }
  187. private void OnSerchRegionDrawingObject(HDrawingObject dobj, HWindow hwin, string type)
  188. {
  189. HObject selectObj = dobj.GetDrawingObjectIconic();
  190. myPMAlign.SearchRegion = selectObj.Clone();
  191. }
  192. public HObject contour;
  193. private void btnCreateModel_Click(object sender, EventArgs e)
  194. {
  195. if(myPMAlign.inputImage != null)
  196. {
  197. if(myPMAlign.CreateModelTemplate(false, null) == 0)
  198. {
  199. if (myPMAlign.matchMode == MatchMode.BasedShape)
  200. {
  201. HOperatorSet.GetShapeModelContours(out contour, myPMAlign.modelID, (HTuple)1);
  202. HTuple area, row, col;
  203. HOperatorSet.AreaCenter(myPMAlign.templateRegion, out area, out row, out col);
  204. HTuple homMat2D;
  205. HOperatorSet.HomMat2dIdentity(out homMat2D);
  206. HOperatorSet.HomMat2dTranslate(homMat2D, row, col, out homMat2D);
  207. HOperatorSet.AffineTransContourXld(contour, out contour, homMat2D);
  208. }
  209. myHwindow.DispHWindow.ClearWindow();
  210. hWindowTool_Smart1.DispHWindow.ClearWindow();
  211. myHwindow.DispImage(myPMAlign.inputImage);
  212. //在模板窗口显示模板
  213. HTuple row1, col1, row2, col2;
  214. HOperatorSet.SmallestRectangle1(myPMAlign.templateRegion, out row1, out col1, out row2, out col2);
  215. HObject outRectangle1;
  216. HOperatorSet.GenRectangle1(out outRectangle1, row1, col1, row2, col2);
  217. HObject imageReduced;
  218. HOperatorSet.ReduceDomain(myPMAlign.inputImage, outRectangle1, out imageReduced);
  219. HOperatorSet.SetSystem("flush_graphic", "true");
  220. hWindowTool_Smart1.DispImage(myPMAlign.modelPartImage);
  221. if (myPMAlign.matchMode == MatchMode.BasedShape)
  222. {
  223. HOperatorSet.SetLineStyle(myHwindow.DispHWindow, new HTuple());
  224. HOperatorSet.SetColor(myHwindow.DispHWindow, new HTuple("orange"));
  225. HOperatorSet.DispObj(contour, myHwindow.DispHWindow);
  226. }
  227. }
  228. else
  229. {
  230. LoggerClass.WriteLog("创建模板失败!", MsgLevel.Exception);
  231. }
  232. }
  233. else
  234. {
  235. myPMAlign.isCreateModel = false;
  236. }
  237. }
  238. /// <summary>
  239. /// 设定工具运行状态
  240. /// </summary>
  241. /// <param name="msg">运行中的信息</param>
  242. /// <param name="status">运行状态</param>
  243. public void SetToolStatus(string msg, ToolRunStatu status, Exception ex = null)
  244. {
  245. if (myPMAlign != null)
  246. {
  247. myPMAlign.runMessage = msg;
  248. myPMAlign.toolRunStatu = status;
  249. lb_RunStatus.Text = myPMAlign.toolRunStatu == ToolRunStatu.Succeed ? "工具运行成功!" : $"工具运行异常, 异常原因:{myPMAlign.runMessage}";
  250. lb_RunTime.Text = myPMAlign.runTime;
  251. if (myPMAlign.toolRunStatu == ToolRunStatu.Succeed)
  252. {
  253. statusStrip.BackColor = Color.LimeGreen;
  254. }
  255. else
  256. {
  257. statusStrip.BackColor = Color.Red;
  258. }
  259. }
  260. }
  261. private void PreProcess_CheckChanged(object sender, EventArgs e)
  262. {
  263. if(!isInitTool)
  264. {
  265. myPMAlign.imageProcess.erosionValue1.isEnable = cbCErosion1.Checked;
  266. myPMAlign.imageProcess.dilationValue.isEnable = cbCDilation1.Checked;
  267. myPMAlign.imageProcess.erosionValue2.isEnable = cbCErosion2.Checked;
  268. }
  269. }
  270. private void PreValueChanged(double value)
  271. {
  272. if (!isInitTool)
  273. {
  274. myPMAlign.imageProcess.erosionValue1.algValue = cNumErosionValue1.Value;
  275. myPMAlign.imageProcess.dilationValue.algValue = cNumDilationValue2.Value;
  276. myPMAlign.imageProcess.erosionValue2.algValue = cNumErosionValue2.Value;
  277. }
  278. }
  279. private void rabShape_CheckedChanged(object sender, EventArgs e)
  280. {
  281. myPMAlign.matchMode = rabShape.Checked ? MatchMode.BasedShape : MatchMode.BasedGray;
  282. }
  283. private void cmbErsion1_SelectedIndexChanged()
  284. {
  285. if (!isInitTool)
  286. {
  287. myPMAlign.imageProcess.erosionValue1.algName = cmbErsion1.TextStr;
  288. myPMAlign.imageProcess.dilationValue.algName = cmbDilation.TextStr;
  289. myPMAlign.imageProcess.erosionValue2.algName = cmbErsion2.TextStr;
  290. }
  291. }
  292. private void tsbtRunTool_Click(object sender, EventArgs e)
  293. {
  294. myPMAlign.Run(SoftwareRunState.Debug);
  295. }
  296. private void tkb_contrast_Scroll(object sender, EventArgs e)
  297. {
  298. lbl_contastValue.Text = tkb_contrast.Value.ToString();
  299. }
  300. private void UIParams_ValueChanged(double value)
  301. {
  302. if (!isInitTool)
  303. {
  304. myPMAlign.minScore = nud_minScore.Value;
  305. myPMAlign.startAngle = Convert.ToInt16(nud_angleStart.Value);
  306. myPMAlign.angleRange = Convert.ToInt16(nud_angleRange.Value);
  307. myPMAlign.angleStep = Convert.ToInt16(nud_angleStep.Value);
  308. myPMAlign.polarity = cbx_polarity.TextStr;
  309. myPMAlign.isAutoConstants = ckb_autoContrast.Checked;
  310. myPMAlign.minScale = nud_ScaleStart.Value;
  311. myPMAlign.maxScale = nud_ScaleRange.Value;
  312. }
  313. }
  314. private void btnChangeModel_Click(object sender, EventArgs e)
  315. {
  316. if(!File.Exists(myPMAlign.trainShmPath))
  317. {
  318. MessageBox.Show("无已训练好的模型,请先创建模型");
  319. return;
  320. }
  321. else
  322. {
  323. if (myPMAlign.oldTrainImage == null && File.Exists(myPMAlign.trainImgPath) && File.Exists(myPMAlign.trainModelPath))
  324. {
  325. try
  326. {
  327. HOperatorSet.ReadImage(out myPMAlign.oldTrainImage, myPMAlign.trainImgPath);
  328. HOperatorSet.ReadImage(out myPMAlign.modelPartImage, myPMAlign.trainModelPath);
  329. }
  330. catch (Exception)
  331. {
  332. }
  333. }
  334. myPMAlign.inputImage = myPMAlign.oldTrainImage;
  335. myPMAlign.Run(SoftwareRunState.Debug);
  336. }
  337. }
  338. private void cbx_searchRegionType_SelectedIndexChanged()
  339. {
  340. serachRegion_drawing_object.ClearDrawingObject();
  341. string selectRegion = cbx_searchRegionType.TextStr;
  342. switch (selectRegion)
  343. {
  344. case "整幅图像":
  345. myPMAlign.searchRegionType = RegionType.AllImage;
  346. return;
  347. case "矩形":
  348. myPMAlign.searchRegionType = RegionType.Rectangle1;
  349. serachRegion_drawing_object = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, new HTuple[] { 100, 100, 300, 400 });
  350. break;
  351. case "圆":
  352. myPMAlign.searchRegionType = RegionType.Circle;
  353. serachRegion_drawing_object = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.CIRCLE, new HTuple[] { 200, 200, 100 });
  354. break;
  355. case "多点":
  356. myPMAlign.searchRegionType = RegionType.MultPoint;
  357. break;
  358. default:
  359. break;
  360. }
  361. GC.KeepAlive(serachRegion_drawing_object);
  362. serachRegion_drawing_object.OnSelect(OnSerchRegionDrawingObject);
  363. serachRegion_drawing_object.OnAttach(OnSerchRegionDrawingObject);
  364. serachRegion_drawing_object.OnResize(OnSerchRegionDrawingObject);
  365. serachRegion_drawing_object.OnDrag(OnSerchRegionDrawingObject);
  366. serachRegion_drawing_object.SetDrawingObjectParams("color", "yellow");
  367. myHwindow.DispHWindow.AttachDrawingObjectToWindow(serachRegion_drawing_object);
  368. }
  369. }
  370. }