From 780c3e1cf1b38fa7b021ed7a201ebd80724ed078 Mon Sep 17 00:00:00 2001 From: MistEO Date: Fri, 24 Sep 2021 21:19:59 +0800 Subject: [PATCH] =?UTF-8?q?feat.=E6=96=B0=E5=A2=9E=E4=BF=A1=E7=94=A8?= =?UTF-8?q?=E5=95=86=E5=BA=97=E8=87=AA=E5=8A=A8=E8=B4=AD=E4=B9=B0=E7=9A=84?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/template/special/BuyIt.png | Bin 0 -> 5165 bytes resource/template/special/CreditPoint.png | Bin 0 -> 1608 bytes resource/template/special/SoldOut.png | Bin 0 -> 3084 bytes src/MeoAssistance/AbstractTask.cpp | 13 +- src/MeoAssistance/AbstractTask.h | 4 +- src/MeoAssistance/Assistance.cpp | 6 +- src/MeoAssistance/CreditShoppingTask.cpp | 116 ++++++++++++++++++ src/MeoAssistance/CreditShoppingTask.h | 18 +++ src/MeoAssistance/InfrastAbstractTask.cpp | 8 -- src/MeoAssistance/InfrastAbstractTask.h | 1 - src/MeoAssistance/MeoAssistance.vcxproj | 4 + .../MeoAssistance.vcxproj.filters | 12 ++ src/MeoAssistance/ScreenCaptureTask.cpp | 16 +++ src/MeoAssistance/ScreenCaptureTask.h | 15 +++ src/MeoAssistance/Task.h | 4 +- src/MeoAssistance/WinMacro.cpp | 15 ++- src/MeoAssistance/WinMacro.h | 2 +- tools/TestCaller/main.cpp | 4 +- 18 files changed, 216 insertions(+), 22 deletions(-) create mode 100644 resource/template/special/BuyIt.png create mode 100644 resource/template/special/CreditPoint.png create mode 100644 resource/template/special/SoldOut.png create mode 100644 src/MeoAssistance/CreditShoppingTask.cpp create mode 100644 src/MeoAssistance/CreditShoppingTask.h create mode 100644 src/MeoAssistance/ScreenCaptureTask.cpp create mode 100644 src/MeoAssistance/ScreenCaptureTask.h diff --git a/resource/template/special/BuyIt.png b/resource/template/special/BuyIt.png new file mode 100644 index 0000000000000000000000000000000000000000..f622d7ddcef13cde1c6a69b48d1e08c85ab04cce GIT binary patch literal 5165 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 R|GjwtxQdo?m7-Pn{{U(s+G79! literal 0 HcmV?d00001 diff --git a/resource/template/special/CreditPoint.png b/resource/template/special/CreditPoint.png new file mode 100644 index 0000000000000000000000000000000000000000..cf6c5f088aa9bc8dc33867e45fe195f276da8ae9 GIT binary patch literal 1608 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 //if (image.empty()) { @@ -73,7 +74,7 @@ bool AbstractTask::print_window(const std::string& dir) const std::string time_str = StringReplaceAll(StringReplaceAll(GetFormatTimeString(), " ", "_"), ":", "-"); const std::string filename = dir + time_str + ".png"; - bool ret = cv::imwrite(filename, m_controller_ptr->get_image(true)); + bool ret = cv::imwrite(filename, m_controller_ptr->get_image(raw)); json::value callback_json; callback_json["filename"] = filename; @@ -97,4 +98,12 @@ bool asst::AbstractTask::is_ptr_inited() const noexcept return false; } return true; +} + +bool asst::AbstractTask::click_return_button() +{ + DebugTraceFunction; + + const static Rect ConfirmButtonRect(20, 20, 135, 35); + return m_controller_ptr->click(ConfirmButtonRect); } \ No newline at end of file diff --git a/src/MeoAssistance/AbstractTask.h b/src/MeoAssistance/AbstractTask.h index 45ec43c3ab..abf73bfe1c 100644 --- a/src/MeoAssistance/AbstractTask.h +++ b/src/MeoAssistance/AbstractTask.h @@ -32,10 +32,12 @@ namespace asst { virtual void on_run_fails(int retry_times) { ; } protected: virtual bool sleep(unsigned millisecond); - virtual bool print_window(const std::string& dir); + virtual bool print_window(const std::string& dir, bool raw = true); virtual bool need_exit() const noexcept; virtual bool is_ptr_inited() const noexcept; + virtual bool click_return_button(); + std::shared_ptr m_controller_ptr = nullptr; std::shared_ptr m_identify_ptr = nullptr; diff --git a/src/MeoAssistance/Assistance.cpp b/src/MeoAssistance/Assistance.cpp index e5aedbfea9..5329b4906e 100644 --- a/src/MeoAssistance/Assistance.cpp +++ b/src/MeoAssistance/Assistance.cpp @@ -285,9 +285,9 @@ bool Assistance::start_debug_task() // m_tasks_deque.emplace_back(shift_task_ptr); //} { - constexpr static const char* InfrastTaskCahin = "Debug"; - auto shift_task_ptr = std::make_shared(task_callback, (void*)this); - shift_task_ptr->set_task_chain(InfrastTaskCahin); + constexpr static const char* DebugTaskChain = "Debug"; + 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/CreditShoppingTask.cpp b/src/MeoAssistance/CreditShoppingTask.cpp new file mode 100644 index 0000000000..5c39937de2 --- /dev/null +++ b/src/MeoAssistance/CreditShoppingTask.cpp @@ -0,0 +1,116 @@ +#include "CreditShoppingTask.h" + +#include +#include + +#include + +#include "Identify.h" +#include "WinMacro.h" +#include "Configer.h" + +bool asst::CreditShoppingTask::run() +{ + if (m_controller_ptr == nullptr + || m_identify_ptr == nullptr) + { + m_callback(AsstMsg::PtrIsNull, json::value(), m_callback_arg); + return false; + } + + cv::Mat image = m_controller_ptr->get_image(); + + // 识别信用点的图标 + auto find_res_vec = m_identify_ptr->find_all_images(image, "CreditPoint", Configer::TemplThresholdDefault, false); + + // 按位置排个序 + std::sort(find_res_vec.begin(), find_res_vec.end(), []( + const auto& lhs, const auto& rhs) -> bool { + if (std::abs(lhs.rect.y - rhs.rect.y) < 5) { // y差距较小则理解为是同一排的,按x排序 + return lhs.rect.x < rhs.rect.x; + } + else { + return lhs.rect.y < rhs.rect.y; + } + }); + + // 计算哪些商品是需要买的 + std::vector need_to_buy; + for (const auto& res : find_res_vec) { + cv::Rect name_rect; + name_rect.x = res.rect.x - 80; + name_rect.y = res.rect.y - 210; + name_rect.width = 230; + name_rect.height = 70; + if (name_rect.x < 0) { + name_rect.x = 0; + } + // 过滤掉不买的 + // TODO,哪些要买哪些不买,提供个接口出去 + static const std::vector not_to_buy_names = { "碳", "家具" }; + const auto& ocr_res = m_identify_ptr->ocr_detect(image(name_rect)); + auto find_iter = std::find_first_of(ocr_res.cbegin(), ocr_res.cend(), not_to_buy_names.cbegin(), not_to_buy_names.cend(), + [](const auto& lhs, const std::string& rhs) -> bool { + return lhs.text.find(rhs) != std::string::npos; + }); + if (find_iter != ocr_res.cend()) { +#ifdef LOG_TRACE + cv::putText(image, "Not to buy", cv::Point(res.rect.x, res.rect.y), 1, 2, cv::Scalar(255, 0, 0)); +#endif // LOG_TRACE + continue; + } + Rect commodity_rect(res.rect.x - 60, res.rect.y - 180, 220, 220); + // 识别“售罄” + auto sold_out_res = m_identify_ptr->find_image(image(make_rect(commodity_rect)), "SoldOut"); + +#ifdef LOG_TRACE + cv::rectangle(image, make_rect(commodity_rect), cv::Scalar(0, 0, 255)); + if (sold_out_res.score >= Configer::TemplThresholdDefault) { + cv::putText(image, "Sold Out", cv::Point(commodity_rect.x, commodity_rect.y), 1, 2, cv::Scalar(255, 0, 0)); + } +#endif // LOG_TRACE + + if (sold_out_res.score >= Configer::TemplThresholdDefault) { + continue; + } + need_to_buy.emplace_back(commodity_rect.center_zoom(0.8)); + } + + for (const Rect& commodity_rect : need_to_buy) { + m_controller_ptr->click(commodity_rect); + sleep(1000); + image = m_controller_ptr->get_image(); + + // “购买商品”按钮 + static Rect buy_it_rect; + if (buy_it_rect.width == 0) { + auto buy_it_res = m_identify_ptr->find_image(image, "BuyIt", Configer::TemplThresholdDefault); + if (buy_it_res.score < Configer::TemplThresholdDefault) { + // 没事别到“购买商品”按钮,不应该出现这种情况,TODO 报错 + return false; + } + buy_it_rect = buy_it_res.rect; + } + + m_controller_ptr->click(buy_it_rect); + sleep(1000); + // 识别是否信用不足无法购买 + image = m_controller_ptr->get_image(); + static const std::vector shopping_finished = { "信用不足", "无法购买" }; + const auto& ocr_res = ocr_detect(image(cv::Rect(940, 60, 339, 110))); + auto find_iter = std::find_first_of(ocr_res.cbegin(), ocr_res.cend(), shopping_finished.cbegin(), shopping_finished.cend(), + [](const auto& lhs, const std::string& rhs) -> bool { + return lhs.text.find(rhs) != std::string::npos; + }); + if (find_iter != ocr_res.cend()) { + click_return_button(); + return true; + } + + // 这里随便点一下都行,把购买完弹出来物品的界面取消掉 + m_controller_ptr->click(buy_it_rect); + sleep(1000); + } + + return true; +} diff --git a/src/MeoAssistance/CreditShoppingTask.h b/src/MeoAssistance/CreditShoppingTask.h new file mode 100644 index 0000000000..f7c7f9ab90 --- /dev/null +++ b/src/MeoAssistance/CreditShoppingTask.h @@ -0,0 +1,18 @@ +#pragma once +#include "OcrAbstractTask.h" + +#include + +#include "AsstDef.h" + +namespace asst { + class CreditShoppingTask : public OcrAbstractTask + { + public: + using OcrAbstractTask::OcrAbstractTask; + virtual ~CreditShoppingTask() = default; + virtual bool run() override; + private: + }; + +} \ No newline at end of file diff --git a/src/MeoAssistance/InfrastAbstractTask.cpp b/src/MeoAssistance/InfrastAbstractTask.cpp index ce88393e62..be130de386 100644 --- a/src/MeoAssistance/InfrastAbstractTask.cpp +++ b/src/MeoAssistance/InfrastAbstractTask.cpp @@ -59,14 +59,6 @@ bool asst::InfrastAbstractTask::click_confirm_button() return m_controller_ptr->click(ConfirmButtonRect); } -bool asst::InfrastAbstractTask::click_return_button() -{ - DebugTraceFunction; - - const static Rect ConfirmButtonRect(20, 20, 135, 35); - return m_controller_ptr->click(ConfirmButtonRect); -} - bool asst::InfrastAbstractTask::swipe(bool reverse) { DebugTraceFunction; diff --git a/src/MeoAssistance/InfrastAbstractTask.h b/src/MeoAssistance/InfrastAbstractTask.h index 830baf73cd..f2cfb51c56 100644 --- a/src/MeoAssistance/InfrastAbstractTask.h +++ b/src/MeoAssistance/InfrastAbstractTask.h @@ -17,7 +17,6 @@ namespace asst { virtual bool swipe_to_the_left(); // 滑动到最左侧 virtual bool click_clear_button(); virtual bool click_confirm_button(); - virtual bool click_return_button(); virtual bool swipe(bool reverse = false); virtual bool swipe_left(); // 往左划(只滑一下) virtual bool swipe_right(); // 往右划(只滑一下) diff --git a/src/MeoAssistance/MeoAssistance.vcxproj b/src/MeoAssistance/MeoAssistance.vcxproj index 3ecb2695df..03bd41b182 100644 --- a/src/MeoAssistance/MeoAssistance.vcxproj +++ b/src/MeoAssistance/MeoAssistance.vcxproj @@ -20,6 +20,7 @@ + @@ -33,6 +34,7 @@ + @@ -42,6 +44,7 @@ + @@ -57,6 +60,7 @@ + diff --git a/src/MeoAssistance/MeoAssistance.vcxproj.filters b/src/MeoAssistance/MeoAssistance.vcxproj.filters index 01e227157f..edf3f64123 100644 --- a/src/MeoAssistance/MeoAssistance.vcxproj.filters +++ b/src/MeoAssistance/MeoAssistance.vcxproj.filters @@ -117,6 +117,12 @@ 头文件\Configer + + 头文件\Task + + + 头文件\Task + @@ -179,5 +185,11 @@ 源文件\Configer + + 源文件\Task + + + 源文件\Task + \ No newline at end of file diff --git a/src/MeoAssistance/ScreenCaptureTask.cpp b/src/MeoAssistance/ScreenCaptureTask.cpp new file mode 100644 index 0000000000..1fbd7257a6 --- /dev/null +++ b/src/MeoAssistance/ScreenCaptureTask.cpp @@ -0,0 +1,16 @@ +#include "ScreenCaptureTask.h" + +#include "AsstAux.h" + +bool asst::ScreenCaptureTask::run() +{ + if (m_controller_ptr == nullptr + || m_identify_ptr == nullptr) + { + m_callback(AsstMsg::PtrIsNull, json::value(), m_callback_arg); + return false; + } + + static const std::string dirname = GetCurrentDir() + "template\\"; + return print_window(dirname, false); +} \ No newline at end of file diff --git a/src/MeoAssistance/ScreenCaptureTask.h b/src/MeoAssistance/ScreenCaptureTask.h new file mode 100644 index 0000000000..c42cae61dd --- /dev/null +++ b/src/MeoAssistance/ScreenCaptureTask.h @@ -0,0 +1,15 @@ +#pragma once +#include "AbstractTask.h" + +namespace asst { + // 截图任务,主要是调试用的,制作模板匹配的素材啥的 + class ScreenCaptureTask : public AbstractTask + { + public: + using AbstractTask::AbstractTask; + virtual ~ScreenCaptureTask() = default; + + virtual bool run() override; + private: + }; +} \ No newline at end of file diff --git a/src/MeoAssistance/Task.h b/src/MeoAssistance/Task.h index dad8d3014a..2232ed7e6d 100644 --- a/src/MeoAssistance/Task.h +++ b/src/MeoAssistance/Task.h @@ -6,4 +6,6 @@ #include "InfrastProductionTask.h" #include "InfrastDormTask.h" #include "InfrastPowerTask.h" -#include "InfrastOfficeTask.h" \ No newline at end of file +#include "InfrastOfficeTask.h" +#include "ScreenCaptureTask.h" +#include "CreditShoppingTask.h" \ No newline at end of file diff --git a/src/MeoAssistance/WinMacro.cpp b/src/MeoAssistance/WinMacro.cpp index d31f34147c..a88de13b1a 100644 --- a/src/MeoAssistance/WinMacro.cpp +++ b/src/MeoAssistance/WinMacro.cpp @@ -333,12 +333,19 @@ void asst::WinMacro::wait(unsigned id) const noexcept } } -void asst::WinMacro::screencap() +bool asst::WinMacro::screencap() { DebugTraceFunction; auto data = call_command(m_emulator_info.adb.screencap); - m_cache_image = cv::imdecode(data, cv::IMREAD_COLOR); + if (!data.empty()) { + m_cache_image = cv::imdecode(data, cv::IMREAD_COLOR); + return true; + } + else { + DebugTraceError("Screencap is empty!"); + return false; + } //cv::Mat temp_image = cv::imdecode(data, cv::IMREAD_COLOR); ////std::unique_lock image_lock(m_image_mutex); @@ -418,7 +425,9 @@ int asst::WinMacro::swipe_without_scale(const Rect& r1, const Rect& r2, int dura cv::Mat asst::WinMacro::get_image(bool raw) { - screencap(); + if (!screencap()) { + return cv::Mat(); + } //std::shared_lock image_lock(m_image_mutex); if (raw) { return m_cache_image; diff --git a/src/MeoAssistance/WinMacro.h b/src/MeoAssistance/WinMacro.h index d2e2ad6e61..cc94d37a68 100644 --- a/src/MeoAssistance/WinMacro.h +++ b/src/MeoAssistance/WinMacro.h @@ -46,7 +46,7 @@ namespace asst { std::vector call_command(const std::string& cmd); int push_cmd(const std::string& cmd); void wait(unsigned id) const noexcept; - void screencap(); + bool screencap(); Point rand_point_in_rect(const Rect& rect); diff --git a/tools/TestCaller/main.cpp b/tools/TestCaller/main.cpp index c7616017c8..f7411e2922 100644 --- a/tools/TestCaller/main.cpp +++ b/tools/TestCaller/main.cpp @@ -17,8 +17,8 @@ int main(int argc, char** argv) char ch = 0; while (ch != 'q') { //AsstStartIndertifyOpers(ptr); - AsstStartInfrast(ptr); - //AsstStartDebugTask(ptr); + //AsstStartInfrast(ptr); + AsstStartDebugTask(ptr); //{ // const int required[] = { 3, 4, 5, 6 }; // AsstStartOpenRecruit(ptr, required, sizeof(required)/sizeof(int), true);