修复Q技能分类的问题

This commit is contained in:
辉鸭蛋
2026-05-08 01:15:32 +08:00
parent 4fbc74e7e0
commit 649bc0fc66
2 changed files with 15 additions and 8 deletions

View File

@@ -22,6 +22,7 @@ public class AutoFightAssets : BaseAssets<AutoFightAssets>
public Rect ERect;
public Rect ECooldownRect;
public Rect QRect;
public Rect QRectForClassify;
public Rect ZCooldownRect;
public Rect EndTipsUpperRect; // 挑战达成提示
public Rect EndTipsRect;
@@ -78,6 +79,8 @@ public class AutoFightAssets : BaseAssets<AutoFightAssets>
(int)(41 * AssetScale), (int)(18 * AssetScale));
QRect = new Rect(CaptureRect.Width - (int)(157 * AssetScale), CaptureRect.Height - (int)(165 * AssetScale),
(int)(110 * AssetScale), (int)(110 * AssetScale));
QRectForClassify = new Rect(CaptureRect.Width - (int)(172 * AssetScale), CaptureRect.Height - (int)(166 * AssetScale),
(int)(137 * AssetScale), (int)(137 * AssetScale));
ZCooldownRect = new Rect(CaptureRect.Width - (int)(130 * AssetScale), (int)(814 * AssetScale),
(int)(60 * AssetScale), (int)(24 * AssetScale));
// 小道具位置 1920-133,800,60,50

View File

@@ -25,6 +25,7 @@ using BetterGenshinImpact.GameTask.AutoPathing;
using BetterGenshinImpact.GameTask.AutoPathing.Model;
using BetterGenshinImpact.GameTask.AutoPathing.Model.Enum;
using BetterGenshinImpact.Core.Recognition.ONNX;
using BetterGenshinImpact.GameTask.Common;
using Compunet.YoloSharp;
using Compunet.YoloSharp.Data;
using Microsoft.Extensions.DependencyInjection;
@@ -600,8 +601,9 @@ public class Avatar
{
// CD 中立即返回,其余场景尝试释放
using var region1 = CaptureToRectArea();
if (IsBurstReadyByClassify(region1) == BurstReadyState.Cooldown)
if (IsBurstReadyByClassify(region1) != BurstReadyState.Ready)
{
// Logger.LogInformation("Q在CD跳过");
return;
}
@@ -612,6 +614,7 @@ public class Avatar
return;
}
// Logger.LogInformation("释放Q");
Simulation.SendInput.SimulateAction(GIActions.ElementalBurst);
Sleep(200, Ct);
@@ -627,8 +630,9 @@ public class Avatar
else
{
// 找到编号块判断是否进入了CD四星角色没有大招动画
if (IsBurstReadyByClassify(region) == BurstReadyState.Cooldown)
if (IsBurstReadyByClassify(region) != BurstReadyState.Ready)
{
// Logger.LogInformation("释放Q后检查到CD");
Sleep(1500, Ct);
return;
}
@@ -638,29 +642,29 @@ public class Avatar
private static BurstReadyState IsBurstReadyByClassify(ImageRegion imageRegion)
{
using var qRa = imageRegion.DeriveCrop(AutoFightAssets.Instance.QRect);
using var qRa = imageRegion.DeriveCrop(AutoFightAssets.Instance.QRectForClassify);
var result = QBurstClassifierLazy.Value.Predictor.Classify(qRa.CacheImage);
var topClass = result.GetTopClass();
var topClassName = topClass.Name.Name;
// Logger.LogInformation("Q技能冷却分类{ClassName},置信度:{Confidence:F2}", topClassName, topClass.Confidence);
// 置信度不足时,直接返回未知,避免误判导致漏放/乱放
if (topClass.Confidence <= 0.7)
{
Logger.LogDebug("Q技能冷却分类置信度不足{Confidence:F2},类别:{ClassName}", topClass.Confidence, topClassName);
// Logger.LogInformation("Q技能冷却分类置信度不足{Confidence:F2},类别:{ClassName}", topClass.Confidence, topClassName);
return BurstReadyState.Unknown;
}
if (topClassName.Contains("cd_1", StringComparison.OrdinalIgnoreCase))
if (topClassName.Contains("cd 1", StringComparison.OrdinalIgnoreCase))
{
return BurstReadyState.Cooldown;
}
if (topClassName.Contains("cd_0", StringComparison.OrdinalIgnoreCase))
if (topClassName.Contains("energy 1 cd 0", StringComparison.OrdinalIgnoreCase))
{
return BurstReadyState.Ready;
}
Logger.LogDebug("Q技能冷却分类出现未知类别{ClassName},置信度:{Confidence:F2}", topClassName, topClass.Confidence);
return BurstReadyState.Unknown;
}