using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
|
namespace LB_VisionProcesses.Processes
|
{
|
/// <summary>
|
/// 轮胎判定规则
|
/// </summary>
|
public enum TyreJudgeRule
|
{
|
/// <summary>
|
/// 任一NG则整胎NG
|
/// </summary>
|
AnyNG,
|
|
/// <summary>
|
/// 全部OK才整胎OK
|
/// </summary>
|
AllOK,
|
|
/// <summary>
|
/// 多数表决(超过半数OK则OK)
|
/// </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则整胎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);
|
}
|
}
|
|
/// <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
|
}
|
}
|