From 56983880d0dcd2e52e7d096feee811cbe5fe1575 Mon Sep 17 00:00:00 2001 From: MistEO Date: Fri, 3 Jun 2022 01:30:58 +0800 Subject: [PATCH] =?UTF-8?q?fix.=E4=BF=AE=E5=A4=8D=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E8=82=89=E9=B8=BD=E9=97=AA=E9=80=80=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/669 --- src/MeoAssistant/MatchImageAnalyzer.cpp | 4 ++-- src/MeoAssistant/OcrImageAnalyzer.cpp | 19 +++++++++++++++++++ .../RoguelikeSkillSelectionImageAnalyzer.cpp | 7 +++++++ src/MeoAssistant/RoguelikeTask.cpp | 2 +- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/MeoAssistant/MatchImageAnalyzer.cpp b/src/MeoAssistant/MatchImageAnalyzer.cpp index 59501be71e..6b8b38fc7e 100644 --- a/src/MeoAssistant/MatchImageAnalyzer.cpp +++ b/src/MeoAssistant/MatchImageAnalyzer.cpp @@ -98,8 +98,6 @@ void asst::MatchImageAnalyzer::set_task_info(MatchTaskInfo task_info) noexcept } bool asst::MatchImageAnalyzer::match_templ(const cv::Mat templ) { - cv::Mat matched; - if (m_roi.x < 0) { Log.info("roi is out of range", m_roi.to_string()); m_roi.x = 0; @@ -124,6 +122,8 @@ bool asst::MatchImageAnalyzer::match_templ(const cv::Mat templ) "templ size:", templ.cols, templ.rows); return false; } + + cv::Mat matched; if (m_mask_range.first == 0 && m_mask_range.second == 0) { cv::matchTemplate(image_roi, templ, matched, cv::TM_CCOEFF_NORMED); } diff --git a/src/MeoAssistant/OcrImageAnalyzer.cpp b/src/MeoAssistant/OcrImageAnalyzer.cpp index 477d1d9367..7e6a7e5753 100644 --- a/src/MeoAssistant/OcrImageAnalyzer.cpp +++ b/src/MeoAssistant/OcrImageAnalyzer.cpp @@ -9,6 +9,8 @@ bool asst::OcrImageAnalyzer::analyze() { + LogTraceFunction; + m_ocr_result.clear(); std::vector preds_vec; @@ -67,6 +69,23 @@ bool asst::OcrImageAnalyzer::analyze() } } if (need_local) { + if (m_roi.x < 0) { + Log.info("roi is out of range", m_roi.to_string()); + m_roi.x = 0; + } + if (m_roi.y < 0) { + Log.info("roi is out of range", m_roi.to_string()); + m_roi.y = 0; + } + if (m_roi.x + m_roi.width > m_image.cols) { + Log.info("roi is out of range", m_roi.to_string()); + m_roi.width = m_image.cols - m_roi.x; + } + if (m_roi.y + m_roi.height > m_image.rows) { + Log.info("roi is out of range", m_roi.to_string()); + m_roi.height = m_image.rows - m_roi.y; + } + m_ocr_result = Resrc.ocr().recognize(m_image, m_roi, all_pred, m_without_det); } //log.trace("ocr result", m_ocr_result); diff --git a/src/MeoAssistant/RoguelikeSkillSelectionImageAnalyzer.cpp b/src/MeoAssistant/RoguelikeSkillSelectionImageAnalyzer.cpp index 58118f14fc..6c7d0140a9 100644 --- a/src/MeoAssistant/RoguelikeSkillSelectionImageAnalyzer.cpp +++ b/src/MeoAssistant/RoguelikeSkillSelectionImageAnalyzer.cpp @@ -18,6 +18,13 @@ bool asst::RoguelikeSkillSelectionImageAnalyzer::analyze() const auto& flags = flag_analyzer.get_result(); + if (flags.size() > 13) { + // https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/669 + // 不知道为什么会匹配出来一堆结果,得分完全相同,坐标间隔还特别有规律。这种情况直接报错然后重试 + Log.error("Too many flags"); + return false; + } + int unknow_index = 0; for (const auto& flag : flags) { std::string name = name_analyze(flag.rect); diff --git a/src/MeoAssistant/RoguelikeTask.cpp b/src/MeoAssistant/RoguelikeTask.cpp index 19a285cb92..de8d86f154 100644 --- a/src/MeoAssistant/RoguelikeTask.cpp +++ b/src/MeoAssistant/RoguelikeTask.cpp @@ -24,7 +24,7 @@ asst::RoguelikeTask::RoguelikeTask(AsstCallback callback, void* callback_arg) m_recruit_task_ptr->set_retry_times(2); m_skill_task_ptr = m_roguelike_task_ptr->regiseter_plugin(); - m_skill_task_ptr->set_retry_times(0); + m_skill_task_ptr->set_retry_times(3); // 这个任务如果卡住会放弃当前的肉鸽并重新开始,所以多添加一点。先这样凑合用 for (int i = 0; i != 10000; ++i) {