From 4da677a0846d9f394c020c925500a447337b9bbb Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sun, 15 Sep 2024 02:16:39 +0800 Subject: [PATCH] Fix: [EN] OCR on SoulGladScorchsandAuditionVenue --- module/ocr/utils.py | 41 +++++++++++++++++++++++++++++++++++++++ tasks/base/main_page.py | 4 ++++ tasks/dungeon/ui/llist.py | 15 +++++++++++++- 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/module/ocr/utils.py b/module/ocr/utils.py index ed6701e80..f05cc181b 100644 --- a/module/ocr/utils.py +++ b/module/ocr/utils.py @@ -51,6 +51,47 @@ def _merge_boxed_result(left: BoxedResult, right: BoxedResult) -> BoxedResult: return left +def merge_result_button( + results: list[BoxedResult], + left_func: callable, + right_func: callable, + text_func: callable +) -> list[BoxedResult]: + """ + Args: + results: + left_func: Function that inputs ocr_text (str) and outputs bool + True means mark as left text + right_func: + text_func: Function that inputs left_text (str) right_text (str) and outputs text (str) + """ + left = None + right = None + for result in results: + if left_func(result.ocr_text): + left = result + elif right_func(result.ocr_text): + right = result + + text = text_func( + left.ocr_text if left is not None else '', + right.ocr_text if right is not None else '' + ) + if left is not None: + if right is not None: + results.remove(right) + left.box = _merge_area(left.box, right.box) + left.ocr_text = text + else: + left.ocr_text = text + else: + if right is not None: + right.ocr_text = text + else: + pass + return results + + def merge_buttons(buttons: list[BoxedResult], thres_x=20, thres_y=20) -> list[BoxedResult]: """ Args: diff --git a/tasks/base/main_page.py b/tasks/base/main_page.py index aa21d14a9..781bc0f7a 100644 --- a/tasks/base/main_page.py +++ b/tasks/base/main_page.py @@ -23,6 +23,10 @@ class OcrPlaneName(OcrWhiteLetterOnComplexBackground): result = result.replace('avatia', 'avalia') # 苏乐达™热砂海选会场 result = re.sub(r'(苏乐达|蘇樂達|SoulGlad|スラーダ|FelizAlma)[rtT]*M*', r'\1', result) + # SoulGladtM Scorchsand Audition Ven + if 'Audition' in result: + right = result.find('Audition') + len('Audition') + result = result[:right] + ' Venue' # 幽囚狱 result = result.replace('幽因狱', '幽囚狱') result = result.replace('幽因獄', '幽囚獄') diff --git a/tasks/dungeon/ui/llist.py b/tasks/dungeon/ui/llist.py index e49c02d59..f35eac294 100644 --- a/tasks/dungeon/ui/llist.py +++ b/tasks/dungeon/ui/llist.py @@ -1,4 +1,5 @@ import re +from copy import copy import cv2 from pponnxcr.predict_system import BoxedResult @@ -10,7 +11,7 @@ from module.base.timer import Timer from module.base.utils import area_center, area_limit, area_offset, crop, image_size from module.logger import logger from module.ocr.ocr import Ocr, OcrResultButton -from module.ocr.utils import split_and_pair_button_attr, split_and_pair_buttons +from module.ocr.utils import merge_result_button, split_and_pair_button_attr, split_and_pair_buttons from module.ui.draggable_list import DraggableList from module.ui.switch import Switch from tasks.base.page import page_guide @@ -40,6 +41,7 @@ class OcrDungeonName(Ocr): # 苏乐达™热砂海选会场 result = re.sub(r'(苏乐达|蘇樂達|SoulGlad|スラーダ|FelizAlma)[rtT]*M*', r'\1', result) result = re.sub(r'["\']', '', result) + result = re.sub('Aud[it]+on', 'Audition', result) result = super().after_process(result) @@ -106,6 +108,17 @@ class OcrDungeonList(OcrDungeonName): else: result.box = area_offset(result.box, offset=OCR_DUNGEON_NAME.area[:2]) + before = copy(results) + # Calyx_Crimson_The_Hunt_Penacony_SoulGladScorchsandAuditionVenue + merge_result_button( + results, + left_func=lambda x: 'Audition' in x, + right_func=lambda x: 'Venue' in x, + text_func=lambda l, r: f'SoulGladScorchsandAuditionVenue' + ) + if results != before: + logger.attr(name=self.name, + text=str([result.ocr_text for result in results])) return results def _match_result(self, *args, **kwargs):