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