using LB_VisionProcesses.Cameras;
using LB_VisionProcesses.Communicators;
using LB_VisionProcesses.Alogrithms;
using LB_VisionProcesses.Alogrithms.Halcon;
using System.Collections.Concurrent;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text.Json.Serialization;
namespace LB_VisionProcesses
{
public abstract class IProcess : IDisposable, ICloneable
{
///
/// 流程集合
///
public static Dictionary dicProcesses = new Dictionary
{
//相机
{ "相机取图", "LB_VisionProcesses.Cameras.CameraConfig" },
////读码器
//{ "读码器", "LB_VisionProcesses.Cameras.CameraConfig" },
//通讯
{ "通讯测试", "LB_VisionProcesses.Communicators.CommunicatorConfig" },
//{ "T306通讯", "LB_VisionProcesses.Communicators.T306CommandTool" },
{ "T306通讯", "LB_VisionProcesses.Communicators.T306CommandTool" },
{ "ModbusRTU", "LB_VisionProcesses.Processes.ModbusRTUMasterTool" },
{ "ModbusTCP", "LB_VisionProcesses.Processes.ModbusTCPMasterTool" },
//Halcon2D算法
{ "Halcon2D_模板匹配工具", "LB_VisionProcesses.Alogrithms.Halcon.HFindModelTool" },
{ "Halcon2D_多模板匹配工具", "LB_VisionProcesses.Alogrithms.Halcon.HFindMultiModelTool" },
{ "Halcon2D_斑点工具", "LB_VisionProcesses.Alogrithms.Halcon.HBlobTool" },
{ "Halcon2D_读码工具", "LB_VisionProcesses.Alogrithms.Halcon.HFindCode2dTool" },
{ "Halcon2D_找线工具", "LB_VisionProcesses.Alogrithms.Halcon.HFindLineTool" },
{ "Halcon2D_找弧工具", "LB_VisionProcesses.Alogrithms.Halcon.HFindEllipseTool" },
{ "Halcon2D_图像增强工具", "LB_VisionProcesses.Alogrithms.Halcon.HImageEnhancementTool" },
//思谋深度学习算法
{ "语义分割工具", "LB_VisionProcesses.Alogrithms.BigModel.Segment.SegmentTool" },
//图像处理
{ "单图像处理工具", "LB_VisionProcesses.Alogrithms.OneImageConvertTool" },
{ "点云转换工具", "LB_VisionProcesses.Alogrithms.PointsCloudConvertTool" },
{ "畸变矫正工具", "LB_VisionProcesses.Alogrithms.Halcon.HCaltabTool" },
//OpenCvSharp
{ "OpenCvSharp_模板匹配工具", "LB_VisionProcesses.Alogrithms.OpenCvSharp.FindModelTool" },
{ "OpenCvSharp_斑点工具", "LB_VisionProcesses.Alogrithms.OpenCvSharp.BlobTool" },
{ "OpenCvSharp_找线工具", "LB_VisionProcesses.Alogrithms.OpenCvSharp.FindLineTool" },
//工具
{ "创建绘制工具", "LB_VisionProcesses.Processes.RecordTool" },
{ "创建固定跟随", "LB_VisionProcesses.Alogrithms.CreateFixtureTool" },
{ "创建线段工具", "LB_VisionProcesses.Alogrithms.CreateSegmentTool" },
{ "创建垂线工具", "LB_VisionProcesses.Alogrithms.CreateVerticalTool" },
{ "线线交点工具", "LB_VisionProcesses.Alogrithms.IntersectionLine2Tool" },
{ "脚本", "LB_VisionProcesses.Processes.ScriptTool" },
{ "延时", "LB_VisionProcesses.Processes.DelayTime" },
{ "分支", "LB_VisionProcesses.Processes.ScriptTool" },
{ "多分支", "LB_VisionProcesses.Processes.ScriptTool" },
};
static IProcess()
{
_isRunningVisionProServer = true;
}
public static bool _isRunningVisionProServer = false;
///
/// 通讯和相机集合
///
public static List lstCommunicators = new List();
public static List lstCameras = new List();
///
/// 固定跟随集合
///
public static ConcurrentDictionary dicFixtures = new ConcurrentDictionary();
///
/// 畸变矫正集合
///
public static ConcurrentDictionary dicHCaltabMaps = new ConcurrentDictionary();
///
/// 全局变量集合(Key:变量名,Value:变量值)
///
public static ConcurrentDictionary dicGlobalVars = new ConcurrentDictionary();
///
/// 运行日志
///
public string Msg = "运行成功";
///
/// 运行结果
///
public bool Result = true;
///
/// 运行时间
///
public double RunTime = 0;
///
/// 允许运行时间
///
public double MaxTimeOut = 2000;
///
/// 工具名称
///
public string strProcessName = string.Empty;
///
/// 工具类名
///
public string strProcessClass = "LB_VisionProcesses.IProcess";
///
/// 算法参数
///
public ProcessParams Params = new ProcessParams();
///
/// 输入图片
///
public object InputImage;
///
/// 输出图片
///
public object OutputImage;
///
/// 结果区域
///
public ObjectRecord Record = new ObjectRecord();
///
/// 运行完成标记
///
public bool bCompleted = false;
public abstract void InitRunParams();
public abstract bool Run();
public abstract bool Load(string fullPath);
public abstract bool Save(string filePath);
public static Assembly GetExecutingAssembly()
{
return Assembly.GetExecutingAssembly();
}
public abstract object Clone();
public abstract void Dispose();
}
[Serializable]
public class Fixture
{
///
/// 横坐标X
///
public double X = 0;
public double Column
{
get { return X; }
set { X = value; }
}
///
/// 纵坐标Y
///
public double Y = 0;
public double Row
{
get { return Y; }
set { Y = value; }
}
///
/// 弧度Phi
///
public double Phi = 0;
public double Angle
{
get { return Phi / Math.PI * 180; }
set { Phi = value / 180 * Math.PI; }
}
public string strName = "";
public Fixture() { }
[JsonConstructor] // 标记为用于反序列化
public Fixture(double x, double y, double phi, string strName)
{
this.X = x; this.Y = y; this.Phi = phi;
this.strName = strName;
}
public Fixture(Fixture fixture)
{
if (fixture == null)
return;
this.X = fixture.X; this.Y = fixture.Y; this.Phi = fixture.Phi;
this.strName = fixture.strName;
}
public Fixture(string strName) => this.strName = strName;
public void GetOffset(double x, double y, double phi, out double offsetX, out double offsetY, out double offsetPhi)
{
offsetX = X - x; offsetY = Y - y; offsetPhi = Phi - phi;
}
public object Clone()
{
return MemberwiseClone();
}
}
public class NaturalStringComparer : IComparer
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
public static extern int StrCmpLogicalW(string psz1, string psz2);
public int Compare(string x, string y)
{
return StrCmpLogicalW(x, y);
}
}
}