From 7fa512efc787a0d3cc4331dab2a247b0fa2d37c5 Mon Sep 17 00:00:00 2001 From: MistEO Date: Tue, 18 Jan 2022 00:52:28 +0800 Subject: [PATCH] =?UTF-8?q?opt.=E4=BC=98=E5=8C=96=E5=B9=B2=E5=91=98?= =?UTF-8?q?=E8=B4=B9=E7=94=A8=E5=8F=8A=E8=81=8C=E4=B8=9A=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/tasks.json | 18 ++++++++++++++---- resource/template/BattleOperRoleDrone.png | Bin 0 -> 1823 bytes src/MeoAssistant/BattleImageAnalyzer.cpp | 22 ++++++++++++++++++---- src/MeoAssistant/BattleImageAnalyzer.h | 7 ++++--- src/MeoAssistant/HashImageAnalyzer.cpp | 3 +++ 5 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 resource/template/BattleOperRoleDrone.png diff --git a/resource/tasks.json b/resource/tasks.json index a1b04e4918..a2ad959618 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -3036,8 +3036,14 @@ }, "BattleOperAvailable": { "template": "empty.png", - "specialThreshold": 100, - "specialThreshold_Doc": "用于做V通道平均值阈值" + "specialThreshold": 110, + "specialThreshold_Doc": "用于做V通道平均值阈值", + "rectMove": [ + -41, + 6, + 31, + 25 + ] }, "BattleOperRoleRange": { "algorithm": "JustReturn", @@ -3064,6 +3070,8 @@ }, "BattleOperRoleWarrior": { }, + "BattleOperRoleDrone": { + }, "BattleOperCostRange": { "algorithm": "hash", "hash": [ @@ -3123,7 +3131,8 @@ "BattleOperCost3": { "algorithm": "hash", "hash": [ - "3ffe7ffffc3ff81fe01f001f03fe07fc07fe003f001fe01fe01ff83fffff7ffe" + "3ffe7ffffc3ff81fe01f001f03fe07fc07fe003f001fe01fe01ff83fffff7ffe", + "07f01ffe700e700700070007000c0078003c000700070007e007700e1e7e0ff0" ] }, "BattleOperCost4": { @@ -3135,7 +3144,8 @@ "BattleOperCost5": { "algorithm": "hash", "hash": [ - "3ffe7c007c0078007ff87ffe7ffe7c3f781f0007e007f81ffc1fffff7ffe3ffc" + "3ffe7c007c0078007ff87ffe7ffe7c3f781f0007e007f81ffc1fffff7ffe3ffc", + "3ffe38003800780070007ff87ffe703e000f000fc00ff81ffc3f7ffe3ffc07e0" ] }, "BattleOperCost6": { diff --git a/resource/template/BattleOperRoleDrone.png b/resource/template/BattleOperRoleDrone.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ed1fad0238fbb6ff88cfe1bde799c5abe526c5 GIT binary patch literal 1823 zcmV+)2jKXLP) zT})JG8pnU{`I=!q8I&&>3L^#t)JD5#t((}r=*HC6Mrus9(dbp8g+3O zyQOYTjNjR6YQ?P8q<)cTTND*VF{9KVxS%7%9%82(sLnFA`}(3+l^?wa(PsqWmy1pclYpR zA{OzfX1bLR3{{^iTpqk3;PG>MQR3@(VdRIY=oP=wvy5;RTI)6zjoi4cOld-sx)ox_^dYjC-on5IeFjT;<1cnGJ{$$|wR zj`d-vG9c{4tr57RUWhX>fX^9v3gI>d?ii)ag zw6wI)^RS1{K3hd$p&w1v@Or%b>D_nv@PiNd_Si8@(?nG@G)*Hs5T?1gnTCc20)b+5 zUB~5eQBqPub@f87x3$sT-HoPc*lczT!$1+~^gO#-Tdz`DT86Icgu`LBY~9K?M~`4x z7RALyjEuzS>w7es+l!YjGBFUq<#N*1)y1~$+c^3CNu-n%6!@_$i@v@-q?D+d2EdC} z1wc1+6p?a?J*}*%sfnhh6DW#;$K$~;j8PxCT`qERa(MdmDaVd|M=%(~;c%cR3PK2y zi3GZ?k71~Fb+sE`JgT7^e1GZ`6&2;==H&AB+p~y7203^BJW@)QFIz@_ejbXF(wmo; zM_yhYf2-d?Fc_q|dLi$<_h*DqID7UiS6W-CsreLDQ^~N~@OZqab+xq{pI4S3H#e8g z&Q88P_8oqI0d~8c;-VsYdwXfUdX?V3UIKxM2mw!HG1_mnbKt;1LZJ|g7JW=rRTaa- z!?av(;qc+Z)Ya7y2m}!6Q~7*8MElJflHWum5@G*=1N`*U&lrY|zrfGRm38de^)K3Q zwWI3>oF~po}P!eJs!%-%NgkJ zN7FPi92vM>ZY*gLi^b4h282}2y4`Nd%1TF{O`I4&({2s~cz@7?=bu%>B@8#kVe3llWC z&1T2xa+2Z57`0Q*hUc5+ib2CFjL!;{xCKOOsT1Kk-iLvf|1`Rz4 zvGa?6a{j^v9zJ}?@UOp890;&!(F806;Vv0=jo9z1wJ z^}>bBn>Ua0iV7SK2c4arG&D4D?%X-Dv$JVzY$TCL(A(R~+O=y@Rh7ky7ehKF6AB7Y zYirZZA&tG+ev==5IKy8zZ^oD9BQ`R^@#Dt{27}bq)iHVUWPCm!!^6W2MWZ;KPNq$p zMkEs9^y$-NW@a*L)+~yPivifNV+Tu?EE&_4G{m#fn7aRX=|@USOVKoqXf(>!ty_sk zqio;4osp3d)~sI5#!VaX`wNN3<20Q(!R5=B*|u#PHk*yc#zv%+EM2;ks;Vk)46cr0uu0L`p`5DGnpijh!Y(g8jE zhRf|{&YVBe_vjJ#@83sLHI^@5#+*5GkWzB#(k0^YI8&!i9RpQsSEO<(($wOjBHG$+ z(DHK&g@uKfNt2=BAl_3Aa=c%u+0;mMOHtXsE^ z`Sa(GP8dl2;tUK7(9qDpi4#ra<>nEO$N6t>FEurvQd6@6RaM78{|Cnz!zCE-{R{vA N002ovPDHLkV1jo{i`D=D literal 0 HcmV?d00001 diff --git a/src/MeoAssistant/BattleImageAnalyzer.cpp b/src/MeoAssistant/BattleImageAnalyzer.cpp index 0f80f093b1..04b886d634 100644 --- a/src/MeoAssistant/BattleImageAnalyzer.cpp +++ b/src/MeoAssistant/BattleImageAnalyzer.cpp @@ -18,6 +18,8 @@ const std::vector& asst::BattleImageAnalyzer::g bool asst::BattleImageAnalyzer::opers_analyze() { + LogTraceFunction; + MultiMatchImageAnalyzer flags_analyzer(m_image); flags_analyzer.set_task_info("BattleOpersFlag"); if (!flags_analyzer.analyze()) { @@ -28,11 +30,14 @@ bool asst::BattleImageAnalyzer::opers_analyze() const auto click_move = Task.get("BattleOperClickRange")->rect_move; const auto role_move = Task.get("BattleOperRoleRange")->rect_move; const auto cost_move = Task.get("BattleOperCostRange")->rect_move; + const auto avlb_move = Task.get("BattleOperAvailable")->rect_move; for (const MatchRect& flag_mrect : flags_analyzer.get_result()) { Oper oper; oper.rect = flag_mrect.rect.move(click_move); - oper.available = oper_available_analyze(oper.rect); + + Rect available_rect = flag_mrect.rect.move(avlb_move); + oper.available = oper_available_analyze(available_rect); #ifdef ASST_DEBUG if (oper.available) { @@ -65,12 +70,13 @@ asst::BattleImageAnalyzer::Role asst::BattleImageAnalyzer::oper_role_analyze(con { Role::Special, "Special" }, { Role::Support, "Support" }, { Role::Tank, "Tank" }, - { Role::Warrior, "Warrior" } + { Role::Warrior, "Warrior" }, + { Role::Drone, "Drone" } }; MatchImageAnalyzer role_analyzer(m_image); - Role result = Role::Invaild; + Role result = Role::Unknown; double max_score = 0; for (auto&& [role, role_name] : RolesName) { role_analyzer.set_task_info("BattleOperRole" + role_name); @@ -86,7 +92,15 @@ asst::BattleImageAnalyzer::Role asst::BattleImageAnalyzer::oper_role_analyze(con } #ifdef ASST_DEBUG - cv::putText(m_image_draw, RolesName.at(result), cv::Point(roi.x, roi.y - 5), 1, 1, cv::Scalar(0, 255, 255)); + std::string role_name; + if (auto iter = RolesName.find(result); + iter == RolesName.cend()) { + role_name = "Unknown"; + } + else { + role_name = iter->second; + } + cv::putText(m_image_draw, role_name, cv::Point(roi.x, roi.y - 5), 1, 1, cv::Scalar(0, 255, 255)); #endif return result; diff --git a/src/MeoAssistant/BattleImageAnalyzer.h b/src/MeoAssistant/BattleImageAnalyzer.h index 922627c316..1a454f03b3 100644 --- a/src/MeoAssistant/BattleImageAnalyzer.h +++ b/src/MeoAssistant/BattleImageAnalyzer.h @@ -8,7 +8,7 @@ namespace asst public: enum class Role { - Invaild, + Unknown, Caster, Medic, Pioneer, @@ -16,12 +16,13 @@ namespace asst Special, Support, Tank, - Warrior + Warrior, + Drone }; struct Oper { int cost = 0; - Role role = Role::Invaild; + Role role = Role::Unknown; bool available = false; Rect rect; }; diff --git a/src/MeoAssistant/HashImageAnalyzer.cpp b/src/MeoAssistant/HashImageAnalyzer.cpp index 085ae518d2..7140491522 100644 --- a/src/MeoAssistant/HashImageAnalyzer.cpp +++ b/src/MeoAssistant/HashImageAnalyzer.cpp @@ -1,6 +1,7 @@ #include "HashImageAnalyzer.h" #include "AsstUtils.hpp" +#include "Logger.hpp" bool asst::HashImageAnalyzer::analyze() { @@ -31,11 +32,13 @@ bool asst::HashImageAnalyzer::analyze() to_hash = bound_bin(to_hash); } std::string hash_result = shash(to_hash); + Log.trace(hash_result); int min_dist = INT_MAX; std::string cur_min_dist_name; for (auto&& [name, templ] : m_hash_templates) { int hm = hamming(hash_result, templ); + Log.trace(name, "dist:", hm); if (hm < min_dist) { cur_min_dist_name = name; min_dist = hm;