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/TyreStatistics.cs |  266 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 266 insertions(+), 0 deletions(-)

diff --git a/LB_VisionProcesses/Processes/TyreCounter/TyreStatistics.cs b/LB_VisionProcesses/Processes/TyreCounter/TyreStatistics.cs
new file mode 100644
index 0000000..6e1950c
--- /dev/null
+++ b/LB_VisionProcesses/Processes/TyreCounter/TyreStatistics.cs
@@ -0,0 +1,266 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace LB_VisionProcesses.Processes
+{
+    /// <summary>
+    /// 杞儙鍒ゅ畾瑙勫垯
+    /// </summary>
+    public enum TyreJudgeRule
+    {
+        /// <summary>
+        /// 浠讳竴NG鍒欐暣鑳嶯G
+        /// </summary>
+        AnyNG,
+
+        /// <summary>
+        /// 鍏ㄩ儴OK鎵嶆暣鑳嶰K
+        /// </summary>
+        AllOK,
+
+        /// <summary>
+        /// 澶氭暟琛ㄥ喅锛堣秴杩囧崐鏁癘K鍒橭K锛�
+        /// </summary>
+        MajorityVote
+    }
+
+    /// <summary>
+    /// 杞儙璁℃暟缁撴灉
+    /// </summary>
+    public class TyreCountResult
+    {
+        /// <summary>
+        /// 鏄惁瀹屾垚涓�涓疆鑳�
+        /// </summary>
+        public bool IsTyreComplete { get; set; }
+
+        /// <summary>
+        /// 杞儙ID
+        /// </summary>
+        public int TyreID { get; set; }
+
+        /// <summary>
+        /// 杞儙鏁翠綋缁撴灉
+        /// </summary>
+        public bool TyreResult { get; set; }
+
+        /// <summary>
+        /// 鍚勫浘鍍忕粨鏋滃垪琛�
+        /// </summary>
+        public List<bool> ImageResults { get; set; } = new List<bool>();
+
+        /// <summary>
+        /// 褰撳墠鍥惧儚搴忓彿锛�1~n锛�
+        /// </summary>
+        public int CurrentImageIndex { get; set; }
+
+        /// <summary>
+        /// 娑堟伅
+        /// </summary>
+        public string Message { get; set; }
+    }
+
+    /// <summary>
+    /// 杞儙缁熻鍣� - 鐢ㄤ簬绠$悊杞儙绾у埆鐨勮鏁板拰缁熻
+    /// </summary>
+    public class TyreStatistics
+    {
+        #region 閰嶇疆鍙傛暟
+
+        /// <summary>
+        /// 姣忓紶杞儙鎵�闇�鍥惧儚鏁帮紙榛樿8寮狅級
+        /// </summary>
+        public int ImagesPerTyre { get; set; } = 8;
+
+        /// <summary>
+        /// 鍒ゅ畾瑙勫垯
+        /// </summary>
+        public TyreJudgeRule JudgeRule { get; set; } = TyreJudgeRule.AnyNG;
+
+        #endregion
+
+        #region 缁熻鏁版嵁
+
+        /// <summary>
+        /// 杞儙鎬绘暟
+        /// </summary>
+        public int TyreTotal => TyreOK + TyreNG;
+
+        /// <summary>
+        /// 杞儙OK璁℃暟
+        /// </summary>
+        public int TyreOK { get; set; }
+
+        /// <summary>
+        /// 杞儙NG璁℃暟
+        /// </summary>
+        public int TyreNG { get; set; }
+
+        /// <summary>
+        /// 褰撳墠杞儙ID锛堜粠1寮�濮嬶級
+        /// </summary>
+        public int CurrentTyreID { get; set; } = 1;
+
+        /// <summary>
+        /// 褰撳墠杞儙鐨勫浘鍍忓簭鍙凤紙0~ImagesPerTyre-1锛�
+        /// </summary>
+        public int CurrentImageIndex { get; set; } = 0;
+
+        /// <summary>
+        /// 褰撳墠杞儙鐨勫悇鍥惧儚缁撴灉
+        /// </summary>
+        public List<bool> CurrentTyreResults { get; set; } = new List<bool>();
+
+        /// <summary>
+        /// 褰撳墠杞儙鐨勫悇鍥惧儚SN
+        /// </summary>
+        public List<string> CurrentTyreImageSNs { get; set; } = new List<string>();
+
+        /// <summary>
+        /// 杞儙鑹搧鐜�
+        /// </summary>
+        public double TyreRateOK => TyreTotal > 0 ? (TyreOK / (double)TyreTotal) * 100 : 0;
+
+        #endregion
+
+        #region 鏋勯�犳柟娉�
+
+        public TyreStatistics() { }
+
+        public TyreStatistics(int imagesPerTyre, TyreJudgeRule judgeRule = TyreJudgeRule.AnyNG)
+        {
+            ImagesPerTyre = imagesPerTyre;
+            JudgeRule = judgeRule;
+        }
+
+        #endregion
+
+        #region 鏍稿績鏂规硶
+
+        /// <summary>
+        /// 娣诲姞鍥惧儚妫�娴嬬粨鏋�
+        /// </summary>
+        /// <param name="isOK">鍥惧儚妫�娴嬬粨鏋�</param>
+        /// <param name="imageSN">鍥惧儚搴忓垪鍙凤紙鍙�夛級</param>
+        /// <returns>杞儙璁℃暟缁撴灉</returns>
+        public TyreCountResult AddImageResult(bool isOK, string imageSN = null)
+        {
+            // 娣诲姞鍒板綋鍓嶈疆鑳庣粨鏋滃垪琛�
+            CurrentTyreResults.Add(isOK);
+            CurrentTyreImageSNs.Add(imageSN);
+            CurrentImageIndex++;
+
+            var result = new TyreCountResult
+            {
+                CurrentImageIndex = CurrentImageIndex,
+                IsTyreComplete = false,
+                Message = $"褰撳墠杞儙绗� {CurrentImageIndex}/{ImagesPerTyre} 寮犲浘鍍�"
+            };
+
+            // 妫�鏌ユ槸鍚﹀畬鎴愪竴涓疆鑳�
+            if (CurrentImageIndex >= ImagesPerTyre)
+            {
+                // 璁$畻杞儙鏁翠綋缁撴灉
+                bool tyreResult = CalculateTyreResult();
+
+                // 鏇存柊缁熻
+                if (tyreResult)
+                    TyreOK++;
+                else
+                    TyreNG++;
+
+                // 鏋勫缓瀹屾垚缁撴灉
+                result.IsTyreComplete = true;
+                result.TyreID = CurrentTyreID;
+                result.TyreResult = tyreResult;
+                result.ImageResults = new List<bool>(CurrentTyreResults);
+                result.Message = $"瀹屾垚杞儙 #{CurrentTyreID}锛岀粨鏋�: {(tyreResult ? "OK" : "NG")}";
+
+                // 閲嶇疆褰撳墠杞儙鏁版嵁
+                ResetCurrentTyre();
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// 璁$畻杞儙鏁翠綋缁撴灉
+        /// </summary>
+        private bool CalculateTyreResult()
+        {
+            if (CurrentTyreResults.Count == 0)
+                return true;
+
+            switch (JudgeRule)
+            {
+                case TyreJudgeRule.AnyNG:
+                    // n寮犱腑浠讳竴NG鍒欐暣鑳嶯G
+                    return !CurrentTyreResults.Any(r => !r);
+
+                case TyreJudgeRule.AllOK:
+                    // 鍏ㄩ儴OK鎵嶆暣鑳嶰K锛堜笌AnyNG鐩稿悓锛�
+                    return CurrentTyreResults.All(r => r);
+
+                case TyreJudgeRule.MajorityVote:
+                    // 澶氭暟琛ㄥ喅锛氳秴杩囧崐鏁癘K鍒橭K
+                    int okCount = CurrentTyreResults.Count(r => r);
+                    return okCount > (CurrentTyreResults.Count / 2.0);
+
+                default:
+                    return !CurrentTyreResults.Any(r => !r);
+            }
+        }
+
+        /// <summary>
+        /// 閲嶇疆褰撳墠杞儙鏁版嵁
+        /// </summary>
+        private void ResetCurrentTyre()
+        {
+            CurrentTyreID++;
+            CurrentImageIndex = 0;
+            CurrentTyreResults.Clear();
+            CurrentTyreImageSNs.Clear();
+        }
+
+        /// <summary>
+        /// 閲嶇疆鎵�鏈夌粺璁�
+        /// </summary>
+        public void Reset()
+        {
+            TyreOK = 0;
+            TyreNG = 0;
+            CurrentTyreID = 1;
+            ResetCurrentTyre();
+        }
+
+        /// <summary>
+        /// 娓呯┖褰撳墠杞儙锛堢敤浜庡紓甯告儏鍐碉級
+        /// </summary>
+        public void ClearCurrentTyre()
+        {
+            ResetCurrentTyre();
+        }
+
+        /// <summary>
+        /// 鑾峰彇褰撳墠杩涘害淇℃伅
+        /// </summary>
+        public string GetProgressInfo()
+        {
+            if (ImagesPerTyre <= 1)
+                return $"杞儙 #{CurrentTyreID} (3D妯″紡)";
+
+            return $"杞儙 #{CurrentTyreID} - 绗� {CurrentImageIndex}/{ImagesPerTyre} 寮�";
+        }
+
+        /// <summary>
+        /// 鑾峰彇缁熻淇℃伅瀛楃涓�
+        /// </summary>
+        public string GetStatisticsInfo()
+        {
+            return $"杞儙鎬绘暟: {TyreTotal}, OK: {TyreOK}, NG: {TyreNG}, 鑹搧鐜�: {TyreRateOK:F2}%";
+        }
+
+        #endregion
+    }
+}

--
Gitblit v1.9.3