From 069db100ef8eec5211d59b6d73e7366ef8f99b36 Mon Sep 17 00:00:00 2001 From: Yifan Liu Date: Mon, 20 Feb 2023 23:02:15 -0600 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B6=89=E5=8F=8A=E5=B9=B2=E5=91=98?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E7=9A=84ocrReplace=E6=9B=B4=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E6=9B=BF=E6=8D=A2=E6=95=B4=E4=B8=AAstr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 比如["name", "名字"],"name~"原来会被替换成"名字~",现在则是"名字" --- src/MaaCore/Task/BattleHelper.cpp | 2 +- .../Task/Infrast/InfrastAbstractTask.cpp | 6 ++-- .../Task/Infrast/InfrastProductionTask.cpp | 4 +-- .../Miscellaneous/BattleFormationTask.cpp | 4 +-- src/MaaCore/Vision/OcrImageAnalyzer.cpp | 30 ++++++++++++++----- src/MaaCore/Vision/OcrImageAnalyzer.h | 4 ++- .../RoguelikeRecruitImageAnalyzer.cpp | 2 +- .../RoguelikeSkillSelectionImageAnalyzer.cpp | 2 +- 8 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/MaaCore/Task/BattleHelper.cpp b/src/MaaCore/Task/BattleHelper.cpp index 206278f09a..335cf0b8c4 100644 --- a/src/MaaCore/Task/BattleHelper.cpp +++ b/src/MaaCore/Task/BattleHelper.cpp @@ -191,7 +191,7 @@ bool asst::BattleHelper::update_deployment(bool init, const cv::Mat& reusable) auto analyze = [&](OcrImageAnalyzer& name_analyzer) { name_analyzer.set_image(name_image); name_analyzer.set_task_info(oper_name_ocr_task_name()); - name_analyzer.set_replace(Task.get("CharsNameOcrReplace")->replace_map); + name_analyzer.set_replace(Task.get("CharsNameOcrReplace")->replace_map, true); if (!name_analyzer.analyze()) { return std::string(); } diff --git a/src/MaaCore/Task/Infrast/InfrastAbstractTask.cpp b/src/MaaCore/Task/Infrast/InfrastAbstractTask.cpp index 224d62cac4..e85e9528fa 100644 --- a/src/MaaCore/Task/Infrast/InfrastAbstractTask.cpp +++ b/src/MaaCore/Task/Infrast/InfrastAbstractTask.cpp @@ -275,7 +275,7 @@ bool asst::InfrastAbstractTask::select_opers_review(infrast::CustomRoomConfig co const auto& ocr_replace = Task.get("CharsNameOcrReplace")->replace_map; for (const auto& oper : oper_analyzer_res) { OcrWithPreprocessImageAnalyzer name_analyzer; - name_analyzer.set_replace(ocr_replace); + name_analyzer.set_replace(ocr_replace, true); name_analyzer.set_image(oper.name_img); name_analyzer.set_expansion(0); if (!name_analyzer.analyze()) { @@ -330,7 +330,7 @@ bool asst::InfrastAbstractTask::select_custom_opers(std::vector& pa const auto& ocr_replace = Task.get("CharsNameOcrReplace")->replace_map; for (const auto& oper : oper_analyzer.get_result()) { OcrWithPreprocessImageAnalyzer name_analyzer; - name_analyzer.set_replace(ocr_replace); + name_analyzer.set_replace(ocr_replace, true); name_analyzer.set_image(oper.name_img); name_analyzer.set_expansion(0); if (!name_analyzer.analyze()) { @@ -387,7 +387,7 @@ void asst::InfrastAbstractTask::order_opers_selection(const std::vector page_result; for (const auto& oper : oper_analyzer.get_result()) { OcrWithPreprocessImageAnalyzer name_analyzer; - name_analyzer.set_replace(ocr_replace); + name_analyzer.set_replace(ocr_replace, true); name_analyzer.set_image(oper.name_img); name_analyzer.set_expansion(0); if (!name_analyzer.analyze()) { diff --git a/src/MaaCore/Task/Infrast/InfrastProductionTask.cpp b/src/MaaCore/Task/Infrast/InfrastProductionTask.cpp index a5393a0a54..2da803f478 100644 --- a/src/MaaCore/Task/Infrast/InfrastProductionTask.cpp +++ b/src/MaaCore/Task/Infrast/InfrastProductionTask.cpp @@ -447,7 +447,7 @@ bool asst::InfrastProductionTask::optimal_calc() } else { OcrWithPreprocessImageAnalyzer name_analyzer(find_iter->name_img); - name_analyzer.set_replace(Task.get("CharsNameOcrReplace")->replace_map); + name_analyzer.set_replace(Task.get("CharsNameOcrReplace")->replace_map, true); Log.trace("Analyze name filter"); if (!name_analyzer.analyze()) { continue; @@ -574,7 +574,7 @@ bool asst::InfrastProductionTask::opers_choose() } else { OcrWithPreprocessImageAnalyzer name_analyzer(lhs.name_img); - name_analyzer.set_replace(Task.get("CharsNameOcrReplace")->replace_map); + name_analyzer.set_replace(Task.get("CharsNameOcrReplace")->replace_map, true); Log.trace("Analyze name filter"); if (!name_analyzer.analyze()) { return false; diff --git a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp index ef9376c90f..de823c58c0 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp +++ b/src/MaaCore/Task/Miscellaneous/BattleFormationTask.cpp @@ -133,12 +133,12 @@ std::vector asst::BattleFormationTask::analyzer_opers() OcrWithFlagTemplImageAnalyzer name_analyzer(image); name_analyzer.set_task_info("BattleQuickFormation-OperNameFlag", "BattleQuickFormationOCR"); - name_analyzer.set_replace(ocr_replace); + name_analyzer.set_replace(ocr_replace, true); name_analyzer.analyze(); OcrWithFlagTemplImageAnalyzer special_focus_analyzer(image); special_focus_analyzer.set_task_info("BattleQuickFormation-OperNameFlag-SpecialFocus", "BattleQuickFormationOCR"); - special_focus_analyzer.set_replace(ocr_replace); + special_focus_analyzer.set_replace(ocr_replace, true); special_focus_analyzer.analyze(); auto opers_result = name_analyzer.get_result(); diff --git a/src/MaaCore/Vision/OcrImageAnalyzer.cpp b/src/MaaCore/Vision/OcrImageAnalyzer.cpp index dbb9f439d7..88ac48104a 100644 --- a/src/MaaCore/Vision/OcrImageAnalyzer.cpp +++ b/src/MaaCore/Vision/OcrImageAnalyzer.cpp @@ -16,13 +16,26 @@ bool asst::OcrImageAnalyzer::analyze() std::vector preds_vec; if (!m_replace.empty()) { - TextRectProc text_replace = [&](TextRect& tr) -> bool { - for (const auto& [regex, new_str] : m_replace) { - tr.text = std::regex_replace(tr.text, std::regex(regex), new_str); - } - return true; - }; - preds_vec.emplace_back(text_replace); + if (m_replace_full) { + TextRectProc text_replace = [&](TextRect& tr) -> bool { + for (const auto& [regex, new_str] : m_replace) { + if (std::regex_search(tr.text, std::regex(regex))) { + tr.text = new_str; + } + } + return true; + }; + preds_vec.emplace_back(text_replace); + } + else { + TextRectProc text_replace = [&](TextRect& tr) -> bool { + for (const auto& [regex, new_str] : m_replace) { + tr.text = std::regex_replace(tr.text, std::regex(regex), new_str); + } + return true; + }; + preds_vec.emplace_back(text_replace); + } } if (!m_required.empty()) { @@ -96,9 +109,10 @@ void asst::OcrImageAnalyzer::set_required(std::vector required) noe m_required = std::move(required); } -void asst::OcrImageAnalyzer::set_replace(std::unordered_map replace) noexcept +void asst::OcrImageAnalyzer::set_replace(std::unordered_map replace, bool replace_full) noexcept { m_replace = std::move(replace); + m_replace_full = replace_full; } void asst::OcrImageAnalyzer::set_task_info(OcrTaskInfo task_info) noexcept diff --git a/src/MaaCore/Vision/OcrImageAnalyzer.h b/src/MaaCore/Vision/OcrImageAnalyzer.h index ad817a3093..c37e13354f 100644 --- a/src/MaaCore/Vision/OcrImageAnalyzer.h +++ b/src/MaaCore/Vision/OcrImageAnalyzer.h @@ -25,7 +25,8 @@ namespace asst virtual void sort_result_by_required(); // 按传入的需求数组排序,传入的在前面结果接在前面 void set_required(std::vector required) noexcept; - void set_replace(std::unordered_map replace) noexcept; + void set_replace(std::unordered_map replace, bool replace_full = false) noexcept; // The whole string is replaced when replace_full is set to true, + // while only the matched part is replaced when it is set to false virtual void set_task_info(std::shared_ptr task_ptr); virtual void set_task_info(const std::string& task_name); @@ -45,6 +46,7 @@ namespace asst std::vector m_required; bool m_full_match = false; std::unordered_map m_replace; + bool m_replace_full = false; TextRectProc m_pred = nullptr; bool m_without_det = false; bool m_use_cache = false; diff --git a/src/MaaCore/Vision/Roguelike/RoguelikeRecruitImageAnalyzer.cpp b/src/MaaCore/Vision/Roguelike/RoguelikeRecruitImageAnalyzer.cpp index d299ca5d2c..52ca1209fa 100644 --- a/src/MaaCore/Vision/Roguelike/RoguelikeRecruitImageAnalyzer.cpp +++ b/src/MaaCore/Vision/Roguelike/RoguelikeRecruitImageAnalyzer.cpp @@ -12,7 +12,7 @@ bool asst::RoguelikeRecruitImageAnalyzer::analyze() OcrWithFlagTemplImageAnalyzer analyzer(m_image); analyzer.set_task_info("RoguelikeRecruitOcrFlag", "RoguelikeRecruitOcr"); - analyzer.set_replace(Task.get("CharsNameOcrReplace")->replace_map); + analyzer.set_replace(Task.get("CharsNameOcrReplace")->replace_map, true); analyzer.set_threshold(Task.get("RoguelikeRecruitOcr")->specific_rect.x); if (!analyzer.analyze()) { diff --git a/src/MaaCore/Vision/Roguelike/RoguelikeSkillSelectionImageAnalyzer.cpp b/src/MaaCore/Vision/Roguelike/RoguelikeSkillSelectionImageAnalyzer.cpp index 5c8a7730af..2c1ecca7e4 100644 --- a/src/MaaCore/Vision/Roguelike/RoguelikeSkillSelectionImageAnalyzer.cpp +++ b/src/MaaCore/Vision/Roguelike/RoguelikeSkillSelectionImageAnalyzer.cpp @@ -54,7 +54,7 @@ std::string asst::RoguelikeSkillSelectionImageAnalyzer::name_analyze(const Rect& analyzer.set_task_info(name_task_ptr); analyzer.set_image(m_image); analyzer.set_roi(roi.move(name_task_ptr->roi)); - analyzer.set_replace(std::dynamic_pointer_cast(Task.get("CharsNameOcrReplace"))->replace_map); + analyzer.set_replace(std::dynamic_pointer_cast(Task.get("CharsNameOcrReplace"))->replace_map, true); if (!analyzer.analyze()) { return {};