From 543339777147b298406def1038681a3beb328df5 Mon Sep 17 00:00:00 2001 From: sui-feng-cb <2518179942@qq.com> Date: Tue, 23 Dec 2025 10:49:45 +0800 Subject: [PATCH] Upd: adjust template area for island storage items --- module/island/storage.py | 78 +++++++++++---------------------------- module/statistics/item.py | 5 ++- 2 files changed, 24 insertions(+), 59 deletions(-) diff --git a/module/island/storage.py b/module/island/storage.py index 86900b0c8..a0ba4b785 100644 --- a/module/island/storage.py +++ b/module/island/storage.py @@ -6,7 +6,7 @@ import module.config.server as server from module.base.button import ButtonGrid from module.base.decorator import cached_property, del_cached_property from module.base.timer import Timer -from module.base.utils import color_similar, color_similarity_2d, crop, rgb2gray, xywh2xyxy +from module.base.utils import color_similarity_2d, rgb2gray, xywh2xyxy from module.island.assets import * from module.island.data import DIC_ISLAND_ITEM from module.island.ui import IslandUI, ISLAND_STORAGE_SCROLL @@ -45,41 +45,8 @@ class StorageItem(Item): class StorageItemGrid(ItemGrid): item_class = StorageItem - def match_template(self, image, similarity=None): - """ - Match templates, try most frequent hit templates first. - - Args: - image (np.ndarray): - similarity (float): - - Returns: - str: Template name. - """ - if similarity is None: - similarity = self.similarity - color = cv2.mean(crop(image, self.template_area))[:3] - # Match frequently hit templates first - names = np.array(list(self.templates.keys()))[np.argsort(list(self.templates_hit.values()))][::-1] - # Match known templates first - names = [name for name in names if not name.isdigit()] + [name for name in names if name.isdigit()] - for name in names: - # threshold=5 to match items in same shape but with different colors - if color_similar(color1=color, color2=self.colors[name], threshold=5): - res = cv2.matchTemplate(image, self.templates[name], cv2.TM_CCOEFF_NORMED) - _, sim, _, _ = cv2.minMaxLoc(res) - if sim > similarity: - self.templates_hit[name] += 1 - return name - - self.next_template_index += 1 - name = str(self.next_template_index) - logger.info(f'New template: {name}') - image = crop(image, self.template_area) - self.colors[name] = cv2.mean(image)[:3] - self.templates[name] = image - self.templates_hit[name] = self.templates_hit.get(name, 0) + 1 - return name + def match_template(self, image, similarity=None, threshold=5): + return super().match_template(self, image, similarity=similarity, threshold=threshold) @staticmethod def item_id_parse(string): @@ -119,7 +86,7 @@ class IslandStorage(IslandUI): if rect[3] - rect[1] < 10: continue # Check item grid should be in the area - if rect[1] < 105: + if rect[1] < 93: continue bars.append(rect) bars = Points([(0., b[1]) for b in bars]).group(threshold=5) @@ -132,19 +99,16 @@ class IslandStorage(IslandUI): items are not loaded that fast, wait until any bar icon appears """ - timeout = Timer(1, count=3).start() - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + confirm_timer = Timer(1.5, count=3).start() + for _ in self.loop(skip_first=skip_first_screenshot): bars = self._get_bars() - - if timeout.reached(): - break if len(bars): - break + if confirm_timer.reached(): + return + else: + pass + else: + confirm_timer.reset() @cached_property def storage_grid(self): @@ -159,29 +123,29 @@ class IslandStorage(IslandUI): count = len(bars) if count == 0: logger.warning('Unable to find bar icon, assume task list is at top') - origin_y = 157 + origin_y = 169 delta_y = 167 row = 2 elif count == 1: y_list = bars[:, 1] - # -105 to adjust the bar position to grid position - origin_y = y_list[0] - 105 + 135 + # -93 to adjust the bar position to grid position + origin_y = y_list[0] - 93 + 135 delta_y = 167 row = 1 elif count == 2: y_list = bars[:, 1] - origin_y = min(y_list) - 105 + 135 + origin_y = min(y_list) - 93 + 135 delta_y = abs(y_list[1] - y_list[0]) row = 2 else: logger.warning(f'Too many bars found ({count}), assume max rows') y_list = bars[:, 1] - origin_y = min(y_list) - 105 + 135 + origin_y = min(y_list) - 93 + 135 delta_y = abs(y_list[1] - y_list[0]) row = 2 storage_grid = ButtonGrid( - origin=(303, origin_y), delta=(142, delta_y), - button_shape=(102, 102), grid_shape=(6, row), + origin=(321, origin_y), delta=(142, delta_y), + button_shape=(64, 64), grid_shape=(6, row), name='STORAGE_ITEM_GRID' ) return storage_grid @@ -198,8 +162,8 @@ class IslandStorage(IslandUI): storage_items = StorageItemGrid( storage_grid, templates={}, - template_area=(0, 15, 96, 80), - amount_area=(36, 85, 95, 102), + template_area=(0, 0, 64, 54), + amount_area=(18, 74, 77, 91), ) storage_items.load_template_folder(self.storage_template_folder) storage_items.amount_ocr = AMOUNT_OCR diff --git a/module/statistics/item.py b/module/statistics/item.py index ceff8a177..5050528cc 100644 --- a/module/statistics/item.py +++ b/module/statistics/item.py @@ -217,13 +217,14 @@ class ItemGrid: self.next_cost_template_index += 1 self.next_cost_template_index = max(self.next_cost_template_index, max_digit + 1) - def match_template(self, image, similarity=None): + def match_template(self, image, similarity=None, threshold=30): """ Match templates, try most frequent hit templates first. Args: image (np.ndarray): similarity (float): + threshold (int): Returns: str: Template name. @@ -236,7 +237,7 @@ class ItemGrid: # Match known templates first names = [name for name in names if not name.isdigit()] + [name for name in names if name.isdigit()] for name in names: - if color_similar(color1=color, color2=self.colors[name], threshold=30): + if color_similar(color1=color, color2=self.colors[name], threshold=threshold): res = cv2.matchTemplate(image, self.templates[name], cv2.TM_CCOEFF_NORMED) _, sim, _, _ = cv2.minMaxLoc(res) if sim > similarity: