From de6c35d2bf0c2da9e0367a868d3090685fdd0072 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sat, 14 Jan 2023 14:41:40 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=88=98=E6=96=97?= =?UTF-8?q?=E4=B8=AD=E8=AF=86=E5=88=AB=E7=9A=84=E9=B2=81=E6=A3=92=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/tasks.json | 170 ------------------ src/MaaCore/Task/BattleHelper.cpp | 18 +- src/MaaCore/Task/BattleHelper.h | 1 + .../Miscellaneous/BattleImageAnalyzer.cpp | 114 ++---------- 4 files changed, 28 insertions(+), 275 deletions(-) diff --git a/resource/tasks.json b/resource/tasks.json index 05cb82816f..bcc867dd70 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -6272,92 +6272,6 @@ 17 ] }, - "BattleOperCostChannelH": { - "algorithm": "Hash", - "hash": [], - "maskRange": [ - 0, - 255 - ] - }, - "BattleOperCostChannelS": { - "algorithm": "Hash", - "hash": [], - "maskRange": [ - 0, - 50 - ] - }, - "BattleOperCostChannelV": { - "algorithm": "Hash", - "hash": [], - "maskRange": [ - 80, - 255 - ] - }, - "BattleOperCost0": { - "algorithm": "Hash", - "hash": [ - "1ff83ffc3c3e780e700ee007e007e007e007e007e007f00f780e7c1e3ffc1ff8" - ] - }, - "BattleOperCost1": { - "algorithm": "Hash", - "hash": [ - "00ff03ff1fff7fffffffff3f003f003f003f003f003f003f003f003f003f003f" - ] - }, - "BattleOperCost2": { - "algorithm": "Hash", - "hash": [ - "3ffe7ffefc3ff81fe01f001f001f003e007e01fc07f81fe03fc07e00ffffffff" - ] - }, - "BattleOperCost3": { - "algorithm": "Hash", - "hash": [ - "3ffe7ffffc3ff81fe01f001f03fe07fc07fe003f001fe01fe01ff83fffff7ffe", - "07f01ffe700e700700070007000c0078003c000700070007e007700e1e7e0ff0" - ] - }, - "BattleOperCost4": { - "algorithm": "Hash", - "hash": [ - "007c00fc01fc03fc03fc0fbc1f3c3f3c7e3cfc3cffffffffffff003c003c003c" - ] - }, - "BattleOperCost5": { - "algorithm": "Hash", - "hash": [ - "3ffe7c007c0078007ff87ffe7ffe7c3f781f0007e007f81ffc1fffff7ffe3ffc", - "3ffe38003800780070007ff87ffe703e000f000fc00ff81ffc3f7ffe3ffc07e0" - ] - }, - "BattleOperCost6": { - "algorithm": "Hash", - "hash": [ - "03c003800f001f003e003ff87ffc7c3ef00ee00fe007e00ff00e7c3e3ffc1ff8" - ] - }, - "BattleOperCost7": { - "algorithm": "Hash", - "hash": [ - "ffffffff003e007e007c00f800f801f001f003c003c00f801f001f003e003e00" - ] - }, - "BattleOperCost8": { - "algorithm": "Hash", - "hash": [ - "3ffc7ffe7c3e700e700e7c7e7ffc3ffc7ffefefef00fe00ff00ff03ffffe7ffe" - ] - }, - "BattleOperCost9": { - "algorithm": "Hash", - "hash": [ - "3ffc7ffe7c3ff00ff007f007f00ffc0f7fff3ffe1ffe00fc01f803f00ff00fc0" - ] - }, "BattleHpFlag": { "roi": [ 400, @@ -6386,90 +6300,6 @@ 35 ] }, - "BattleHpChannelH": { - "algorithm": "Hash", - "hash": [], - "maskRange": [ - 0, - 1 - ] - }, - "BattleHpChannelS": { - "algorithm": "Hash", - "hash": [], - "maskRange": [ - 120, - 150 - ] - }, - "BattleHpChannelV": { - "algorithm": "Hash", - "hash": [], - "maskRange": [ - 170, - 255 - ] - }, - "BattleHp0": { - "algorithm": "Hash", - "hash": [ - "03e007fc3c0638066003400140014001c001400140016003600338061e1c07f8" - ] - }, - "BattleHp1": { - "algorithm": "Hash", - "hash": [ - "003f01ff1ffffe0f000700070007000700070007000700070007000700070007" - ] - }, - "BattleHp2": { - "algorithm": "Hash", - "hash": [ - "07e03c3c2007c0030003000300030007001c003800e003c004003800f800ffff" - ] - }, - "BattleHp3": { - "algorithm": "Hash", - "hash": [ - "0ff07e78700ee00700070006000e03f80078000e000700078007e00e703e1ff8" - ] - }, - "BattleHp4": { - "algorithm": "Hash", - "hash": [ - "0010003c007c007c01dc039c061c0c1c381c301c783effff001c001c001c001c" - ] - }, - "BattleHp5": { - "algorithm": "Hash", - "hash": [ - "1ff87ffe7000600060006000fff0f038e00e0006000700078007e00e703e1ff0" - ] - }, - "BattleHp6": { - "algorithm": "Hash", - "hash": [ - "018002000e000c0010003fe07808f004c006800380018003c007e006300c1ff0" - ] - }, - "BattleHp7": { - "algorithm": "Hash", - "hash": [ - "7fffffff00070006000e003800380070004001c0018003800e000e001c001000" - ] - }, - "BattleHp8": { - "algorithm": "Hash", - "hash": [ - "0ff01038600ee006e006600670081ff01c7860068007800180018007600e1ff8" - ] - }, - "BattleHp9": { - "algorithm": "Hash", - "hash": [ - "07e01e78700e6006e007e007e0076006700e1ffe011800700060008001800700" - ] - }, "BattleUseSkillJustClick": { "algorithm": "JustReturn", "postDelay": 100, diff --git a/src/MaaCore/Task/BattleHelper.cpp b/src/MaaCore/Task/BattleHelper.cpp index bf1d8db599..e13a4b1479 100644 --- a/src/MaaCore/Task/BattleHelper.cpp +++ b/src/MaaCore/Task/BattleHelper.cpp @@ -225,7 +225,7 @@ bool asst::BattleHelper::update_deployment(bool init, const cv::Mat& reusable) cancel_oper_selection(); } } - check_pause_button(image); + check_in_battle(image); return true; } @@ -377,15 +377,22 @@ bool asst::BattleHelper::check_pause_button(const cv::Mat& reusable) MatchImageAnalyzer battle_flag_analyzer(image); battle_flag_analyzer.set_task_info("BattleOfficiallyBegin"); bool ret = battle_flag_analyzer.analyze(); - m_in_battle = ret; return ret; } +bool asst::BattleHelper::check_in_battle(const cv::Mat& reusable) +{ + cv::Mat image = reusable.empty() ? m_inst_helper.ctrler()->get_image() : reusable; + BattleImageAnalyzer analyzer(image); + m_in_battle = analyzer.analyze(); + return m_in_battle; +} + bool asst::BattleHelper::wait_until_start() { LogTraceFunction; - while (!m_inst_helper.need_exit() && !check_pause_button()) { + while (!m_inst_helper.need_exit() && !check_in_battle()) { std::this_thread::yield(); } return true; @@ -395,7 +402,7 @@ bool asst::BattleHelper::wait_until_end() { LogTraceFunction; - while (!m_inst_helper.need_exit() && check_pause_button()) { + while (!m_inst_helper.need_exit() && check_in_battle()) { do_strategic_action(); std::this_thread::yield(); } @@ -404,8 +411,7 @@ bool asst::BattleHelper::wait_until_end() bool asst::BattleHelper::do_strategic_action(const cv::Mat& reusable) { - check_pause_button(reusable); - return use_all_ready_skill(reusable); + return check_in_battle(reusable) && use_all_ready_skill(reusable); } bool asst::BattleHelper::use_all_ready_skill(const cv::Mat& reusable) diff --git a/src/MaaCore/Task/BattleHelper.h b/src/MaaCore/Task/BattleHelper.h index 7fc8c57030..5c389e60c3 100644 --- a/src/MaaCore/Task/BattleHelper.h +++ b/src/MaaCore/Task/BattleHelper.h @@ -45,6 +45,7 @@ namespace asst bool use_skill(const std::string& name, bool keep_waiting = true); bool use_skill(const Point& loc, bool keep_waiting = true); bool check_pause_button(const cv::Mat& reusable = cv::Mat()); + bool check_in_battle(const cv::Mat& reusable = cv::Mat()); virtual bool wait_until_start(); bool wait_until_end(); bool use_all_ready_skill(const cv::Mat& reusable = cv::Mat()); diff --git a/src/MaaCore/Vision/Miscellaneous/BattleImageAnalyzer.cpp b/src/MaaCore/Vision/Miscellaneous/BattleImageAnalyzer.cpp index e0704fc5aa..fa6fdf01b4 100644 --- a/src/MaaCore/Vision/Miscellaneous/BattleImageAnalyzer.cpp +++ b/src/MaaCore/Vision/Miscellaneous/BattleImageAnalyzer.cpp @@ -9,7 +9,6 @@ #include "Config/TemplResource.h" #include "Utils/Logger.hpp" #include "Vision/BestMatchImageAnalyzer.h" -#include "Vision/HashImageAnalyzer.h" #include "Vision/MatchImageAnalyzer.h" #include "Vision/MultiMatchImageAnalyzer.h" #include "Vision/OcrWithFlagTemplImageAnalyzer.h" @@ -30,7 +29,7 @@ bool asst::BattleImageAnalyzer::analyze() clear(); // HP 作为 flag,无论如何都识别。表明当前画面是在战斗场景的 - bool ret = hp_analyze() || flag_analyze(); + bool ret = flag_analyze(); if (m_target & Target::Home) { ret |= home_analyze(); @@ -225,58 +224,14 @@ bool asst::BattleImageAnalyzer::oper_cooling_analyze(const Rect& roi) } } } - //Log.trace("oper_cooling_analyze |", count); + // Log.trace("oper_cooling_analyze |", count); return count >= cooling_task_ptr->special_params.front(); } int asst::BattleImageAnalyzer::oper_cost_analyze(const Rect& roi) { - static const std::array NumName = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - static bool inited = false; - static cv::Scalar range_lower, range_upper; - - static HashImageAnalyzer hash_analyzer; - if (!inited) { - auto [h_l, h_u] = std::dynamic_pointer_cast(Task.get("BattleOperCostChannelH"))->mask_range; - auto [s_l, s_u] = std::dynamic_pointer_cast(Task.get("BattleOperCostChannelS"))->mask_range; - auto [v_l, v_u] = std::dynamic_pointer_cast(Task.get("BattleOperCostChannelV"))->mask_range; - range_lower = cv::Scalar(h_l, s_l, v_l); - range_upper = cv::Scalar(h_u, s_u, v_u); - std::unordered_map num_hashes; - for (auto&& num : NumName) { - auto hashes_vec = std::dynamic_pointer_cast(Task.get("BattleOperCost" + num))->hashes; - for (size_t i = 0; i != hashes_vec.size(); ++i) { - num_hashes.emplace(num + "_" + std::to_string(i), hashes_vec.at(i)); - } - } - hash_analyzer.set_hash_templates(std::move(num_hashes)); - hash_analyzer.set_need_bound(true); - hash_analyzer.set_need_split(true); - inited = true; - } - - cv::Mat hsv; - cv::cvtColor(m_image(make_rect(roi)), hsv, cv::COLOR_BGR2HSV); - cv::Mat bin; - cv::inRange(hsv, range_lower, range_upper, bin); - hash_analyzer.set_image(bin); - hash_analyzer.analyze(); - - int cost = 0; - for (const std::string& num_name : hash_analyzer.get_min_dist_name()) { - if (num_name.empty()) { - Log.error("hash result is empty"); - return 0; - } - cost *= 10; - cost += num_name.at(0) - '0'; - } - -#ifdef ASST_DEBUG - cv::putText(m_image_draw, std::to_string(cost), cv::Point(roi.x, roi.y - 20), 1, 1, cv::Scalar(0, 0, 255)); -#endif - - return cost; + std::ignore = roi; + return 0; } bool asst::BattleImageAnalyzer::oper_available_analyze(const Rect& roi) @@ -284,7 +239,7 @@ bool asst::BattleImageAnalyzer::oper_available_analyze(const Rect& roi) cv::Mat hsv; cv::cvtColor(m_image(make_rect(roi)), hsv, cv::COLOR_BGR2HSV); cv::Scalar avg = cv::mean(hsv); - //Log.trace("oper available, mean", avg[2]); + // Log.trace("oper available, mean", avg[2]); const int thres = Task.get("BattleOperAvailable")->special_params.front(); if (avg[2] < thres) { @@ -349,54 +304,6 @@ bool asst::BattleImageAnalyzer::hp_analyze() return false; } } - Rect roi_rect = flag_analyzer.get_result().rect.move(flag_task_ptr->rect_move); - cv::Mat roi = m_image(make_rect(roi_rect)); - - static const std::array NumName = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - static bool inited = false; - static cv::Scalar range_lower, range_upper; - static HashImageAnalyzer hash_analyzer; - if (!inited) { - auto [h_l, h_u] = std::dynamic_pointer_cast(Task.get("BattleHpChannelH"))->mask_range; - auto [s_l, s_u] = std::dynamic_pointer_cast(Task.get("BattleHpChannelS"))->mask_range; - auto [v_l, v_u] = std::dynamic_pointer_cast(Task.get("BattleHpChannelV"))->mask_range; - range_lower = cv::Scalar(h_l, s_l, v_l); - range_upper = cv::Scalar(h_u, s_u, v_u); - std::unordered_map num_hashes; - for (auto&& num : NumName) { - const auto& hashes_vec = std::dynamic_pointer_cast(Task.get("BattleHp" + num))->hashes; - for (size_t i = 0; i != hashes_vec.size(); ++i) { - num_hashes.emplace(num + "_" + std::to_string(i), hashes_vec.at(i)); - } - } - hash_analyzer.set_hash_templates(std::move(num_hashes)); - hash_analyzer.set_need_bound(true); - hash_analyzer.set_need_split(true); - inited = true; - } - - cv::Mat hsv; - cv::cvtColor(roi, hsv, cv::COLOR_BGR2HSV); - cv::Mat bin; - cv::inRange(hsv, range_lower, range_upper, bin); - hash_analyzer.set_image(bin); - hash_analyzer.analyze(); - - int hp = 0; - for (const std::string& num_name : hash_analyzer.get_min_dist_name()) { - if (num_name.empty()) { - Log.error("hash result is empty"); - return false; - } - hp *= 10; - hp += num_name.at(0) - '0'; - } - -#ifdef ASST_DEBUG - cv::putText(m_image_draw, "HP: " + std::to_string(hp), cv::Point(roi_rect.x, roi_rect.y + 50), 2, 1, - cv::Scalar(0, 0, 255)); -#endif - m_hp = hp; return true; } @@ -494,5 +401,14 @@ bool asst::BattleImageAnalyzer::flag_analyze() { MatchImageAnalyzer flag_analyzer(m_image); flag_analyzer.set_task_info("BattleOfficiallyBegin"); - return flag_analyzer.analyze(); + if (flag_analyzer.analyze()) { + return true; + } + + flag_analyzer.set_task_info("BattleKillsFlag"); + if (flag_analyzer.analyze()) { + return true; + } + + return hp_analyze(); }