diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/AutoGeniusInvokationAssets.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/AutoGeniusInvokationAssets.cs
index 1818f5fc..73534101 100644
--- a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/AutoGeniusInvokationAssets.cs
+++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/AutoGeniusInvokationAssets.cs
@@ -2,10 +2,12 @@
using OpenCvSharp;
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BetterGenshinImpact.Core.Recognition;
+using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model;
namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Assets
{
@@ -151,6 +153,8 @@ namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Assets
{ "geo", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_geo.png", ImreadModes.Color) },
{ "omni", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_omni.png", ImreadModes.Color) },
};
+ var msg = ActionPhaseDiceMats.Aggregate("", (current, kvp) => current + $"{kvp.Key.ToElementalType().ToChinese()}| ");
+ Debug.WriteLine($"默认骰子排序:{msg}");
}
}
}
\ No newline at end of file
diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/AutoGeniusInvokationConfig.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/AutoGeniusInvokationConfig.cs
index 1558e21a..054310bb 100644
--- a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/AutoGeniusInvokationConfig.cs
+++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/AutoGeniusInvokationConfig.cs
@@ -30,7 +30,7 @@ public partial class AutoGeniusInvokationConfig : ObservableObject
///
/// 骰子数量文字识别区域
///
- public Rect MyDiceCountRect { get; set; } = new(58, 632, 45, 47); // 42,47
+ public Rect MyDiceCountRect { get; } = new(68, 642, 25, 31); // 42,47
/////
///// 角色卡牌区域向左扩展距离,包含HP区域
diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/GeniusInvokationControl.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/GeniusInvokationControl.cs
index e2e743a5..310382eb 100644
--- a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/GeniusInvokationControl.cs
+++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/GeniusInvokationControl.cs
@@ -113,16 +113,16 @@ public class GeniusInvokationControl
{
return bitmap.ToMat();
}
+
Sleep(20);
}
+
throw new RetryException("尝试多次后,截图失败!");
}
else
{
-
return bitmap.ToMat();
}
-
}
public Mat CaptureGameGreyMat()
@@ -187,6 +187,26 @@ public class GeniusInvokationControl
Sleep(1500);
}
+ public void SortActionPhaseDiceMats(HashSet elementSet)
+ {
+ _assets.ActionPhaseDiceMats = _assets.ActionPhaseDiceMats.OrderByDescending(kvp =>
+ {
+ for (var i = 0; i < elementSet.Count; i++)
+ {
+ if (kvp.Key == elementSet.ElementAt(i).ToLowerString())
+ {
+ return i;
+ }
+ }
+
+ return -1;
+ })
+ .ToDictionary(x => x.Key, x => x.Value);
+ // 打印排序后的顺序
+ var msg = _assets.ActionPhaseDiceMats.Aggregate("", (current, kvp) => current + $"{kvp.Key.ToElementalType().ToChinese()}| ");
+ _logger.LogDebug("当前骰子排序:{Msg}", msg);
+ }
+
///
/// 获取我方三个角色卡牌区域
///
@@ -574,6 +594,7 @@ public class GeniusInvokationControl
// 最后一张牌在右侧,而不是中间
ClickExtension.Move(rect.X + rect.Width / 2d + 120, rect.Y + rect.Height - 50);
}
+
m.LeftButtonDown();
Sleep(100);
m = ClickExtension.Move(rect.X + rect.Width - 50, rect.Y + rect.Height / 2d);
@@ -1228,21 +1249,42 @@ public class GeniusInvokationControl
{
var srcMat = CaptureGameGreyMat();
var diceCountMap = new Mat(srcMat, _config.MyDiceCountRect);
- var text = OcrFactory.Paddle.Ocr(diceCountMap);
- text = text.Replace(" ", "");
- _logger.LogInformation("通过OCR识别当前骰子数量: {Text}", text);
+ var text = OcrFactory.Paddle.OcrWithoutDetector(diceCountMap);
+ text = text.Replace(" ", "")
+ .Replace("①", "1")
+ .Replace("②", "2")
+ .Replace("③", "3")
+ .Replace("④", "4")
+ .Replace("⑤", "5")
+ .Replace("⑥", "6")
+ .Replace("⑦", "7")
+ .Replace("⑧", "8")
+ .Replace("⑨", "9")
+ .Replace("⑩", "10")
+ .Replace("⑪", "11")
+ .Replace("⑫", "12")
+ .Replace("⑬", "13")
+ .Replace("⑭", "14")
+ .Replace("⑮", "15");
if (string.IsNullOrWhiteSpace(text))
{
- //Cv2.ImWrite($"log\\dice_count_empty{DateTime.Now:yyyy-MM-dd HH:mm:ss:ffff}.jpg", diceCountMap);
+ _logger.LogWarning("通过OCR识别当前骰子数量结果为空,无影响");
+#if DEBUG
+ Cv2.ImWrite($"log\\dice_count_empty{DateTime.Now:yyyy-MM-dd HH:mm:ss:ffff}.jpg", diceCountMap);
+#endif
return -10;
}
else if (Regex.IsMatch(text, @"^[0-9]+$"))
{
+ _logger.LogInformation("通过OCR识别当前骰子数量: {Text}", text);
return int.Parse(text);
}
else
{
- //Cv2.ImWrite($"log\\dice_count_error_{DateTime.Now:yyyy-MM-dd HH:mm:ss:ffff}.jpg", diceCountMap);
+ _logger.LogWarning("通过OCR识别当前骰子结果: {Text}", text);
+#if DEBUG
+ Cv2.ImWrite($"log\\dice_count_error_{DateTime.Now:yyyy-MM-dd HH:mm:ss:ffff}.jpg", diceCountMap);
+#endif
return -10;
}
}
diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Duel.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Duel.cs
index e8ec809a..847f0dc0 100644
--- a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Duel.cs
+++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Duel.cs
@@ -1,16 +1,15 @@
-using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception;
+using BetterGenshinImpact.Core.Recognition.OpenCv;
+using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception;
using BetterGenshinImpact.View.Drawable;
+using BetterGenshinImpact.ViewModel.Pages;
using GeniusInvokationAutoToy.Utils;
using Microsoft.Extensions.Logging;
using OpenCvSharp;
using System;
using System.Collections.Generic;
-using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using BetterGenshinImpact.Core.Recognition.OpenCv;
-using BetterGenshinImpact.ViewModel.Pages;
namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model;
@@ -124,7 +123,7 @@ public class Duel
CurrentDiceCount = 8;
- // 预计算本回合内的所有可能的元素
+ // 预计算本回合内的所有可能的元素 // 并调整识别骰子素材的顺序
var elementSet = PredictionDiceType();
// 0 投骰子
@@ -368,6 +367,9 @@ public class Duel
}
}
+ // 调整元素骰子识别素材顺序
+ GeniusInvokationControl.GetInstance().SortActionPhaseDiceMats(elementSet);
+
return elementSet;
}