From b36bde547a745f7afc8a9bda6bd7c41fee02afb4 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sat, 16 Oct 2021 00:45:25 +0800 Subject: [PATCH] =?UTF-8?q?feat.=E5=AE=8C=E6=88=90=E5=9F=BA=E5=BB=BA?= =?UTF-8?q?=E5=B9=B2=E5=91=98=E7=AC=91=E8=84=B8=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/tasks.json | 43 +++++++++++ resource/template/SmileyOnDistract.png | Bin 0 -> 905 bytes .../{SmileyAtRest.png => SmileyOnRest.png} | Bin .../{SmileyAtWork.png => SmileyOnWork.png} | Bin src/MeoAssistance/AbstractTask.cpp | 10 ++- src/MeoAssistance/Assistance.cpp | 8 +- src/MeoAssistance/Assistance.h | 3 +- src/MeoAssistance/InfrastShiftTask.cpp | 23 ++++++ src/MeoAssistance/InfrastShiftTask.h | 14 ++++ .../InfrastSkillsImageAnalyzer.cpp | 28 +++++++ .../InfrastSkillsImageAnalyzer.h | 14 ++++ .../InfrastSmileyImageAnalyzer.cpp | 43 +++++++++++ .../InfrastSmileyImageAnalyzer.h | 32 ++++++++ src/MeoAssistance/MeoAssistance.vcxproj | 7 +- .../MeoAssistance.vcxproj.filters | 73 ++++++++++++------ src/MeoAssistance/Task.h | 6 -- tools/TestCaller/main.cpp | 10 +-- 17 files changed, 275 insertions(+), 39 deletions(-) create mode 100644 resource/template/SmileyOnDistract.png rename resource/template/{SmileyAtRest.png => SmileyOnRest.png} (100%) rename resource/template/{SmileyAtWork.png => SmileyOnWork.png} (100%) create mode 100644 src/MeoAssistance/InfrastShiftTask.cpp create mode 100644 src/MeoAssistance/InfrastShiftTask.h create mode 100644 src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp create mode 100644 src/MeoAssistance/InfrastSkillsImageAnalyzer.h create mode 100644 src/MeoAssistance/InfrastSmileyImageAnalyzer.cpp create mode 100644 src/MeoAssistance/InfrastSmileyImageAnalyzer.h delete mode 100644 src/MeoAssistance/Task.h diff --git a/resource/tasks.json b/resource/tasks.json index e626988f75..607f9706aa 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -631,6 +631,16 @@ "ReturnToInfrast" ] }, + "Return": { + "algorithm": "justReturn", + "action": "clickRect", + "specificRect": [ + 20, + 20, + 135, + 35 + ] + }, "EnterInfrast": { "templThreshold": 0.85, "histThreshold": 0.85, @@ -810,5 +820,38 @@ "action": "stop", "cache": false, "next": [] + }, + "InfrastSkillsUpper": { + "algorithm": "justReturn", + "roi": [ + 400, + 250, + 880, + 110 + ] + }, + "InfrastSkillsLower": { + "algorithm": "justReturn", + "roi": [ + 400, + 530, + 880, + 110 + ] + }, + "InfrastSmileyOnRest": { + "template": "SmileyOnRest.png", + "maskRange": [100, 255], + "templThreshold": 0.8 + }, + "InfrastSmileyOnWork": { + "template": "SmileyOnWork.png", + "maskRange": [100, 255], + "templThreshold": 0.8 + }, + "InfrastSmileyOnDistract": { + "template": "SmileyOnDistract.png", + "maskRange": [100, 255], + "templThreshold": 0.8 } } \ No newline at end of file diff --git a/resource/template/SmileyOnDistract.png b/resource/template/SmileyOnDistract.png new file mode 100644 index 0000000000000000000000000000000000000000..a4528333260f3b8c139cc4504ca2d69ad2499794 GIT binary patch literal 905 zcmV;419tq0P)@l+ zvrn6&wXYxldtVm<4q!R}w7T-J@E2G2^)Z>8f~u zd-0|-jN^w`EGAFK*2zR-vq)+}#7v8bDfgzVh-AecKP%sDF=SUfE-FBmk|X~4acF1) zmmhH5vASh>01s+QJDYa*@r0yNBjibRY(Wnhw>qHQ1yZ&FM4#zrt8)W2;mXqZcsH8Y zSLUJx6uZg-@+CkX?4bUkR@7EKM`dGtIp#Q|$IkKd^S%7AG0e!WE`C4qIsg~DH*mf! z!ugg6b8o&>1XYQ&x1$CX2ZF&>z>1BVX&xv*qMe;Y4;1#zM~@MxZ@^t=5P0=)>Bqz2 z)y4)u*HLsG@3w8MT?@XacH*wC0zhlrz@op3K$Qorwz^Dm5|4~Y70&P(ddFji)% z>=(#q3hRy%7&*=Kl_}I&G`_!(#G3k*5}PdN zN2R9FoYS_8iT!)ww=pmm0Q1(vf*A^7#p77f1{P}~pt)C&GC&6VrxTnT8senw1H&-H zFbsLEzEXzwB*dPc5|O2Q8)bVzvZn^+lTBgikJd_aBq~}U5I6*o#KYY5pSZ^_5ULH~ zjjjjf_G2j7EY`8FIC1z8U(VYk9i5yAieVV5W~*JzFrY2)XzzCXZym+$^Py-uj^jc^ zu(C67^E#K_*w5%xijS=z*JatxB|v~6HV>;gT6Bd+!quz`1~4lEWb+nRE=@9#&N1$I fNIGtuqTGK0X@bIsY-J&%00000NkvXXu0mjfByOvc literal 0 HcmV?d00001 diff --git a/resource/template/SmileyAtRest.png b/resource/template/SmileyOnRest.png similarity index 100% rename from resource/template/SmileyAtRest.png rename to resource/template/SmileyOnRest.png diff --git a/resource/template/SmileyAtWork.png b/resource/template/SmileyOnWork.png similarity index 100% rename from resource/template/SmileyAtWork.png rename to resource/template/SmileyOnWork.png diff --git a/src/MeoAssistance/AbstractTask.cpp b/src/MeoAssistance/AbstractTask.cpp index aec2d17667..337b49f3be 100644 --- a/src/MeoAssistance/AbstractTask.cpp +++ b/src/MeoAssistance/AbstractTask.cpp @@ -9,6 +9,7 @@ #include "Controller.h" #include "AsstUtils.hpp" #include "Logger.hpp" +#include "Resource.h" using namespace asst; @@ -75,6 +76,11 @@ bool asst::AbstractTask::click_return_button() { LogTraceFunction; - const static Rect ConfirmButtonRect(20, 20, 135, 35); - return ctrler.click(ConfirmButtonRect); + static Rect ReturnButtonRect; + if (ReturnButtonRect.empty()) { + const static auto return_task_ptr = std::dynamic_pointer_cast( + resource.task().task_ptr("Return")); + ReturnButtonRect = return_task_ptr->specific_rect; + } + return ctrler.click(ReturnButtonRect); } \ No newline at end of file diff --git a/src/MeoAssistance/Assistance.cpp b/src/MeoAssistance/Assistance.cpp index 0d108e70bc..0df7f2c077 100644 --- a/src/MeoAssistance/Assistance.cpp +++ b/src/MeoAssistance/Assistance.cpp @@ -11,6 +11,12 @@ #include "AsstUtils.hpp" #include "Resource.h" +#include "ProcessTask.h" +#include "RecruitTask.h" +#include "ScreenCaptureTask.h" +#include "CreditShoppingTask.h" +#include "InfrastShiftTask.h" + using namespace asst; Assistance::Assistance(AsstCallback callback, void* callback_arg) @@ -225,7 +231,7 @@ bool Assistance::start_debug_task() //} { constexpr static const char* DebugTaskChain = "Debug"; - auto shift_task_ptr = std::make_shared(task_callback, (void*)this); + auto shift_task_ptr = std::make_shared(task_callback, (void*)this); shift_task_ptr->set_task_chain(DebugTaskChain); m_tasks_deque.emplace_back(shift_task_ptr); } diff --git a/src/MeoAssistance/Assistance.h b/src/MeoAssistance/Assistance.h index a69005975f..c55390fd95 100644 --- a/src/MeoAssistance/Assistance.h +++ b/src/MeoAssistance/Assistance.h @@ -10,7 +10,8 @@ #include #include "AsstDef.h" -#include "Task.h" +#include "AsstMsg.h" +#include "AbstractTask.h" namespace cv { class Mat; diff --git a/src/MeoAssistance/InfrastShiftTask.cpp b/src/MeoAssistance/InfrastShiftTask.cpp new file mode 100644 index 0000000000..83c610a906 --- /dev/null +++ b/src/MeoAssistance/InfrastShiftTask.cpp @@ -0,0 +1,23 @@ +#include "InfrastShiftTask.h" + +#include "Resource.h" +#include "Controller.h" +#include "InfrastSkillsImageAnalyzer.h" + +bool asst::InfrastShiftTask::run() +{ + json::value task_start_json = json::object{ + { "task_type", "InfrastShiftTask" }, + { "task_chain", m_task_chain} + }; + m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); + + const auto& image = ctrler.get_image(); + + InfrastSkillsImageAnalyzer skills_analyzer(image); + + if (skills_analyzer.analyze()) { + } + + return false; +} \ No newline at end of file diff --git a/src/MeoAssistance/InfrastShiftTask.h b/src/MeoAssistance/InfrastShiftTask.h new file mode 100644 index 0000000000..8892edfa6f --- /dev/null +++ b/src/MeoAssistance/InfrastShiftTask.h @@ -0,0 +1,14 @@ +#pragma once + +#include "AbstractTask.h" + +namespace asst { + class InfrastShiftTask : public AbstractTask + { + public: + using AbstractTask::AbstractTask; + virtual ~InfrastShiftTask() = default; + virtual bool run() override; + protected: + }; +} diff --git a/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp b/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp new file mode 100644 index 0000000000..1e64e2bdf5 --- /dev/null +++ b/src/MeoAssistance/InfrastSkillsImageAnalyzer.cpp @@ -0,0 +1,28 @@ +#include "InfrastSkillsImageAnalyzer.h" + +#include "Resource.h" +#include "InfrastSmileyImageAnalyzer.h" + +bool asst::InfrastSkillsImageAnalyzer::analyze() +{ + const auto upper_task_ptr = resource.task().task_ptr("InfrastSkillsUpper"); + const auto lower_task_ptr = resource.task().task_ptr("InfrastSkillsLower"); + + bool upper_ret = skills_roi_analyze(upper_task_ptr->roi); + bool lower_ret = skills_roi_analyze(lower_task_ptr->roi); + + return upper_ret && lower_ret; +} + +bool asst::InfrastSkillsImageAnalyzer::skills_roi_analyze(const Rect& roi) +{ + InfrastSmileyImageAnalyzer smiley_analyzer(m_image, roi); + + if (!smiley_analyzer.analyze()) { + return false; + } + + const auto& smiley_res = smiley_analyzer.get_result(); + + return true; +} \ No newline at end of file diff --git a/src/MeoAssistance/InfrastSkillsImageAnalyzer.h b/src/MeoAssistance/InfrastSkillsImageAnalyzer.h new file mode 100644 index 0000000000..cc915fdaf4 --- /dev/null +++ b/src/MeoAssistance/InfrastSkillsImageAnalyzer.h @@ -0,0 +1,14 @@ +#pragma once +#include "AbstractImageAnalyzer.h" + +namespace asst { + class InfrastSkillsImageAnalyzer : public AbstractImageAnalyzer + { + public: + using AbstractImageAnalyzer::AbstractImageAnalyzer; + virtual ~InfrastSkillsImageAnalyzer() = default; + virtual bool analyze() override; + protected: + bool skills_roi_analyze(const Rect& roi); + }; +} \ No newline at end of file diff --git a/src/MeoAssistance/InfrastSmileyImageAnalyzer.cpp b/src/MeoAssistance/InfrastSmileyImageAnalyzer.cpp new file mode 100644 index 0000000000..db7095bda9 --- /dev/null +++ b/src/MeoAssistance/InfrastSmileyImageAnalyzer.cpp @@ -0,0 +1,43 @@ +#include "InfrastSmileyImageAnalyzer.h" + +#include "Resource.h" +#include "MultiMatchImageAnalyzer.h" +#include "AsstUtils.hpp" + +bool asst::InfrastSmileyImageAnalyzer::analyze() +{ + const static std::unordered_map smiley_map = + { + {SmileyType::Rest, "InfrastSmileyOnRest"}, + {SmileyType::Work, "InfrastSmileyOnWork"}, + {SmileyType::Distract, "InfrastSmileyOnDistract"} + }; + + m_result.clear(); + +#ifdef LOG_TRACE + cv::Mat image_draw = m_image.clone(); +#endif + + MultiMatchImageAnalyzer mm_analyzer(m_image, m_roi); + + decltype(m_result) temp_result; + for (const auto& [type, task_name] : smiley_map) { + const auto task_ptr = std::dynamic_pointer_cast(resource.task().task_ptr(task_name)); + mm_analyzer.set_templ_name(task_ptr->templ_name); + mm_analyzer.set_threshold(task_ptr->templ_threshold); + mm_analyzer.set_mask_range(task_ptr->mask_range); + if (!mm_analyzer.analyze()) { + return false; + } + auto& res = mm_analyzer.get_result(); + for (const MatchRect& mr : res) { + temp_result.emplace_back(SmileyInfo{ type, mr.rect }); +#ifdef LOG_TRACE + cv::rectangle(image_draw, utils::make_rect(mr.rect), cv::Scalar(0, 0, 255), 2); +#endif + } + } + m_result = std::move(temp_result); + return true; +} \ No newline at end of file diff --git a/src/MeoAssistance/InfrastSmileyImageAnalyzer.h b/src/MeoAssistance/InfrastSmileyImageAnalyzer.h new file mode 100644 index 0000000000..8b6cd09348 --- /dev/null +++ b/src/MeoAssistance/InfrastSmileyImageAnalyzer.h @@ -0,0 +1,32 @@ +#pragma once +#include "AbstractImageAnalyzer.h" + +#include "AsstDef.h" + +namespace asst { + enum class SmileyType { + Invalid = -1, + Rest, // 休息完成,绿色笑脸 + Work, // 工作中,黄色笑脸 + Distract // 注意力涣散,红色哭脸 + }; + struct SmileyInfo { + SmileyType type; + Rect rect; + }; + + class InfrastSmileyImageAnalyzer : public AbstractImageAnalyzer + { + public: + using AbstractImageAnalyzer::AbstractImageAnalyzer; + virtual ~InfrastSmileyImageAnalyzer() = default; + + virtual bool analyze() override; + + const std::vector& get_result() const noexcept { + return m_result; + } + protected: + std::vector m_result; + }; +} diff --git a/src/MeoAssistance/MeoAssistance.vcxproj b/src/MeoAssistance/MeoAssistance.vcxproj index 77d9d7c29a..5c1cb849ce 100644 --- a/src/MeoAssistance/MeoAssistance.vcxproj +++ b/src/MeoAssistance/MeoAssistance.vcxproj @@ -24,6 +24,9 @@ + + + @@ -38,7 +41,6 @@ - @@ -53,6 +55,9 @@ + + + diff --git a/src/MeoAssistance/MeoAssistance.vcxproj.filters b/src/MeoAssistance/MeoAssistance.vcxproj.filters index 559bbba852..39bc49dcc0 100644 --- a/src/MeoAssistance/MeoAssistance.vcxproj.filters +++ b/src/MeoAssistance/MeoAssistance.vcxproj.filters @@ -43,6 +43,18 @@ {a5c43813-70af-4b0e-94ac-9ddecc2e4a3c} + + {a37e0b23-e8f8-499c-adf5-9990277e9ffe} + + + {51165426-1842-491a-b5d5-9d26c59facdd} + + + {c600668a-0d70-4694-b1e5-6a78cffd0b1a} + + + {d173e449-880b-4064-bbab-97007e3d090b} + @@ -87,9 +99,6 @@ 头文件\Utils - - 头文件\Task - 头文件\Resource @@ -111,9 +120,6 @@ 头文件\Resource - - 头文件\ImageAnalyzer - 头文件\ImageAnalyzer @@ -129,12 +135,6 @@ 头文件\Resource - - 头文件\ImageAnalyzer - - - 头文件\ImageAnalyzer - 头文件\ImageAnalyzer @@ -144,8 +144,26 @@ 头文件\ImageAnalyzer + + 头文件\Task + + + 头文件\ImageAnalyzer\General + + + 头文件\ImageAnalyzer\General + - 头文件\ImageAnalyzer + 头文件\ImageAnalyzer\General + + + 头文件\ImageAnalyzer\General + + + 头文件\ImageAnalyzer\Infrast + + + 头文件\ImageAnalyzer\Infrast @@ -194,9 +212,6 @@ 源文件\Resource - - 源文件\ImageAnalyzer - 源文件\ImageAnalyzer @@ -212,12 +227,6 @@ 源文件\Resource - - 源文件\ImageAnalyzer - - - 源文件\ImageAnalyzer - 源文件\ImageAnalyzer @@ -227,8 +236,26 @@ 源文件\ImageAnalyzer + + 源文件\Task + + + 源文件\ImageAnalyzer\Infrast + + + 源文件\ImageAnalyzer\Infrast + + + 源文件\ImageAnalyzer\General + + + 源文件\ImageAnalyzer\General + - 源文件\ImageAnalyzer + 源文件\ImageAnalyzer\General + + + 源文件\ImageAnalyzer\General diff --git a/src/MeoAssistance/Task.h b/src/MeoAssistance/Task.h deleted file mode 100644 index be5b6ac882..0000000000 --- a/src/MeoAssistance/Task.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "ProcessTask.h" -#include "RecruitTask.h" -#include "ScreenCaptureTask.h" -#include "CreditShoppingTask.h" \ No newline at end of file diff --git a/tools/TestCaller/main.cpp b/tools/TestCaller/main.cpp index 0cfc6028a0..d7642abb81 100644 --- a/tools/TestCaller/main.cpp +++ b/tools/TestCaller/main.cpp @@ -18,11 +18,11 @@ int main(int argc, char** argv) while (ch != 'q') { //AsstStartSanity(ptr); //AsstStartVisit(ptr, true); - { - const int required[] = { 3, 4, 5, 6 }; - AsstStartRecruiting(ptr, required, sizeof(required) / sizeof(int), true); - } - //AsstStartDebugTask(ptr); + //{ + // const int required[] = { 3, 4, 5, 6 }; + // AsstStartRecruiting(ptr, required, sizeof(required) / sizeof(int), true); + //} + AsstStartDebugTask(ptr); ch = getchar(); }