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