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
}
}