fix: change tongbao name OCR to fit oversea (#15129)

* fix: 移除通宝已投出硬编码

* fix: 添加左侧列通宝名称识别OCR任务

* fix: 加长通宝名称识别的ROI

* fix: apply suggestion

* chore: increase pickupOCR ROI (from JP)

* fix: increase ExchangeNameOCR ROI to max

---------

Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com>
This commit is contained in:
travellerse
2025-12-19 21:32:12 +08:00
committed by GitHub
parent 0f25d34076
commit 415fb7d8fc
2 changed files with 27 additions and 5 deletions

View File

@@ -177,7 +177,12 @@
"JieGarden@Roguelike@CoppersAnalyzer-ExchangeNameOCR": {
"Doc": "通宝名称识别 - EXCHANGE 模式 - 通宝已投出识别用 roi 为 通宝类型 的 Rect.move(me.roi)",
"baseTask": "JieGarden@Roguelike@CoppersNameOcrReplace",
"roi": [29, -5, 160, 40]
"roi": [29, -5, 240, 40]
},
"JieGarden@Roguelike@CoppersAnalyzer-LeftNameOCR": {
"Doc": "通宝名称识别 - 左侧列专用OCR - EXCHANGE 模式",
"baseTask": "JieGarden@Roguelike@CoppersNameOcrReplace",
"roi": [29, -5, 170, 40]
},
"JieGarden@Roguelike@CoppersAnalyzer-LeftType": {
"Doc": "通宝类型识别 - 左侧新拾取通宝区域 (EXCHANGE 模式)",
@@ -192,7 +197,7 @@
"JieGarden@Roguelike@CoppersAnalyzer-PickupNameOCR": {
"Doc": "通宝名称识别 - PICKUP 模式 - 通宝已投出识别用 roi 为 通宝类型 的 Rect.move(me.roi)",
"baseTask": "JieGarden@Roguelike@CoppersNameOcrReplace",
"roi": [0, -209, 167, 37]
"roi": [-29, -209, 218, 37]
},
"JieGarden@Roguelike@CoppersAnalyzer-RightType": {
"Doc": "通宝类型识别 - 最右侧列区域",

View File

@@ -17,6 +17,7 @@ namespace
constexpr std::string_view kPickupMatcherTask = "JieGarden@Roguelike@GetDropSwitch";
constexpr std::string_view kPickupNameTask = "JieGarden@Roguelike@CoppersAnalyzer-PickupNameOCR";
constexpr std::string_view kExchangeNameTask = "JieGarden@Roguelike@CoppersAnalyzer-ExchangeNameOCR";
constexpr std::string_view kExchangeMatcherTask = "JieGarden@Roguelike@CoppersAnalyzer-LeftNameOCR";
constexpr std::string_view kCastTask = "JieGarden@Roguelike@CoppersAnalyzer-CastOCR";
constexpr std::string_view kLeftColumnMatcherTask = "JieGarden@Roguelike@CoppersAnalyzer-LeftType";
constexpr std::string_view kMiddleColumnMatcherTask = "JieGarden@Roguelike@CoppersAnalyzer-Type";
@@ -62,9 +63,21 @@ bool RoguelikeCoppersAnalyzer::analyze_column(ColumnRole role, bool detect_cast)
{
LogTraceFunction;
const auto name_task = Task.get<OcrTaskInfo>(kExchangeNameTask);
// 根据列角色选择适当的OCR任务
std::string_view ocr_task_name;
switch (role) {
case ColumnRole::Leftmost:
ocr_task_name = kExchangeMatcherTask;
break;
case ColumnRole::Middle:
case ColumnRole::Rightmost:
ocr_task_name = kExchangeNameTask;
break;
}
const auto name_task = Task.get<OcrTaskInfo>(ocr_task_name);
if (!name_task) {
Log.error(__FUNCTION__, "| failed to load exchange name OCR task");
Log.error(__FUNCTION__, "| failed to load OCR task:", ocr_task_name);
return false;
}
@@ -88,6 +101,7 @@ bool RoguelikeCoppersAnalyzer::analyze_column(ColumnRole role, bool detect_cast)
}
const bool analyzed = analyze_internal(matcher_task, *name_task, cast_task.get(), SortStrategy::Vertical);
if (!analyzed) {
Log.error(__FUNCTION__, "| failed to analyze column ", to_string(role));
}
@@ -185,7 +199,10 @@ bool RoguelikeCoppersAnalyzer::analyze_internal(
const auto& cast_result = cast_ocr.get_result();
detection.cast_score = cast_result.score;
detection.cast_recognized = !cast_result.text.empty();
detection.is_cast = cast_result.text.find("已投出") != std::string::npos;
detection.is_cast =
std::any_of(cast_task->text.begin(), cast_task->text.end(), [&](const std::string& t) {
return cast_result.text.find(t) != std::string::npos;
});
}
}