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 0000000000..a452833326 Binary files /dev/null and b/resource/template/SmileyOnDistract.png differ 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(); }