From ebcc1d53f14112363bbf539bcaf0202aadcdc9d7 Mon Sep 17 00:00:00 2001
From: C3032 <1057644574@qq.com>
Date: 星期一, 13 四月 2026 12:58:58 +0800
Subject: [PATCH] 2D取图计数功能完成
---
LB_VisionProcesses/Processes/TyreCounter/TyreCounterProcess.cs | 413 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 413 insertions(+), 0 deletions(-)
diff --git a/LB_VisionProcesses/Processes/TyreCounter/TyreCounterProcess.cs b/LB_VisionProcesses/Processes/TyreCounter/TyreCounterProcess.cs
new file mode 100644
index 0000000..3704425
--- /dev/null
+++ b/LB_VisionProcesses/Processes/TyreCounter/TyreCounterProcess.cs
@@ -0,0 +1,413 @@
+using HalconDotNet;
+using LB_VisionProcesses.Alogrithms;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace LB_VisionProcesses.Processes
+{
+ /// <summary>
+ /// 杞儙璁℃暟宸ュ叿 - 鐢ㄤ簬娴佺▼鑺傜偣涓粺璁¤疆鑳庢暟閲�
+ /// </summary>
+ [Process("杞儙璁℃暟", Category = "鎺у埗", Description = "鐢ㄤ簬2D宸ヤ綅杞儙璁℃暟锛岄厤缃畁寮犲浘/杞儙")]
+ public class TyreCounterProcess : BaseProcess
+ {
+ #region 閰嶇疆灞炴��
+
+ /// <summary>
+ /// 姣忓紶杞儙鎵�闇�鍥惧儚鏁�
+ /// </summary>
+ public int ImagesPerTyre
+ {
+ get
+ {
+ if (Params.Inputs.ContainsKey("ImagesPerTyre"))
+ return Convert.ToInt32(Params.Inputs["ImagesPerTyre"]);
+ return 8;
+ }
+ set
+ {
+ Params.Inputs["ImagesPerTyre"] = value;
+ }
+ }
+
+ /// <summary>
+ /// 鍒ゅ畾瑙勫垯
+ /// </summary>
+ public TyreJudgeRule JudgeRule
+ {
+ get
+ {
+ if (Params.Inputs.ContainsKey("JudgeRule"))
+ return (TyreJudgeRule)Enum.Parse(typeof(TyreJudgeRule), Params.Inputs["JudgeRule"].ToString());
+ return TyreJudgeRule.AnyNG;
+ }
+ set
+ {
+ Params.Inputs["JudgeRule"] = value.ToString();
+ }
+ }
+
+ /// <summary>
+ /// 鏄惁鑷姩閲嶇疆锛堝畬鎴愪竴涓疆鑳庡悗鑷姩閲嶇疆璁℃暟锛�
+ /// </summary>
+ public bool AutoReset
+ {
+ get
+ {
+ if (Params.Inputs.ContainsKey("AutoReset"))
+ return Convert.ToBoolean(Params.Inputs["AutoReset"]);
+ return true;
+ }
+ set
+ {
+ Params.Inputs["AutoReset"] = value;
+ }
+ }
+
+ #endregion
+
+ #region 杈撳嚭灞炴��
+
+ /// <summary>
+ /// 褰撳墠杞儙ID
+ /// </summary>
+ public int CurrentTyreID
+ {
+ get
+ {
+ if (Params.Outputs.ContainsKey("CurrentTyreID"))
+ return Convert.ToInt32(Params.Outputs["CurrentTyreID"]);
+ return 1;
+ }
+ private set
+ {
+ Params.Outputs["CurrentTyreID"] = value;
+ }
+ }
+
+ /// <summary>
+ /// 褰撳墠鍥惧儚搴忓彿锛�1~n锛�
+ /// </summary>
+ public int CurrentImageIndex
+ {
+ get
+ {
+ if (Params.Outputs.ContainsKey("CurrentImageIndex"))
+ return Convert.ToInt32(Params.Outputs["CurrentImageIndex"]);
+ return 0;
+ }
+ private set
+ {
+ Params.Outputs["CurrentImageIndex"] = value;
+ }
+ }
+
+ /// <summary>
+ /// 鏄惁瀹屾垚杞儙
+ /// </summary>
+ public bool IsTyreComplete
+ {
+ get
+ {
+ if (Params.Outputs.ContainsKey("IsTyreComplete"))
+ return Convert.ToBoolean(Params.Outputs["IsTyreComplete"]);
+ return false;
+ }
+ private set
+ {
+ Params.Outputs["IsTyreComplete"] = value;
+ }
+ }
+
+ /// <summary>
+ /// 杞儙缁撴灉
+ /// </summary>
+ public bool TyreResult
+ {
+ get
+ {
+ if (Params.Outputs.ContainsKey("TyreResult"))
+ return Convert.ToBoolean(Params.Outputs["TyreResult"]);
+ return false;
+ }
+ private set
+ {
+ Params.Outputs["TyreResult"] = value;
+ }
+ }
+
+ /// <summary>
+ /// 杞儙鎬绘暟
+ /// </summary>
+ public int TyreTotal
+ {
+ get
+ {
+ if (Params.Outputs.ContainsKey("TyreTotal"))
+ return Convert.ToInt32(Params.Outputs["TyreTotal"]);
+ return 0;
+ }
+ private set
+ {
+ Params.Outputs["TyreTotal"] = value;
+ }
+ }
+
+ /// <summary>
+ /// 杞儙OK鏁�
+ /// </summary>
+ public int TyreOK
+ {
+ get
+ {
+ if (Params.Outputs.ContainsKey("TyreOK"))
+ return Convert.ToInt32(Params.Outputs["TyreOK"]);
+ return 0;
+ }
+ private set
+ {
+ Params.Outputs["TyreOK"] = value;
+ }
+ }
+
+ /// <summary>
+ /// 杞儙NG鏁�
+ /// </summary>
+ public int TyreNG
+ {
+ get
+ {
+ if (Params.Outputs.ContainsKey("TyreNG"))
+ return Convert.ToInt32(Params.Outputs["TyreNG"]);
+ return 0;
+ }
+ private set
+ {
+ Params.Outputs["TyreNG"] = value;
+ }
+ }
+
+ /// <summary>
+ /// 鑹搧鐜�
+ /// </summary>
+ public double TyreRateOK
+ {
+ get
+ {
+ if (Params.Outputs.ContainsKey("TyreRateOK"))
+ return Convert.ToDouble(Params.Outputs["TyreRateOK"]);
+ return 0;
+ }
+ private set
+ {
+ Params.Outputs["TyreRateOK"] = value;
+ }
+ }
+
+ #endregion
+
+ #region 绉佹湁瀛楁
+
+ /// <summary>
+ /// 杞儙缁熻鍣ㄥ疄渚�
+ /// </summary>
+ private TyreStatistics? _tyreStatistics;
+
+ /// <summary>
+ /// 杈撳叆鐨勫浘鍍忕粨鏋滐紙浠庡墠缃妭鐐硅幏鍙栵級
+ /// </summary>
+ private bool _inputImageResult = true;
+
+ #endregion
+
+ #region 鏋勯�犳柟娉�
+
+ public TyreCounterProcess()
+ {
+ strProcessClass = "LB_VisionProcesses.Processes.TyreCounterProcess";
+ _tyreStatistics = new TyreStatistics();
+ InitParams();
+ }
+
+ /// <summary>
+ /// 鍒濆鍖栧弬鏁�
+ /// </summary>
+ private void InitParams()
+ {
+ // 杈撳叆鍙傛暟
+ if (!Params.Inputs.ContainsKey("ImagesPerTyre"))
+ Params.Inputs.Add("ImagesPerTyre", 8);
+ if (!Params.Inputs.ContainsKey("JudgeRule"))
+ Params.Inputs.Add("JudgeRule", TyreJudgeRule.AnyNG.ToString());
+ if (!Params.Inputs.ContainsKey("AutoReset"))
+ Params.Inputs.Add("AutoReset", true);
+
+ // 杈撳嚭鍙傛暟
+ if (!Params.Outputs.ContainsKey("CurrentTyreID"))
+ Params.Outputs.Add("CurrentTyreID", 1);
+ if (!Params.Outputs.ContainsKey("CurrentImageIndex"))
+ Params.Outputs.Add("CurrentImageIndex", 0);
+ if (!Params.Outputs.ContainsKey("IsTyreComplete"))
+ Params.Outputs.Add("IsTyreComplete", false);
+ if (!Params.Outputs.ContainsKey("TyreResult"))
+ Params.Outputs.Add("TyreResult", false);
+ if (!Params.Outputs.ContainsKey("TyreTotal"))
+ Params.Outputs.Add("TyreTotal", 0);
+ if (!Params.Outputs.ContainsKey("TyreOK"))
+ Params.Outputs.Add("TyreOK", 0);
+ if (!Params.Outputs.ContainsKey("TyreNG"))
+ Params.Outputs.Add("TyreNG", 0);
+ if (!Params.Outputs.ContainsKey("TyreRateOK"))
+ Params.Outputs.Add("TyreRateOK", 0.0);
+ }
+
+ #endregion
+
+ #region 鏍稿績鏂规硶
+
+ /// <summary>
+ /// 杩愯杞儙璁℃暟閫昏緫
+ /// </summary>
+ public override bool Run()
+ {
+ DateTime startTime = DateTime.Now;
+
+ try
+ {
+ // 鑾峰彇杈撳叆缁撴灉锛堜粠鍓嶇疆鑺傜偣鐨凴esult鍙傛暟锛�
+ GetInputResult();
+
+ // 鏇存柊缁熻鍣ㄩ厤缃�
+ _tyreStatistics.ImagesPerTyre = ImagesPerTyre;
+ _tyreStatistics.JudgeRule = JudgeRule;
+
+ // 娣诲姞鍥惧儚缁撴灉
+ var result = _tyreStatistics.AddImageResult(_inputImageResult);
+
+ // 鏇存柊杈撳嚭鍙傛暟
+ UpdateOutputs(result);
+
+ // 璁剧疆缁撴灉
+ Result = true;
+ Msg = result.Message;
+
+ RunTime = (DateTime.Now - startTime).TotalMilliseconds;
+ return true;
+ }
+ catch (Exception ex)
+ {
+ Result = false;
+ Msg = $"杞儙璁℃暟杩愯澶辫触: {ex.Message}";
+ RunTime = (DateTime.Now - startTime).TotalMilliseconds;
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// 鑾峰彇杈撳叆缁撴灉锛堜粠鍓嶇疆鑺傜偣浼犻�掔殑Result锛�
+ /// </summary>
+ private void GetInputResult()
+ {
+ // 濡傛灉InputImage鏄痓ool绫诲瀷锛岃鏄庡墠缃妭鐐逛紶閫掍簡缁撴灉
+ if (InputImage is bool boolResult)
+ {
+ _inputImageResult = boolResult;
+ }
+ else
+ {
+ // 榛樿璁や负OK
+ _inputImageResult = true;
+ }
+ }
+
+ /// <summary>
+ /// 鏇存柊杈撳嚭鍙傛暟
+ /// </summary>
+ private void UpdateOutputs(TyreCountResult result)
+ {
+ CurrentTyreID = result.TyreID > 0 ? result.TyreID : _tyreStatistics.CurrentTyreID;
+ CurrentImageIndex = result.CurrentImageIndex;
+ IsTyreComplete = result.IsTyreComplete;
+ TyreResult = result.TyreResult;
+ TyreTotal = _tyreStatistics.TyreTotal;
+ TyreOK = _tyreStatistics.TyreOK;
+ TyreNG = _tyreStatistics.TyreNG;
+ TyreRateOK = _tyreStatistics.TyreRateOK;
+ }
+
+ /// <summary>
+ /// 鍒濆鍖栬繍琛屽弬鏁�
+ /// </summary>
+ public override void InitRunParams()
+ {
+ base.InitRunParams();
+ _inputImageResult = true;
+ }
+
+ /// <summary>
+ /// 閲嶇疆杞儙璁℃暟
+ /// </summary>
+ public void ResetTyreCount()
+ {
+ _tyreStatistics?.Reset();
+ UpdateOutputs(new TyreCountResult());
+ }
+
+ /// <summary>
+ /// 鑾峰彇缁熻淇℃伅
+ /// </summary>
+ public string GetStatisticsInfo()
+ {
+ return _tyreStatistics?.GetStatisticsInfo() ?? "缁熻鍣ㄦ湭鍒濆鍖�";
+ }
+
+ /// <summary>
+ /// 鑾峰彇杩涘害淇℃伅
+ /// </summary>
+ public string GetProgressInfo()
+ {
+ return _tyreStatistics?.GetProgressInfo() ?? "缁熻鍣ㄦ湭鍒濆鍖�";
+ }
+
+ #endregion
+
+ #region 閲嶅啓鏂规硶
+
+ public override bool Load(string fullPath = null)
+ {
+ bool result = base.Load(fullPath);
+ if (result)
+ {
+ // 鍔犺浇閰嶇疆鍚庨噸鏂板垵濮嬪寲缁熻鍣�
+ _tyreStatistics = new TyreStatistics(ImagesPerTyre, JudgeRule);
+ }
+ return result;
+ }
+
+ public override bool Save(string filePath = null)
+ {
+ return base.Save(filePath);
+ }
+
+ public override object Clone()
+ {
+ TyreCounterProcess clone = (TyreCounterProcess)MemberwiseClone();
+ clone._tyreStatistics = new TyreStatistics(ImagesPerTyre, JudgeRule);
+ return clone;
+ }
+
+ public override void Dispose()
+ {
+ _tyreStatistics = null;
+ base.Dispose();
+ }
+
+ #endregion
+ }
+}
--
Gitblit v1.9.3