using HalconDotNet; using LB_VisionControls; using LB_VisionProcesses.Alogrithms.Halcon; using OpenCvSharp; using static LB_VisionProcesses.Alogrithms.FindCode2dTool; namespace LB_VisionProcesses.Alogrithms { public partial class FindCode2dToolEdit : TAlgorithmEdit { public FindCode2dToolEdit(FindCode2dTool subject = null) { if (subject != null && subject is FindCode2dTool) Subject = subject; else Subject = new FindCode2dTool(); this.Dock = DockStyle.Fill; InitializeComponent(); } /// /// 控件加载事件 /// /// /// private void HFindCode2dToolEdit_Load(object sender, EventArgs e) { pnlInputImage.Controls.Add(inputImageHSmartWindowControl); inputImageHSmartWindowControl.Dock = DockStyle.Fill; pnlRecordImage.Controls.Add(recordImageHSmartWindowControl); recordImageHSmartWindowControl.Dock = DockStyle.Fill; //遍历可以选择的Roi类型枚举 foreach (var value in Enum.GetValues(typeof(RoiType))) { cmbTypeRoi.Items.Add(value.ToString()); } //遍历可以选择的条码类型枚举 foreach (var value in Enum.GetValues(typeof(Code2dType))) { cmbCode2dType.Items.Add(value.ToString()); } //遍历可以选择的Fixture枚举 cmbFixture.Items.Add(""); foreach (string value in IProcess.dicFixtures.Keys) { cmbFixture.Items.Add(value.ToString()); } cmbTypeRoi.Text = RoiType.None.ToString(); cmbCode2dType.Text = Code2dType.None.ToString(); LoadParas(); if (Subject.Result) { lblResult.BackColor = Color.Green; lblResult.Text = "True"; } else { lblResult.BackColor = Color.Red; lblResult.Text = "False"; } lblMsg.Text = Msg.Length > 50 ? Msg.Substring(0, 50) : Msg; lblMsgToolTip.SetToolTip(BtmStatusStrip, Msg); lblRunTime.Text = $"{Subject.RunTime}ms"; } /// /// 更新运行参数 /// public override void UpdataInputs() { //设置运行参数 int iResult = 0; Subject.Params.Inputs["Code2dType"] = cmbCode2dType.SelectedItem.ToString(); Subject.Params.Inputs["CodeHead"] = stxtCodeHead.Text; Subject.Params.Inputs["CodeLength"] = int.TryParse(dtxtCodeLength.Text, out iResult) ? iResult : Subject.Params.Inputs["CodeLength"]; Subject.Params.Inputs["MinThreshold"] = int.TryParse(dtxtMinThreshold.Text, out iResult) ? iResult : Subject.Params.Inputs["MinThreshold"]; Subject.Params.Inputs["MaxThreshold"] = int.TryParse(dtxtMaxThreshold.Text, out iResult) ? iResult : Subject.Params.Inputs["MaxThreshold"]; Subject.Params.Inputs["MinCount"] = int.TryParse(dtxtMinCount.Text, out iResult) ? iResult : Subject.Params.Inputs["MinCount"]; Subject.Params.Inputs["MaxCount"] = int.TryParse(dtxtMaxCount.Text, out iResult) ? iResult : Subject.Params.Inputs["MaxCount"]; if (cmbFixture.Text == "") { Subject.Params.Fixture = new Fixture(); } else if (IProcess.dicFixtures.ContainsKey(cmbFixture.Text)) { Subject.Params.Fixture = IProcess.dicFixtures[cmbFixture.Text]; } Type type = inputImageHSmartWindowControl.oRoi?.GetType(); switch (type) { case Type t when t == typeof(HRectangle2): { HRectangle2 hRectangle2 = (HRectangle2)inputImageHSmartWindowControl.oRoi; Subject.Params.ROI = new HRectangle2(hRectangle2.X - Subject.Params.Fixture.X, hRectangle2.Y - Subject.Params.Fixture.Y , hRectangle2.Phi - Subject.Params.Fixture.Phi, hRectangle2.Width, hRectangle2.Height); break; } case Type t when t == typeof(HCircle): { HCircle hCircle = (HCircle)inputImageHSmartWindowControl.oRoi; Subject.Params.ROI = new HCircle(hCircle.X - Subject.Params.Fixture.X, hCircle.Y - Subject.Params.Fixture.Y, hCircle.Radius); break; } case Type t when t == typeof(HSegment): { HSegment hSegment = (HSegment)inputImageHSmartWindowControl.oRoi; Subject.Params.ROI = new HSegment(hSegment.StartX - Subject.Params.Fixture.X, hSegment.StartY - Subject.Params.Fixture.Y , hSegment.EndX - Subject.Params.Fixture.X, hSegment.EndY - Subject.Params.Fixture.Y); break; } default: { Subject.Params.ROI = new ROI(); break; } } } /// /// 加载运行参数 /// public override void LoadParas() { this.BeginInvoke(new Action(() => { cmbCode2dType.Text = ProcessParams.ConvertToString(Subject.Params.Inputs["Code2dType"]); stxtCodeHead.Text = ProcessParams.ConvertToString(Subject.Params.Inputs["CodeHead"]); dtxtCodeLength.Text = Subject.Params.Inputs["CodeLength"].ToString(); dtxtMinThreshold.Text = Subject.Params.Inputs["MinThreshold"].ToString(); dtxtMaxThreshold.Text = Subject.Params.Inputs["MaxThreshold"].ToString(); dtxtMinCount.Text = Subject.Params.Inputs["MinCount"].ToString(); dtxtMaxCount.Text = Subject.Params.Inputs["MaxCount"].ToString(); if (Subject.InputImage != null && Subject.InputImage is Mat) { TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image); inputImageHSmartWindowControl.ShowHoImage(image); } Type type = Subject.Params.ROI?.GetType(); if (Subject.Params.ROI != null) { switch (type) { case Type t when t == typeof(HRectangle2): { cmbTypeRoi.Text = RoiType.Rectangle2.ToString(); break; } case Type t when t == typeof(HCircle): { cmbTypeRoi.Text = RoiType.Circle.ToString(); break; } case Type t when t == typeof(HSegment): { cmbTypeRoi.Text = RoiType.Segment.ToString(); break; } default: { cmbTypeRoi.Text = RoiType.None.ToString(); break; } } if (cmbTypeRoi.Text.ToString() != "None") { ckbDrawRoi.Checked = true; } else { ckbDrawRoi.Checked = false; } inputImageHSmartWindowControl.oRoi = Subject.Params.ROI; } if (Subject.Params.Fixture != null) { cmbFixture.Text = Subject.Params.Fixture.strName; } else { cmbFixture.Text = ""; } switch (type) { case Type t when t == typeof(HRectangle2): { inputImageHSmartWindowControl.oRoi = new HRectangle2(Subject.Params.ROI.X + Subject.Params.Fixture.X, Subject.Params.ROI.Y + Subject.Params.Fixture.Y , Subject.Params.ROI.Phi + Subject.Params.Fixture.Phi, ((HRectangle2)Subject.Params.ROI).Width, ((HRectangle2)Subject.Params.ROI).Height); break; } case Type t when t == typeof(HCircle): { inputImageHSmartWindowControl.oRoi = new HCircle(Subject.Params.ROI.X + Subject.Params.Fixture.X, Subject.Params.ROI.Y + Subject.Params.Fixture.Y , ((HCircle)Subject.Params.ROI).Radius); break; } case Type t when t == typeof(HSegment): { inputImageHSmartWindowControl.oRoi = new HSegment(((HSegment)Subject.Params.ROI).StartX + Subject.Params.Fixture.X, ((HSegment)Subject.Params.ROI).StartY + Subject.Params.Fixture.Y , ((HSegment)Subject.Params.ROI).EndX + Subject.Params.Fixture.X, ((HSegment)Subject.Params.ROI).EndY + Subject.Params.Fixture.Y); break; } default: { inputImageHSmartWindowControl.oRoi = null; break; } } })); } /// /// 更新输出结果 /// public override void UpdataOutputs() { this.BeginInvoke(new Action(() => { //存在反序列化错乱的情况需要使用自定义的转换器 stxtCodeStrings.Text = ProcessParams.ConvertToString(Subject.Params.Outputs["CodeStrings"]); dtxtCount.Text = ProcessParams.ConvertToString(Subject.Params.Outputs["Count"]); })); } /// /// 点击运行 /// /// /// public override void btnRun_Click(object sender, EventArgs e) { if (Subject.InputImage != null) { InputImage = Subject.InputImage; } DateTime StartTime = DateTime.Now; Run(); //更新日志与结果 this.BeginInvoke(new Action(() => { if (Subject.Result) { lblResult.BackColor = Color.Green; lblResult.Text = "True"; recordImageHSmartWindowControl.SetColor("green"); } else { lblResult.BackColor = Color.Red; lblResult.Text = "False"; recordImageHSmartWindowControl.SetColor("red"); } lblMsg.Text = Msg.Length > 50 ? Msg.Substring(0, 50) : Msg; lblMsgToolTip.SetToolTip(BtmStatusStrip, Msg); lblRunTime.Text = $"{(DateTime.Now - StartTime).TotalMilliseconds}ms"; UpdataOutputs(); imgTabControl.SelectedTab = tabPageRecordImage; //if (Subject.OutputImage != null && Subject.OutputImage is HObject ho_image) // recordImageHSmartWindowControl.ShowHoImage(ho_image); if (Subject.InputImage != null) { if (Subject.InputImage is HObject ho_image && ho_image.IsInitialized()) { recordImageHSmartWindowControl.ShowHoImage(ho_image); } else if (Subject.InputImage is Bitmap) { TAlgorithm.Bitmap2HObject((Bitmap)Subject.InputImage, out HObject image); recordImageHSmartWindowControl.ShowHoImage(image); } else if (Subject.InputImage is Mat) { TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image); recordImageHSmartWindowControl.ShowHoImage(image); } } //先判断子类再判断父类 if (Subject.Record != null && Subject.Record is MsgRecord msgRecord) { recordImageHSmartWindowControl.DispObj(msgRecord.RecordObject_OK, true); recordImageHSmartWindowControl.DispObj(msgRecord.RecordObject_NG, false); for (int i = 0; i < msgRecord.Msg.Length; i++) { recordImageHSmartWindowControl.ShowMsg(msgRecord.Msg[i] , 1 == msgRecord.Result[i] ? true : false, msgRecord.Column[i], msgRecord.Row[i]); } } else if (Subject.Record != null && Subject.Record is ObjectRecord objRecord) { recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_OK, true); recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_NG, false); } GC.Collect(); })); } private new void btnLoadImage_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); // 设置文件对话框的属性 openFileDialog.Multiselect = false; // 不允许多选 // 设置文件过滤器,支持多种文件类型 openFileDialog.Filter = "Image Files (*.png;*.jpg;*.jpeg;*.bmp)|*.png;*.jpg;*.jpeg;*.bmp|All Files (*.*)|*.*"; // 显示文件对话框 DialogResult result = openFileDialog.ShowDialog(); // 处理对话框返回结果 if (result == DialogResult.OK) { // 获取用户选择的文件名 string[] selectedFiles = openFileDialog.FileNames; if (selectedFiles.Length > 0) { Mat mat = new Mat(selectedFiles[0]); if (mat == null) { lblResult.BackColor = Color.Red; lblResult.Text = "False"; lblMsg.Text = $"图片导入失败,路径为{selectedFiles[0]}"; } InputImage = mat; imgTabControl.SelectedTab = tabPageInputImage; inputImageHSmartWindowControl.oRoi = inputImageHSmartWindowControl.oRoi; } } } public override void btnSaveParas_Click(object sender, EventArgs e) { base.btnSaveParas_Click(sender, e); } public override void ckbDrawRoi_CheckedChanged(object sender, EventArgs e) { if (ckbDrawRoi.Checked) { inputImageHSmartWindowControl.bAollowDraw = true; imgTabControl.SelectedTab = tabPageInputImage; } else { inputImageHSmartWindowControl.bAollowDraw = false; Subject.Params.ROI = new ROI(); } } public override void cmbTypeRoi_SelectedIndexChanged(object sender, EventArgs e) { try { if (Enum.TryParse(cmbTypeRoi.Text.ToString(), out RoiType type)) { HTuple hv_imageWidth = 100; HTuple hv_imageHeight = 100; if (InputImage != null && InputImage is Mat mat) { hv_imageWidth = mat.Width; hv_imageHeight = mat.Height; } switch (type) { case RoiType.Rectangle2: { inputImageHSmartWindowControl.oRoi = new HRectangle2(hv_imageWidth.TupleReal() / 2, hv_imageHeight.TupleReal() / 2, 0 , hv_imageWidth.TupleReal() / 4, hv_imageHeight.TupleReal() / 4); break; } case RoiType.Circle: { inputImageHSmartWindowControl.oRoi = new HCircle(hv_imageWidth.TupleReal() / 2, hv_imageHeight.TupleReal() / 2, hv_imageWidth.TupleReal() / 4); break; } case RoiType.Segment: { inputImageHSmartWindowControl.oRoi = new HSegment(0, 0, hv_imageWidth.TupleReal() / 4, hv_imageHeight.TupleReal() / 4); break; } case RoiType.None: default: { inputImageHSmartWindowControl.oRoi = null; break; } } } } catch { } } public override void cmbFixture_SelectedIndexChanged(object sender, EventArgs e) { try { if (IProcess.dicFixtures.ContainsKey(cmbFixture.Text)) { Subject.Params.Fixture = IProcess.dicFixtures[cmbFixture.Text]; } else { Subject.Params.Fixture = new Fixture(); } } catch { } } } }