using System; using System.Collections.Generic; using System.Linq; namespace LB_VisionProcesses.Processes { /// /// 轮胎判定规则 /// public enum TyreJudgeRule { /// /// 任一NG则整胎NG /// AnyNG, /// /// 全部OK才整胎OK /// AllOK, /// /// 多数表决(超过半数OK则OK) /// MajorityVote } /// /// 轮胎计数结果 /// public class TyreCountResult { /// /// 是否完成一个轮胎 /// public bool IsTyreComplete { get; set; } /// /// 轮胎ID /// public int TyreID { get; set; } /// /// 轮胎整体结果 /// public bool TyreResult { get; set; } /// /// 各图像结果列表 /// public List ImageResults { get; set; } = new List(); /// /// 当前图像序号(1~n) /// public int CurrentImageIndex { get; set; } /// /// 消息 /// public string Message { get; set; } } /// /// 轮胎统计器 - 用于管理轮胎级别的计数和统计 /// public class TyreStatistics { #region 配置参数 /// /// 每张轮胎所需图像数(默认8张) /// public int ImagesPerTyre { get; set; } = 8; /// /// 判定规则 /// public TyreJudgeRule JudgeRule { get; set; } = TyreJudgeRule.AnyNG; #endregion #region 统计数据 /// /// 轮胎总数 /// public int TyreTotal => TyreOK + TyreNG; /// /// 轮胎OK计数 /// public int TyreOK { get; set; } /// /// 轮胎NG计数 /// public int TyreNG { get; set; } /// /// 当前轮胎ID(从1开始) /// public int CurrentTyreID { get; set; } = 1; /// /// 当前轮胎的图像序号(0~ImagesPerTyre-1) /// public int CurrentImageIndex { get; set; } = 0; /// /// 当前轮胎的各图像结果 /// public List CurrentTyreResults { get; set; } = new List(); /// /// 当前轮胎的各图像SN /// public List CurrentTyreImageSNs { get; set; } = new List(); /// /// 轮胎良品率 /// 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 核心方法 /// /// 添加图像检测结果 /// /// 图像检测结果 /// 图像序列号(可选) /// 轮胎计数结果 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(CurrentTyreResults); result.Message = $"完成轮胎 #{CurrentTyreID},结果: {(tyreResult ? "OK" : "NG")}"; // 重置当前轮胎数据 ResetCurrentTyre(); } return result; } /// /// 计算轮胎整体结果 /// private bool CalculateTyreResult() { if (CurrentTyreResults.Count == 0) return true; switch (JudgeRule) { case TyreJudgeRule.AnyNG: // n张中任一NG则整胎NG return !CurrentTyreResults.Any(r => !r); case TyreJudgeRule.AllOK: // 全部OK才整胎OK(与AnyNG相同) return CurrentTyreResults.All(r => r); case TyreJudgeRule.MajorityVote: // 多数表决:超过半数OK则OK int okCount = CurrentTyreResults.Count(r => r); return okCount > (CurrentTyreResults.Count / 2.0); default: return !CurrentTyreResults.Any(r => !r); } } /// /// 重置当前轮胎数据 /// private void ResetCurrentTyre() { CurrentTyreID++; CurrentImageIndex = 0; CurrentTyreResults.Clear(); CurrentTyreImageSNs.Clear(); } /// /// 重置所有统计 /// public void Reset() { TyreOK = 0; TyreNG = 0; CurrentTyreID = 1; ResetCurrentTyre(); } /// /// 清空当前轮胎(用于异常情况) /// public void ClearCurrentTyre() { ResetCurrentTyre(); } /// /// 获取当前进度信息 /// public string GetProgressInfo() { if (ImagesPerTyre <= 1) return $"轮胎 #{CurrentTyreID} (3D模式)"; return $"轮胎 #{CurrentTyreID} - 第 {CurrentImageIndex}/{ImagesPerTyre} 张"; } /// /// 获取统计信息字符串 /// public string GetStatisticsInfo() { return $"轮胎总数: {TyreTotal}, OK: {TyreOK}, NG: {TyreNG}, 良品率: {TyreRateOK:F2}%"; } #endregion } }