using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; using HalconDotNet; namespace HalconTools { public class HalconTool { #region 各种单方法以及定义 #region 定义 public HWndCtrl viewController; public ListenEventCreater resultCreater = new ListenEventCreater(); public struct FindLineResult { public string SerialNumer; public FitLineResult fitLineResult; } public struct FindCircleResult { public string SerialNumber; public FitCircleResult fitCircleResult; } public struct PatternMatchResult { public string SerialNumber; public MatchingResult matchingResult; } public struct FindContourResult { public string SerialNumber; public ContourResult contourResult; } public List findLineResults = new List(); public List findCircleResults = new List(); public List patternMatchResults = new List(); public FindLineResult findLineResult = new FindLineResult(); public FindCircleResult findCircleResult = new FindCircleResult(); public PatternMatchResult patternMatchResult = new PatternMatchResult(); public FindContourResult contourResult = new FindContourResult(); public FitAssistant mFitAssistant = new FitAssistant(); public HImage image; public FitLineResult result; public MatchingAssistant mMatchingAssistant = new MatchingAssistant(); public ContourAssistant mContourAssistant = new ContourAssistant(); public FitLineParam fitLinePara = new FitLineParam(); public FitCircleParam fitCirclePara = new FitCircleParam(); public MatchingParam matchingPara = new MatchingParam(); public ContourParam contourPara = new ContourParam(); public HImage hImage; public List fitLineParas = new List(); public List fitCircleParas = new List(); SerializeFileTool> sft1 = new SerializeFileTool>(); SerializeFileTool> sft2 = new SerializeFileTool>(); #endregion #region 初始化 public void initHalconTool() { mFitAssistant.FitLineDone += new FitLineDelegate(mFitAssistant_FitLineDone); mFitAssistant.FitCircleDone += new FitCircleDelegate(mFitAssistant_FitCircleDone); mFitAssistant.NotifyIconObserverMessage += new FitMessageDelegate(mFitAssistant_NotifyIconObserverMessage); mMatchingAssistant.FindShapeModelDone += new FindShapeModelDelegate(mMatchingAssistant_FindShapeModelDone); mContourAssistant.ContourDone += new ContourDelegate(mContourAssistant_ContourDone); //mMatchingAssistant .NotifyIconObserver+= string FolderPath = Application.StartupPath + "\\FitConfig"; string FilePath; FilePath = FolderPath + "\\fitLineConfig.xml"; fitLineParas = sft1.GetConfig(FilePath); FilePath = FolderPath + "\\fitCircleConfig.xml"; fitCircleParas = sft2.GetConfig(FilePath); } public HalconTool() { JobImage = new HImage(); mFitAssistant = new FitAssistant(); mMatchingAssistant = new MatchingAssistant(); initHalconTool(); } /// /// /// /// fit算法的窗口 /// 匹配的模板数量 public HalconTool(HWindowControl viewPort, int ModuleNum) { mFitAssistant = new FitAssistant(viewPort); mMatchingAssistant = new MatchingAssistant(ModuleNum); initHalconTool(); } /// /// /// /// fit算法的窗口 public HalconTool(HWindowControl viewPort) { mFitAssistant = new FitAssistant(viewPort); initHalconTool(); } /// /// /// /// 匹配的模板数量 public HalconTool(int ModuleNum) { mMatchingAssistant = new MatchingAssistant(ModuleNum); initHalconTool(); } #endregion #region 消息处理部分 void mFitAssistant_FitCircleDone(object sender, HImage image, FitCircleResult result) { if (findCircleResults == null) findCircleResults = new List(); findCircleResult.fitCircleResult = result; findCircleResults.Add(findCircleResult); //反馈消息 resultCreater.ChangeValue(new EventData("FindCircleDone")); } void mFitAssistant_FitLineDone(object sender, HImage image, FitLineResult result) { ////画上找到的结果 //mFitAssistant.FitLineGraphics(mFitAssistant.viewController, image, result); //结果处理 if (findLineResults == null) findLineResults = new List(); findLineResult.fitLineResult = result; findLineResults.Add(findLineResult); //反馈消息 resultCreater.ChangeValue(new EventData("FindLineDone")); } void mMatchingAssistant_FindShapeModelDone(object sender, HImage image, MatchingResult result) { if (patternMatchResults == null) patternMatchResults = new List(); patternMatchResult.matchingResult = result; patternMatchResults.Add(patternMatchResult); resultCreater.ChangeValue(new EventData("MatchDone")); } void mFitAssistant_NotifyIconObserverMessage(int value) { //反馈没有找到的消息 resultCreater.ChangeValue(new EventData("CanNotFind")); } void mContourAssistant_ContourDone(object sender, HImage image, ContourResult result) { contourResult.contourResult = result; resultCreater.ChangeValue(new EventData("ContourDone")); } #endregion #region 找线找圆部分 /// /// 找直线 /// /// 序列号 /// Halcon图像 /// 找直线参数 public void FindLine(string sn, HImage image, FitLineParam para) { findLineResult.SerialNumer = sn; mFitAssistant.mImage = image; mFitAssistant.FitLine(para); } /// /// 找圆 /// /// 序列号 /// Halcon图像 /// 找圆参数 public void FindCircle(string sn, HImage image, FitCircleParam para) { findCircleResult.SerialNumber = sn; mFitAssistant.mImage = image; mFitAssistant.FitCircle(para); } /// /// 通过全局变量参数找直线 /// private void ThFindLine() { mFitAssistant.mImage = hImage; mFitAssistant.FitLine(fitLinePara); } /// /// 通过全局变量参数找圆 /// private void ThFindCircle() { mFitAssistant.mImage = hImage; mFitAssistant.FitCircle(fitCirclePara); } /// /// 用进程找直线 /// /// /// /// public void ThreadFindLine(string sn, HImage image, FitLineParam para) { hImage = image; fitLinePara = para; Thread findLineThread = new Thread(ThFindLine); findLineThread.Start(); } /// /// 用进程找圆 /// /// /// /// public void ThreadFindCircle(string sn, HImage image, FitCircleParam para) { hImage = image; fitCirclePara = para; Thread findCircleThread = new Thread(ThFindCircle); findCircleThread.Start(); } #endregion #region 匹配部分 /// /// 创建模板(获取模板ID) /// /// 序列号 /// 图像 /// 参数 public void CreateModule(string sn, HImage image, MatchingParam para) { patternMatchResult.SerialNumber = sn; mMatchingAssistant.mImage = image; mMatchingAssistant.parameterSet = para; mMatchingAssistant.createShapeModel(); } /// /// 匹配模板(已得到模板ID) /// /// 序列号 /// 图像 /// 参数 public void FindModule(string sn, HImage image, MatchingParam para) { patternMatchResult.SerialNumber = sn; mMatchingAssistant.mImage = image; mMatchingAssistant.parameterSet = para; mMatchingAssistant.detectShapeModel(); } /// /// 根据模板的地址匹配 /// /// 序列号 /// 图像 /// 参数 /// 模板文件地址 public void PatterMatchWithModule(string sn, HImage image, MatchingParam para, string modulePath) { patternMatchResult.SerialNumber = sn; mMatchingAssistant.tImage = image; mMatchingAssistant.parameterSet = para; mMatchingAssistant.loadShapeModel(modulePath); mMatchingAssistant.detectShapeModel(); } #endregion #region 找轮廓部分 public void FindContour(string sn, HImage image, ContourParam para) { contourResult.SerialNumber = sn; mContourAssistant.mImage = image; mContourAssistant.mContourPara = para; mContourAssistant.Run(); } #endregion #region 加载参数 /// /// 加载匹配参数 /// /// public void LoadMatchingParameter(string ParaPath) { mMatchingAssistant.LoadPara(ParaPath); matchingPara = mMatchingAssistant.parameterSet; } /// /// 加载找直线的参数 /// /// 参数文件地址 public void LoadFitLineParameter(string ParaPath) { MeasureParamSave paramSave = new HalconTools.MeasureParamSave(); paramSave = paramSave.Load(ParaPath); fitLinePara.hv_measure_Length1 = paramSave.hv_measure_Length1; fitLinePara.hv_measure_Length2 = paramSave.hv_measure_Length2; fitLinePara.hv_measure_sigma = paramSave.hv_measure_sigma; fitLinePara.hv_measure_position = paramSave.hv_measure_position; fitLinePara.hv_measure_transition = paramSave.hv_measure_transition; fitLinePara.hv_measure_number = paramSave.hv_measure_number; fitLinePara.hv_measure_threshold = paramSave.hv_measure_threshold; fitLinePara.hv_measure_interpolation = paramSave.hv_measure_interpolation; } /// /// 加载找圆参数 /// /// 参数文件地址 public void LoadFitCircleParameter(string ParaPath) { MeasureParamSave paramSave = new HalconTools.MeasureParamSave(); paramSave = paramSave.Load(ParaPath); fitCirclePara.hv_measure_Length1 = paramSave.hv_measure_Length1; fitCirclePara.hv_measure_Length2 = paramSave.hv_measure_Length2; fitCirclePara.hv_measure_sigma = paramSave.hv_measure_sigma; fitCirclePara.hv_measure_position = paramSave.hv_measure_position; fitCirclePara.hv_measure_transition = paramSave.hv_measure_transition; fitCirclePara.hv_measure_number = paramSave.hv_measure_number; fitCirclePara.hv_measure_threshold = paramSave.hv_measure_threshold; fitCirclePara.hv_measure_interpolation = paramSave.hv_measure_interpolation; } /// /// 加载轮廓参数 /// /// 参数文件地址 public void LoadContourParameter(string ParaPath) { SerializeFileTool sft = new SerializeFileTool(); contourPara = sft.GetConfig(ParaPath); } #endregion #endregion #region Job #region 定义 public SerializeFileTool> sftJobs = new SerializeFileTool>(); public List Jobs = new List(); public List JobResults = new List(); private JobResults tmpJobResults = new JobResults(); private JobResult tmpJobResult = new JobResult(); private FitLineResult tmpFitLineResult = new FitLineResult(); public HImage JobImage; private JobAssistance mJobAssistance = new JobAssistance(); #endregion public void LoadJobs() { string path = System.Windows.Forms.Application.StartupPath + "\\JobConfige\\JobConfige.xml"; Jobs = sftJobs.GetConfig(path); } public void LoadJobs(string path) { Jobs = sftJobs.GetConfig(path); } /// /// 单个job运行方法(需程序员自己编写参数传递) /// /// 序号 public void Run(int index) { if (JobImage == null) return; tmpJobResults = new JobResults(); tmpJobResults.results = new List(); tmpJobResults.name = Jobs[index].name; switch (index) { case 0: for (int j = 0; j < 2; j++) { tmpJobResult = new JobResult(); tmpJobResult = mJobAssistance.ToolRun(JobImage, Jobs[index].tools[j]); tmpJobResults.results.Add(tmpJobResult); } JobResults.Add(tmpJobResults); break; case 1: case 2: case 3: case 4: for (int j = 0; j < 4; j++) { tmpJobResult = new JobResult(); tmpJobResult = mJobAssistance.ToolRun(JobImage, Jobs[index].tools[j]); tmpJobResults.results.Add(tmpJobResult); } JobResults.Add(tmpJobResults); break; default: break; } resultCreater.ChangeValue(new EventData(Jobs[index].name + "_Done")); } /// /// 单个job运行方法(需程序员自己编写参数传递) /// /// Job名称 public void Run(string JobName) { if (JobImage == null) return; tmpJobResults = new JobResults(); tmpJobResults.results = new List(); for (int i = 0; i < Jobs.Count; i++) { if (Jobs[i].name.Equals(JobName)) { tmpJobResults.name = Jobs[i].name; switch (JobName) { case "JobLLMF": for (int j = 0; j < 1; j++) { tmpJobResult = new JobResult(); tmpJobResult = mJobAssistance.ToolRun(JobImage, Jobs[i].tools[j]); if (tmpJobResult.fitLineResult == null) { resultCreater.ChangeValue(new EventData(JobName + "_Undone")); return; } tmpJobResults.results.Add(tmpJobResult); } JobResults.Add(tmpJobResults); break; default: break; } break; } } resultCreater.ChangeValue(new EventData(JobName + "_Done")); JobImage.Dispose(); } /// /// 清空结果 /// public void Clear_JobResults() { JobResults.Clear(); } #endregion #region 计算方法 /// /// 计算2直线距离 /// /// 直线1 /// 直线2 /// 距离 public double DistanceLine2Line(FitLineResult l1, FitLineResult l2) { HTuple tmp = new HTuple(); HOperatorSet.DistancePl((l1.mRowStart + l1.mRowEnd) / 2, (l1.mColumnStart + l1.mColumnEnd) / 2, l2.mRowStart, l2.mColumnStart, l2.mRowEnd, l2.mColumnEnd, out tmp); return tmp.D; } /// /// 计算2直线交点 /// /// 直线1 /// 直线2 /// 交点x /// 交点y public void IntersectionLine2Line(FitLineResult l1, FitLineResult l2, out double x, out double y) { HTuple row, col, isP; HOperatorSet.IntersectionLl(l1.mRowStart, l1.mColumnStart, l1.mRowEnd, l1.mColumnEnd, l2.mRowStart, l2.mColumnStart, l2.mRowEnd, l2.mColumnEnd, out row, out col, out isP); x = col.D; y = row.D; } /// /// 计算2直线交点 /// /// /// /// /// /// /// /// /// /// /// public void IntersectionLine2Line(double Line1StartX, double Line1StartY, double Line1EndX, double Line1EndY, double Line2StartX, double Line2StartY, double Line2EndX, double Line2EndY, out double x, out double y) { HTuple row, col, isP; HOperatorSet.IntersectionLl((HTuple)Line1StartY, (HTuple)Line1StartX, (HTuple)Line1EndY, (HTuple)Line1EndX, (HTuple)Line2StartY, (HTuple)Line2StartX, (HTuple)Line2EndY, (HTuple)Line2EndX, out row, out col, out isP); x = col.D; y = row.D; } /// /// 计算直线与水平坐标的角度 /// /// 直线1 /// 角度 public double AngleLine2HorizontialAxis(FitLineResult l1) { HTuple tmp; HOperatorSet.AngleLx(l1.mRowStart, l1.mColumnStart, l1.mRowEnd, l1.mColumnEnd, out tmp); return tmp.D / Math.PI * 180; } /// /// 计算点到点距离 /// /// /// /// /// /// public double DistanceP2P(double x1, double y1, double x2, double y2) { HTuple dis; HOperatorSet.DistancePp((HTuple)y1, (HTuple)x1, (HTuple)y2, (HTuple)x2, out dis); return dis.D; } /// /// 计算2直线的角度 /// /// /// /// public double AngleLine2Line(FitLineResult r1, FitLineResult r2) { HTuple angle; HOperatorSet.AngleLl(r1.mRowStart, r1.mColumnStart, r1.mRowEnd, r1.mColumnEnd, r2.mRowStart, r2.mColumnStart, r2.mRowEnd, r2.mColumnEnd, out angle); return angle.D / Math.PI * 180; } #endregion } }