using HalconDotNet; using LB_VisionProcesses.Alogrithms.Halcon; using LB_VisionControls; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using OpenCvSharp; namespace LB_VisionProcesses.Alogrithms { public class CreateVerticalTool : TAlgorithm { public CreateVerticalTool() { strProcessClass = "LB_VisionProcesses.Alogrithms.CreateVerticalTool"; strProcessName = "创建垂线工具"; Params.Inputs.Add("X", 0); Params.Inputs.Add("Y", 0); Params.Inputs.Add("HSegment", new HSegment()); Params.Inputs.Add("畸变关系", ""); Params.Inputs.Add("是否畸变转换", false); Params.Outputs.Add("FeetX", 0.0); Params.Outputs.Add("FeetY", 0.0); 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(); HPoint HPoint_Base = new HPoint(Convert.ToDouble(Params.Inputs["X"]), Convert.ToDouble(Params.Inputs["Y"])); var OSegment_Base = Params.Inputs["HSegment"]; if (!(OSegment_Base is HSegment)) { Msg = $"HSegment不存在"; Result = false; return; } HSegment HSegment_Base = (HSegment)OSegment_Base; Point2f feetPoint2f = TAlgorithm.CalculateFootPoint(new Point2f(Convert.ToSingle(HPoint_Base.X), Convert.ToSingle(HPoint_Base.Y)) , new Point2f(Convert.ToSingle(HSegment_Base.StartX), Convert.ToSingle(HSegment_Base.StartY)) , new Point2f(Convert.ToSingle(HSegment_Base.EndX), Convert.ToSingle(HSegment_Base.EndY))); HPoint HPoint_Feet = new HPoint(feetPoint2f.X, feetPoint2f.Y); // XLD用原始坐标 HOperatorSet.GenRegionLine(out HObject xld, HPoint_Base.Row, HPoint_Base.Column, HPoint_Feet.Row, HPoint_Feet.Column); Record.AddXld(xld); bool isCaltab = Convert.ToBoolean(Params.Inputs["是否畸变转换"]); if (isCaltab) { string CaltabName = Params.Inputs["畸变关系"]?.ToString(); if (!dicHCaltabMaps.ContainsKey(CaltabName)) { Msg = $"畸变关系{CaltabName}不存在"; Result = false; return; } var HCaltabMap = dicHCaltabMaps[CaltabName]; HCaltabMap.GetCaltbPoint(HPoint_Base, out HPoint_Base); HCaltabMap.GetCaltbPoint(HPoint_Feet, out HPoint_Feet); } HSegment HSegment_Vertical = new HSegment(HPoint_Base, HPoint_Feet); #endregion #region 结果处理 Params.Outputs.Add("FeetX", HPoint_Feet.X); Params.Outputs.Add("FeetY", HPoint_Feet.Y); Params.Outputs.Add("CenterX", HSegment_Vertical.X); Params.Outputs.Add("CenterY", HSegment_Vertical.Y); Params.Outputs.Add("Phi", HSegment_Vertical.Phi); Params.Outputs.Add("Length", HSegment_Vertical.Length); Params.Outputs.Add("HSegment", HSegment_Vertical); #endregion #region 生成OutputImage给后续处理 try { OutputImage = InputImage; } catch (Exception ex) { Msg = "生成OutputImage失败,原因是:" + ex.ToString(); Result = false; return; } #endregion if (Msg == "运行超时") { Result = false; return; } return; } catch (Exception ex) { Msg = "运行失败,原因是:" + ex.ToString().TrimEnd(); OutputImage = null; Result = false; return; } finally { bCompleted = true; #region 内存释放 if (!Result) { Params.Outputs.Add("FeetX", 0.0); Params.Outputs.Add("FeetY", 0.0); 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()); } #endregion } } } }