From a9ca38e812363efdcb70c08c2c907469db456e25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20W=C3=B6lfer?= Date: Sun, 5 Jul 2020 13:42:14 +0200 Subject: [PATCH] Refactoring --- 16_10_conf.zip | Bin 0 -> 73321 bytes .../card_detection/adjustment.py | 56 +++++++----------- .../card_detection/board_parser.py | 40 +------------ .../card_detection/card_finder.py | 3 +- tools/feature_extraction.py | 6 +- tools/generate/all_borders.py | 35 ++++++----- tools/generate/catalogue.py | 9 ++- tools/to_json.py | 10 +++- 8 files changed, 59 insertions(+), 100 deletions(-) create mode 100644 16_10_conf.zip diff --git a/16_10_conf.zip b/16_10_conf.zip new file mode 100644 index 0000000000000000000000000000000000000000..3c454ba438033dbf4df36fbf51d77db5b0d09af0 GIT binary patch literal 73321 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 z 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 z�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 Tuple[int, int, int, int]: """Get one square from index and adjustment""" return ( - adjustment.x + adjustment.dx * index_x, - adjustment.y + adjustment.dy * index_y, - adjustment.x + adjustment.w + adjustment.dx * index_x, - adjustment.y + adjustment.h + adjustment.dy * index_y, + math.floor(adjustment.x + adjustment.dx * index_x), + math.floor(adjustment.y + adjustment.dy * index_y), + math.floor(adjustment.x + adjustment.w + adjustment.dx * index_x), + math.floor(adjustment.y + adjustment.h + adjustment.dy * index_y), ) @@ -41,9 +42,10 @@ def adjust_squares( if not adjustment: adjustment = Adjustment(w=10, h=10) - high_speed = False + speed_mod = "n" + speed_mods = ["n", "s", "h"] - def _adjustment_step(keycode: int, high_speed: bool) -> None: + def _adjustment_step(keycode: int, speed_mod: str) -> None: assert adjustment is not None x_keys = {104: -1, 115: +1} y_keys = {116: -1, 110: +1} @@ -51,8 +53,8 @@ def adjust_squares( h_keys = {111: -1, 101: +1} dx_keys = {59: -1, 112: +1} dy_keys = {44: -1, 46: +1} - high_speed_fac = 10 - cur_high_speed_fac = high_speed_fac if high_speed else 1 + speed_facs = {"n": 1, "s": 8, "h": 64} + cur_high_speed_fac = speed_facs[speed_mod] if keycode in x_keys: adjustment.x += x_keys[keycode] * cur_high_speed_fac elif keycode in y_keys: @@ -62,9 +64,10 @@ def adjust_squares( elif keycode in h_keys: adjustment.h += h_keys[keycode] * cur_high_speed_fac elif keycode in dx_keys: - adjustment.dx += dx_keys[keycode] * cur_high_speed_fac + adjustment.dx += dx_keys[keycode] * cur_high_speed_fac * 1 / 8 elif keycode in dy_keys: - adjustment.dy += dy_keys[keycode] * cur_high_speed_fac + adjustment.dy += dy_keys[keycode] * cur_high_speed_fac * 1 / 8 + cv2.namedWindow("Window", flags=cv2.WINDOW_NORMAL) while True: @@ -72,7 +75,10 @@ def adjust_squares( for index_x, index_y in itertools.product(range(count_x), range(count_y)): square = get_square(adjustment, index_x, index_y) cv2.rectangle( - working_image, (square[0], square[1]), (square[2], square[3]), (0, 0, 0) + working_image, + (math.floor(square[0]), math.floor(square[1])), + (math.floor(square[2]), math.floor(square[3])), + (0, 0, 0), ) cv2.imshow("Window", working_image) keycode = cv2.waitKey(0) @@ -80,29 +86,9 @@ def adjust_squares( if keycode == 27: break if keycode == 229: - high_speed = not high_speed + speed_mod = speed_mods[(speed_mods.index(speed_mod) + 1) % len(speed_mods)] continue - _adjustment_step(keycode, high_speed) + _adjustment_step(keycode, speed_mod) cv2.destroyWindow("Window") return adjustment - - -def adjust_field(image: numpy.ndarray) -> Adjustment: - """Open configuration grid for the field""" - return adjust_squares(image, 8, 13, Adjustment(42, 226, 15, 15, 119, 24)) - - -def adjust_bunker(image: numpy.ndarray) -> Adjustment: - """Open configuration grid for the bunker""" - return adjust_squares(image, 3, 1) - - -def adjust_hua(image: numpy.ndarray) -> Adjustment: - """Open configuration grid for the flower card""" - return adjust_squares(image, 1, 1) - - -def adjust_goal(image: numpy.ndarray) -> Adjustment: - """Open configuration grid for the goal""" - return adjust_squares(image, 3, 1) diff --git a/shenzhen_solitaire/card_detection/board_parser.py b/shenzhen_solitaire/card_detection/board_parser.py index 6efe58f..c92374d 100644 --- a/shenzhen_solitaire/card_detection/board_parser.py +++ b/shenzhen_solitaire/card_detection/board_parser.py @@ -235,42 +235,4 @@ def parse_start_board(image: np.ndarray, conf: Configuration) -> Board: result.flower_gone = parse_hua(image, conf) result.bunker = [None] * 3 result.goal = parse_goal(image, conf) - return result - - -def field_card_to_str(card: Card): - if card == SpecialCard.Hua: - return "Hua" - if isinstance(card, SpecialCard): - return {"Special": card.name} - elif isinstance(card, NumberCard): - return {"Number": {"value": card.number, "suit": card.suit.name}} - - -def bunker_card_to_str(card: Union[Tuple[SpecialCard, int], Optional[Card]]): - if card is None: - return "Empty" - if isinstance(card, tuple): - return {"Blocked": card[0].name} - return {"Stashed": field_card_to_str(card)} - - -def goal_card_to_str(card: Optional[NumberCard]): - if card is None: - return None - return {"value": card.number, "suit": card.suit.name} - - -def parse_to_json(image: np.ndarray, conf: Configuration) -> str: - field = parse_field(image, conf) - flower_gone = parse_hua(image, conf) - bunker = parse_bunker(image, conf) - goal = parse_goal(image, conf) - - mystruct = { - "field": [[field_card_to_str(card) for card in row] for row in field], - "hua_set": flower_gone, - "bunker": [bunker_card_to_str(card) for card in bunker], - "goal": [goal_card_to_str(card) for card in goal], - } - return json.dumps(mystruct) + return result \ No newline at end of file diff --git a/shenzhen_solitaire/card_detection/card_finder.py b/shenzhen_solitaire/card_detection/card_finder.py index 99b9fb3..e705577 100644 --- a/shenzhen_solitaire/card_detection/card_finder.py +++ b/shenzhen_solitaire/card_detection/card_finder.py @@ -32,7 +32,6 @@ def get_field_squares( def catalogue_cards(squares: List[np.ndarray]) -> List[Tuple[np.ndarray, Card]]: """Run manual cataloging for given squares""" cv2.namedWindow("Catalogue", cv2.WINDOW_NORMAL) - cv2.waitKey(1) result: List[Tuple[np.ndarray, Card]] = [] print("Card ID is [B]ai, [Z]hong, [F]a, [H]ua, [R]ed, [G]reen, [B]lack") print("Numbercard e.g. R3") @@ -51,7 +50,7 @@ def catalogue_cards(squares: List[np.ndarray]) -> List[Tuple[np.ndarray, Card]]: for square in squares: while True: cv2.imshow("Catalogue", cv2.resize(square, (500, 500))) - cv2.waitKey(1) + cv2.waitKey(100) card_id = input("Card ID:").lower() card_type: Optional[Card] = None if len(card_id) == 1: diff --git a/tools/feature_extraction.py b/tools/feature_extraction.py index 224dcf0..d7e9654 100644 --- a/tools/feature_extraction.py +++ b/tools/feature_extraction.py @@ -26,9 +26,7 @@ def prepare_image(image: np.array) -> np.array: def get_contour(image: np.array) -> np.array: gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) - ret, edge_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY_INV) - kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3)) - edge_image = cv2.morphologyEx(edge_image, cv2.MORPH_CLOSE, kernel) + ret, edge_image = cv2.threshold(gray_image, 140, 255, cv2.THRESH_BINARY_INV) border_image(edge_image, size=1) contours, hierarchy = cv2.findContours( edge_image, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE @@ -123,7 +121,7 @@ def main() -> None: pc = configuration.load("test_config.zip") laptop = configuration.load("laptop_conf.zip") bla = [(i, t) for i, t in pc.catalogue if t == SpecialCard.Hua] - bla = pc.catalogue + # bla = pc.catalogue for pc_image, pc_card_type in bla: debug_match(pc_image, pc_card_type, laptop.catalogue) diff --git a/tools/generate/all_borders.py b/tools/generate/all_borders.py index f9d7fe7..d711356 100644 --- a/tools/generate/all_borders.py +++ b/tools/generate/all_borders.py @@ -2,6 +2,7 @@ import argparse import copy import dataclasses import json +import math import os import cv2 @@ -48,28 +49,31 @@ def main() -> None: conf.field_adjustment = adjustment.adjust_squares( image, count_x=8, count_y=13, adjustment=copy.deepcopy(conf.field_adjustment) ) - print("Field borders") - conf.border_adjustment = adjustment.adjust_squares( - image, count_x=8, count_y=13, adjustment=copy.deepcopy(conf.field_adjustment) - ) - for adj in (conf.bunker_adjustment, conf.goal_adjustment,conf.hua_adjustment): + for adj in ( + conf.bunker_adjustment, + conf.goal_adjustment, + conf.hua_adjustment, + conf.border_adjustment, + ): adj.w = conf.field_adjustment.w adj.h = conf.field_adjustment.h adj.dx = conf.field_adjustment.dx adj.dy = conf.field_adjustment.dy + print("Field borders") + conf.border_adjustment = adjustment.adjust_squares( + image, count_x=8, count_y=13, adjustment=copy.deepcopy(conf.border_adjustment) + ) conf.bunker_adjustment.x = conf.field_adjustment.x - print("Bunker cards") + print("Bunker and goal cards") conf.bunker_adjustment = adjustment.adjust_squares( - image, count_x=3, count_y=1, adjustment=copy.deepcopy(conf.bunker_adjustment) + image, count_x=8, count_y=1, adjustment=copy.deepcopy(conf.bunker_adjustment) + ) + conf.goal_adjustment = copy.deepcopy(conf.bunker_adjustment) + conf.goal_adjustment.x = math.floor( + conf.bunker_adjustment.x + conf.bunker_adjustment.dx * 5 ) - conf.goal_adjustment.x = conf.field_adjustment.x + 5 * conf.field_adjustment.dx - conf.goal_adjustment.y = conf.bunker_adjustment.y - print("Goal cards") - conf.goal_adjustment = adjustment.adjust_squares( - image, count_x=3, count_y=1, adjustment=copy.deepcopy(conf.goal_adjustment) - ) conf.hua_adjustment.y = conf.bunker_adjustment.y print("Hua card") conf.hua_adjustment = adjustment.adjust_squares( @@ -77,7 +81,10 @@ def main() -> None: ) print("Special button") conf.special_button_adjustment = adjustment.adjust_squares( - image, count_x=1, count_y=3, adjustment=copy.deepcopy(conf.special_button_adjustment) + image, + count_x=1, + count_y=3, + adjustment=copy.deepcopy(conf.special_button_adjustment), ) configuration.save(conf, args.config) diff --git a/tools/generate/catalogue.py b/tools/generate/catalogue.py index b93079e..74c5d97 100644 --- a/tools/generate/catalogue.py +++ b/tools/generate/catalogue.py @@ -1,9 +1,12 @@ import argparse +import copy +import math import cv2 import numpy as np -import copy -from shenzhen_solitaire.card_detection import configuration, adjustment, card_finder + +from shenzhen_solitaire.card_detection import (adjustment, card_finder, + configuration) from shenzhen_solitaire.card_detection.configuration import Configuration @@ -41,7 +44,7 @@ def main() -> None: ) empty_adjust = copy.deepcopy(conf.border_adjustment) - empty_adjust.y = empty_adjust.y + 4 * empty_adjust.dy + empty_adjust.y = math.floor(empty_adjust.y + 4 * empty_adjust.dy) conf.empty_card.extend(card_finder.get_field_squares(image, empty_adjust, 1, 1)) conf.green_card.extend( diff --git a/tools/to_json.py b/tools/to_json.py index 97c786d..fc49608 100644 --- a/tools/to_json.py +++ b/tools/to_json.py @@ -4,7 +4,7 @@ import sys import cv2 import shenzhen_solitaire.card_detection.configuration as configuration -from shenzhen_solitaire.card_detection.board_parser import parse_to_json +from shenzhen_solitaire.card_detection.board_parser import parse_board, parse_start_board def main() -> None: @@ -13,13 +13,17 @@ def main() -> None: parser.add_argument( "--config", dest="config_path", type=str, help="Config path", ) + parser.add_argument("--simple", action="store_true", help="Parse a start board, use when config is not complete") args = parser.parse_args() image = cv2.imread(args.board_path) - conf = configuration.load("test_config.zip") + conf = configuration.load(args.config_path) - print(parse_to_json(image, conf)) + if args.simple: + print(parse_start_board(image, conf).to_json()) + else: + print(parse_board(image, conf).to_json()) if __name__ == "__main__":