diff --git a/MeoAssistance/AbstractTask.cpp b/MeoAssistance/AbstractTask.cpp index 59415bd74e..2ca7c13cdf 100644 --- a/MeoAssistance/AbstractTask.cpp +++ b/MeoAssistance/AbstractTask.cpp @@ -97,6 +97,9 @@ bool AbstractTask::set_control_scale(int cur_width, int cur_height) bool AbstractTask::sleep(unsigned millisecond) { + if (need_exit()) { + return false; + } if (millisecond == 0) { return true; } @@ -107,15 +110,14 @@ bool AbstractTask::sleep(unsigned millisecond) callback_json["time"] = millisecond; m_callback(AsstMsg::ReadyToSleep, callback_json, m_callback_arg); - while ((m_exit_flag == NULL || *m_exit_flag == false) - && duration < millisecond) { + while (!need_exit() && duration < millisecond) { duration = std::chrono::duration_cast( std::chrono::system_clock::now() - start).count(); std::this_thread::yield(); } m_callback(AsstMsg::EndOfSleep, callback_json, m_callback_arg); - return (m_exit_flag == NULL || *m_exit_flag == false); + return !need_exit(); } bool AbstractTask::print_window(const std::string& dir) @@ -142,4 +144,9 @@ bool AbstractTask::print_window(const std::string& dir) m_callback(AsstMsg::PrintWindow, callback_json, m_callback_arg); return ret; -} \ No newline at end of file +} + +bool asst::AbstractTask::need_exit() const noexcept +{ + return m_exit_flag != NULL && *m_exit_flag == true; +} diff --git a/MeoAssistance/AbstractTask.h b/MeoAssistance/AbstractTask.h index e33ee30e5d..2cb7a1079a 100644 --- a/MeoAssistance/AbstractTask.h +++ b/MeoAssistance/AbstractTask.h @@ -60,6 +60,7 @@ namespace asst { virtual bool set_control_scale(int cur_width, int cur_height); virtual bool sleep(unsigned millisecond); virtual bool print_window(const std::string& dir); + virtual bool need_exit() const noexcept; std::shared_ptr m_window_ptr = nullptr; std::shared_ptr m_view_ptr = nullptr; diff --git a/MeoAssistance/Assistance.cpp b/MeoAssistance/Assistance.cpp index 5b24f293d0..d081e666ab 100644 --- a/MeoAssistance/Assistance.cpp +++ b/MeoAssistance/Assistance.cpp @@ -23,8 +23,9 @@ Assistance::Assistance(AsstCallback callback, void* callback_arg) DebugTraceFunction; // 检查返回值,若为false则回调错误 - auto callback_error = [&]() { + auto callback_error = [&](const std::string& filename = std::string()) { json::value callback_json; + callback_json["filename"] = filename; callback_json["what"] = "Resource"; m_callback(AsstMsg::InitFaild, callback_json, m_callback_arg); }; @@ -71,14 +72,14 @@ Assistance::Assistance(AsstCallback callback, void* callback_arg) for (const auto& [key, name] : InfrastConfiger::get_instance().m_oper_name_feat) { ret = m_identify_ptr->add_text_image(name, GetResourceDir() + "operators\\" + Utf8ToGbk(name) + ".png"); if (!ret) { - callback_error(); + callback_error(Utf8ToGbk(name)); return; } } for (const auto& name : InfrastConfiger::get_instance().m_oper_name_feat_whatever) { ret = m_identify_ptr->add_text_image(name, GetResourceDir() + "operators\\" + Utf8ToGbk(name) + ".png"); if (!ret) { - callback_error(); + callback_error(Utf8ToGbk(name)); return; } } @@ -255,7 +256,7 @@ bool asst::Assistance::start_to_identify_opers() auto task_ptr = std::make_shared(task_callback, (void*)this); // TODO 这个参数写到配置文件里,TODO 滑动位置要根据分辨率缩放 - task_ptr->set_swipe_param(Rect(2400, 800, 0, 0), Rect(400, 800, 0, 0), 2100); + task_ptr->set_swipe_param(Rect(800, 600, 0, 0), Rect(600, 600, 0, 0), 200); task_ptr->set_task_chain("IdentifyOpers"); m_tasks_queue.emplace(task_ptr); diff --git a/MeoAssistance/AsstDef.h b/MeoAssistance/AsstDef.h index b0205b0772..5b18ab8ba6 100644 --- a/MeoAssistance/AsstDef.h +++ b/MeoAssistance/AsstDef.h @@ -82,7 +82,7 @@ namespace asst { struct TextArea { TextArea() = default; TextArea(const TextArea&) = default; - TextArea(TextArea&&) = default; + TextArea(TextArea&&) noexcept = default; template TextArea(std::string text, RectArgs &&... rect_args) : text(std::move(text)), @@ -91,6 +91,9 @@ namespace asst { "Parameter can't be used to construct a asst::Rect"); } operator std::string() const { return text; } + TextArea& operator=(const TextArea&) = default; + TextArea& operator=(TextArea&&) noexcept = default; + std::string text; Rect rect; }; diff --git a/MeoAssistance/Identify.cpp b/MeoAssistance/Identify.cpp index 5229e6f1d6..af063c81e1 100644 --- a/MeoAssistance/Identify.cpp +++ b/MeoAssistance/Identify.cpp @@ -84,7 +84,7 @@ std::pair, cv::Mat> asst::Identify::surf_detect(const cv::Mat mat_gray; cv::cvtColor(mat, mat_gray, cv::COLOR_RGB2GRAY); - constexpr int min_hessian = 4000; + constexpr int min_hessian = 400; // SURF特征点检测 cv::Ptr detector = SURF::create(min_hessian); std::vector keypoints; @@ -103,12 +103,16 @@ std::optional asst::Identify::feature_match( #endif ) { + if (query_mat_vector.empty() || train_mat_vector.empty()) { + DebugTraceError("feature_match | image empty"); + return std::nullopt; + } std::vector matches; static FlannBasedMatcher matcher; matcher.match(query_mat_vector, train_mat_vector, matches); #ifdef LOG_TRACE - std::cout << matches.size() << " / " << query_keypoints.size() << std::endl; + //std::cout << matches.size() << " / " << query_keypoints.size() << std::endl; cv::Mat allmatch_mat; cv::drawMatches(query_mat, query_keypoints, train_mat, train_keypoints, matches, allmatch_mat); #endif @@ -210,7 +214,7 @@ std::optional asst::Identify::feature_match( #endif - constexpr static const double MatchSizeRatioThreshold = 0.075; + constexpr static const double MatchSizeRatioThreshold = 0.05; if (good_points.size() >= query_keypoints.size() * MatchSizeRatioThreshold) { Rect dst; int left = 0, right = 0, top = 0, bottom = 0; @@ -301,7 +305,7 @@ std::tuple Identify::find_image(const Mat& cu std::optional