using HalconDotNet; using LB_SmartVisionCommon; using LB_VisionControls; using LB_VisionProcesses.Alogrithms.Halcon; using OpenCvSharp; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LB_VisionProcesses.Alogrithms { public class CreateSegmentTool : TAlgorithm { public CreateSegmentTool() { strProcessClass = "LB_VisionProcesses.Alogrithms.CreateSegmentTool"; strProcessName = "创建线段工具"; Params.Inputs.Add("P1X", 0); Params.Inputs.Add("P1Y", 0); Params.Inputs.Add("P2X", 0); Params.Inputs.Add("P2Y", 0); Params.Inputs.Add("畸变关系", ""); Params.Inputs.Add("是否畸变转换", false); Params.Outputs.Add("CenterX", 0.0); Params.Outputs.Add("CenterY", 0.0); Params.Outputs.Add("Phi", 0.0); Params.Outputs.Add("Length", 0.0); Params.Outputs.Add("HSegment", new HSegment()); } /// /// 算子逻辑 /// public override void TAlgorithmMain() { #region 初始化变量 #endregion try { #region 裁剪区域 #endregion #region 算子逻辑 Record = new ObjectRecord(); var P1 = new HPoint(Convert.ToDouble(Params.Inputs["P1X"]), Convert.ToDouble(Params.Inputs["P1Y"])); var P2 = new HPoint(Convert.ToDouble(Params.Inputs["P2X"]), Convert.ToDouble(Params.Inputs["P2Y"])); bool isCaltab = Convert.ToBoolean(Params.Inputs["是否畸变转换"]); if (isCaltab) { string CaltabName = Params.Inputs["畸变关系"]?.ToString(); if (!dicHCaltabMaps.ContainsKey(CaltabName)) { Msg = $"畸变关系{CaltabName}不存在"; Result = false; AsyncLogHelper.Error(Msg); return; } var HCaltabMap = dicHCaltabMaps[CaltabName]; HCaltabMap.GetCaltbPoint(P1, out P1); HCaltabMap.GetCaltbPoint(P2, out P2); } HSegment HSegment = new HSegment(P1, P2); // XLD用原始坐标 HOperatorSet.GenRegionLine(out HObject xld, Convert.ToDouble(Params.Inputs["P1Y"]), Convert.ToDouble(Params.Inputs["P1X"]) , Convert.ToDouble(Params.Inputs["P2Y"]), Convert.ToDouble(Params.Inputs["P2X"])); Record.AddRecord(xld); #endregion #region 结果处理 Params.Outputs.Add("CenterX", HSegment.MidX); Params.Outputs.Add("CenterY", HSegment.MidY); Params.Outputs.Add("Phi", HSegment.Phi); Params.Outputs.Add("Length", HSegment.Length); Params.Outputs.Add("HSegment", HSegment); #endregion #region 生成OutputImage给后续处理 try { OutputImage = InputImage; } catch (Exception ex) { Msg = "生成OutputImage失败,原因是:" + ex.ToString(); Result = false; AsyncLogHelper.Error(Msg); return; } #endregion if (Msg == "运行超时") { Result = false; return; } return; } catch (Exception ex) { Msg = "运行失败,原因是:" + ex.ToString().TrimEnd(); OutputImage = null; Result = false; AsyncLogHelper.Error(Msg); return; } finally { bCompleted = true; #region 内存释放 if (!Result) { Params.Outputs.Add("CenterX", 0); Params.Outputs.Add("CenterY", 0); Params.Outputs.Add("Phi", 0); Params.Outputs.Add("Length", 0); Params.Outputs.Add("HSegment", new HSegment()); } #endregion } } } }