From c1026c0640e49e71b2160c5cd4b1e428e1c52293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20W=C3=B6lfer?= Date: Wed, 5 Feb 2020 01:51:30 +0100 Subject: [PATCH] Made image detection work --- .../card_detection/board_parser.py | 63 ++++++---- .../card_detection/card_finder.py | 114 +++++++----------- .../card_detection/configuration.py | 89 ++++++++------ test/boards.py | 61 ++++++++++ test/test_cv.py | 17 +-- test_config.zip | Bin 23103 -> 45657 bytes tools/generate_config.py | 8 +- 7 files changed, 208 insertions(+), 144 deletions(-) diff --git a/shenzhen_solitaire/card_detection/board_parser.py b/shenzhen_solitaire/card_detection/board_parser.py index 81c50dc..56bdae9 100644 --- a/shenzhen_solitaire/card_detection/board_parser.py +++ b/shenzhen_solitaire/card_detection/board_parser.py @@ -4,34 +4,49 @@ import numpy as np from .configuration import Configuration from ..board import Board from . import card_finder +import cv2 +from typing import Iterable, Any, List +import itertools def parse_board(image: np.ndarray, conf: Configuration) -> Board: """Parse a screenshot of the game, using a given configuration""" + fake_adjustments = conf.field_adjustment + fake_adjustments.x -= 5 + fake_adjustments.y -= 5 + fake_adjustments.h += 10 + fake_adjustments.w += 10 + row_count = 13 + column_count = 8 + + def grouper(iterable: Iterable[Any], groupsize: int, fillvalue: Any = None) -> Iterable[Any]: + "Collect data into fixed-length chunks or blocks" + args = [iter(iterable)] * groupsize + return itertools.zip_longest(*args, fillvalue=fillvalue) + squares = card_finder.get_field_squares( - image, conf.field_adjustment, count_x=13, count_y=8) - squares = [card_finder.simplify(square)[0] for square in squares] - square_rows = [squares[13 * i:13 * (i + 1)] for i in range(8)] - empty_square = np.full( - shape=(conf.field_adjustment.w, - conf.field_adjustment.h), - fill_value=card_finder.GREYSCALE_COLOR[card_finder.Cardcolor.Background], - dtype=np.uint8) - assert empty_square.shape == squares[0].shape - result: Board = Board() - for row_id, square_row in enumerate(square_rows): - for square in square_row: - fitting_square, _ = card_finder.find_square( - square, [empty_square] + [x[0] for x in conf.catalogue]) - if np.array_equal(fitting_square, empty_square): - print("empty") - break - for cat_square, cardtype in conf.catalogue: - if np.array_equal(fitting_square, cat_square): - print(cardtype) - result.field[row_id].append(cardtype) - break - else: - print("did not find image") + image, conf.field_adjustment, count_x=row_count, count_y=column_count + ) + grouped_squares = grouper(squares, row_count) + result = Board() + for group_index, square_group in enumerate(grouped_squares): + group_field = [] + for index, square in enumerate(square_group): + best_val = None + best_name = None + for template, name in conf.catalogue: + res = cv2.matchTemplate(square, template, cv2.TM_CCOEFF_NORMED) + min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) + if best_val is None or max_val > best_val: + best_val = max_val + best_name = name + assert best_name is not None + group_field.append(best_name) + + # print(f"\t{best_val}: {best_name}") + # cv2.imshow("Catalogue", cv2.resize(square, (500, 500))) + # cv2.waitKey() + + result.field[group_index] = group_field return result diff --git a/shenzhen_solitaire/card_detection/card_finder.py b/shenzhen_solitaire/card_detection/card_finder.py index b7149df..08f6223 100644 --- a/shenzhen_solitaire/card_detection/card_finder.py +++ b/shenzhen_solitaire/card_detection/card_finder.py @@ -3,25 +3,23 @@ from typing import List, Tuple, Optional, Dict import enum import itertools -import numpy as np # type: ignore -import cv2 # type: ignore +import numpy as np +import cv2 from .adjustment import Adjustment, get_square from ..board import Card, NumberCard, SpecialCard -def _extract_squares(image: np.ndarray, - squares: List[Tuple[int, - int, - int, - int]]) -> List[np.ndarray]: - return [image[square[1]:square[3], square[0]:square[2]].copy() - for square in squares] +def _extract_squares( + image: np.ndarray, squares: List[Tuple[int, int, int, int]] +) -> List[np.ndarray]: + return [ + image[square[1] : square[3], square[0] : square[2]].copy() for square in squares + ] -def get_field_squares(image: np.ndarray, - adjustment: Adjustment, - count_x: int, - count_y: int) -> List[np.ndarray]: +def get_field_squares( + image: np.ndarray, adjustment: Adjustment, count_x: int, count_y: int +) -> List[np.ndarray]: """Return all squares in the field, according to the adjustment""" squares = [] for index_x, index_y in itertools.product(range(count_y), range(count_x)): @@ -31,64 +29,43 @@ def get_field_squares(image: np.ndarray, class Cardcolor(enum.Enum): """Relevant colors for different types of cards""" + Bai = (65, 65, 65) Black = (0, 0, 0) Red = (22, 48, 178) Green = (76, 111, 19) Background = (178, 194, 193) - -GREYSCALE_COLOR = { - Cardcolor.Bai: 50, - Cardcolor.Black: 100, - Cardcolor.Red: 150, - Cardcolor.Green: 200, - Cardcolor.Background: 250} - - -def simplify(image: np.ndarray) -> Tuple[np.ndarray, Dict[Cardcolor, int]]: - """Reduce given image to the colors in Cardcolor""" - result_image: np.ndarray = np.zeros( - (image.shape[0], image.shape[1]), np.uint8) - result_dict: Dict[Cardcolor, int] = {c: 0 for c in Cardcolor} - for pixel_x, pixel_y in itertools.product( - range(result_image.shape[0]), - range(result_image.shape[1])): - pixel = image[pixel_x, pixel_y] - best_color: Optional[Tuple[Cardcolor, int]] = None - for color in Cardcolor: - mse = sum((x - y) ** 2 for x, y in zip(color.value, pixel)) - if not best_color or best_color[1] > mse: #pylint: disable=E1136 - best_color = (color, mse) - assert best_color - result_image[pixel_x, pixel_y] = GREYSCALE_COLOR[best_color[0]] - result_dict[best_color[0]] += 1 - return (result_image, result_dict) - - -def _find_single_square(search_square: np.ndarray, - template_square: np.ndarray) -> Tuple[int, Tuple[int, int]]: +def _find_single_square( + search_square: np.ndarray, template_square: np.ndarray +) -> Tuple[int, Tuple[int, int]]: assert search_square.shape[0] >= template_square.shape[0] assert search_square.shape[1] >= template_square.shape[1] best_result: Optional[Tuple[int, Tuple[int, int]]] = None for margin_x, margin_y in itertools.product( - range(search_square.shape[0], template_square.shape[0] - 1, -1), - range(search_square.shape[1], template_square.shape[1] - 1, -1)): - search_region = search_square[margin_x - - template_square.shape[0]:margin_x, margin_y - - template_square.shape[1]:margin_y] + range(search_square.shape[0], template_square.shape[0] - 1, -1), + range(search_square.shape[1], template_square.shape[1] - 1, -1), + ): + search_region = search_square[ + margin_x - template_square.shape[0] : margin_x, + margin_y - template_square.shape[1] : margin_y, + ] count = cv2.countNonZero(search_region - template_square) - if not best_result or count < best_result[0]: #pylint: disable=E1136 + if not best_result or count < best_result[0]: # pylint: disable=E1136 best_result = ( count, - (margin_x - template_square.shape[0], - margin_y - template_square.shape[1])) + ( + margin_x - template_square.shape[0], + margin_y - template_square.shape[1], + ), + ) assert best_result return best_result -def find_square(search_square: np.ndarray, - squares: List[np.ndarray]) -> Tuple[np.ndarray, int]: +def find_square( + search_square: np.ndarray, squares: List[np.ndarray] +) -> Tuple[np.ndarray, int]: """Compare all squares in squares with search_square, return best matching one. Requires all squares to be simplified.""" best_set = False @@ -104,24 +81,24 @@ def find_square(search_square: np.ndarray, return (best_square, best_count) -def catalogue_cards(squares: List[np.ndarray] - ) -> List[Tuple[np.ndarray, Card]]: +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("Card ID is [B]ai, [Z]hong, [F]a, [H]ua, [R]ed, [G]reen, [B]lack") print("Numbercard e.g. R3") special_card_map = { - 'b': SpecialCard.Bai, - 'z': SpecialCard.Zhong, - 'f': SpecialCard.Fa, - 'h': SpecialCard.Hua} + "b": SpecialCard.Bai, + "z": SpecialCard.Zhong, + "f": SpecialCard.Fa, + "h": SpecialCard.Hua, + } suit_map = { - 'r': NumberCard.Suit.Red, - 'g': NumberCard.Suit.Green, - 'b': NumberCard.Suit.Black} + "r": NumberCard.Suit.Red, + "g": NumberCard.Suit.Green, + "b": NumberCard.Suit.Black, + } for square in squares: while True: cv2.imshow("Catalogue", cv2.resize(square, (500, 500))) @@ -137,10 +114,11 @@ def catalogue_cards(squares: List[np.ndarray] continue if not card_id[1].isdigit(): continue - if card_id[1] == '0': + if card_id[1] == "0": continue - card_type = NumberCard(number=int( - card_id[1]), suit=suit_map[card_id[0]]) + card_type = NumberCard( + number=int(card_id[1]), suit=suit_map[card_id[0]] + ) else: continue assert card_type is not None diff --git a/shenzhen_solitaire/card_detection/configuration.py b/shenzhen_solitaire/card_detection/configuration.py index dbe0db8..d59fb7c 100644 --- a/shenzhen_solitaire/card_detection/configuration.py +++ b/shenzhen_solitaire/card_detection/configuration.py @@ -4,6 +4,8 @@ import json from typing import List, Tuple, Dict import io import dataclasses +import tempfile +import cv2 import numpy as np from . import adjustment @@ -13,15 +15,16 @@ from .. import board class Configuration: """Configuration for solitaire cv""" - ADJUSTMENT_FILE_NAME = 'adjustment.json' - TEMPLATES_DIRECTORY = 'templates' - def __init__(self, - adj: adjustment.Adjustment, - catalogue: List[Tuple[np.ndarray, - board.Card]], - meta: Dict[str, - str]) -> None: + ADJUSTMENT_FILE_NAME = "adjustment.json" + TEMPLATES_DIRECTORY = "templates" + + def __init__( + self, + adj: adjustment.Adjustment, + catalogue: List[Tuple[np.ndarray, board.Card]], + meta: Dict[str, str], + ) -> None: self.field_adjustment = adj self.catalogue = catalogue self.meta = meta @@ -29,67 +32,73 @@ class Configuration: def save(self, filename: str) -> None: """Save configuration to zip archive""" zip_stream = io.BytesIO() + with zipfile.ZipFile(zip_stream, "w") as zip_file: zip_file.writestr( - self.ADJUSTMENT_FILE_NAME, json.dumps( - dataclasses.asdict( - self.field_adjustment))) + self.ADJUSTMENT_FILE_NAME, + json.dumps(dataclasses.asdict(self.field_adjustment)), + ) counter = 0 + extension = ".png" for square, card in self.catalogue: counter += 1 - file_stream = io.BytesIO() - np.save( - file_stream, - card_finder.simplify(square)[0], - allow_pickle=False) + fd, myfile = tempfile.mkstemp() + cv2.imwrite(myfile + extension, square) file_name = "" if isinstance(card, board.SpecialCard): - file_name = f's{card.value}-{card.name}-{counter}.npy' + file_name = f"s{card.value}-{card.name}-{counter}{extension}" elif isinstance(card, board.NumberCard): - file_name = f'n{card.suit.value}{card.number}'\ - f'-{card.suit.name}-{counter}.npy' + file_name = ( + f"n{card.suit.value}{card.number}" + f"-{card.suit.name}-{counter}{extension}" + ) else: raise AssertionError() - zip_file.writestr( - self.TEMPLATES_DIRECTORY + f"/{file_name}", - file_stream.getvalue()) + zip_file.write(myfile + extension, arcname=f"{self.TEMPLATES_DIRECTORY}/{file_name}") - with open(filename, 'wb') as zip_archive: + with open(filename, "wb") as zip_archive: zip_archive.write(zip_stream.getvalue()) @staticmethod - def load(filename: str) -> 'Configuration': + def load(filename: str) -> "Configuration": """Load configuration from zip archive""" + def _parse_file_name(card_filename: str) -> board.Card: - assert card_filename.startswith( - Configuration.TEMPLATES_DIRECTORY + '/') - pure_name = card_filename[ - len(Configuration.TEMPLATES_DIRECTORY + '/'):] - if pure_name[0] == 's': + assert card_filename.startswith(Configuration.TEMPLATES_DIRECTORY + "/") + pure_name = card_filename[len(Configuration.TEMPLATES_DIRECTORY + "/") :] + if pure_name[0] == "s": return board.SpecialCard(int(pure_name[1])) - if pure_name[0] == 'n': + if pure_name[0] == "n": return board.NumberCard( - suit=board.NumberCard.Suit( - int(pure_name[1])), number=int(pure_name[2])) + suit=board.NumberCard.Suit(int(pure_name[1])), + number=int(pure_name[2]), + ) raise AssertionError() catalogue: List[Tuple[np.ndarray, board.Card]] = [] - with zipfile.ZipFile(filename, 'r') as zip_file: + with zipfile.ZipFile(filename, "r") as zip_file: adj = adjustment.Adjustment( - **json.loads( - zip_file.read(Configuration.ADJUSTMENT_FILE_NAME))) + **json.loads(zip_file.read(Configuration.ADJUSTMENT_FILE_NAME)) + ) + mydir=tempfile.mkdtemp() for template_filename in ( - x for x in zip_file.namelist() if - x.startswith(Configuration.TEMPLATES_DIRECTORY + '/')): + x + for x in zip_file.namelist() + if x.startswith(Configuration.TEMPLATES_DIRECTORY + "/") + ): + myfile = zip_file.extract(template_filename, path=mydir) catalogue.append( - (np.load(io.BytesIO(zip_file.read(template_filename))), - _parse_file_name(template_filename))) + ( + cv2.imread(myfile), + _parse_file_name(template_filename), + ) + ) assert catalogue[-1][0] is not None return Configuration(adj=adj, catalogue=catalogue, meta={}) @staticmethod - def generate(image: np.ndarray) -> 'Configuration': + def generate(image: np.ndarray) -> "Configuration": """Generate a configuration with user input""" adj = adjustment.adjust_field(image) squares = card_finder.get_field_squares(image, adj, 5, 8) diff --git a/test/boards.py b/test/boards.py index 528f995..e9a428f 100644 --- a/test/boards.py +++ b/test/boards.py @@ -1,6 +1,8 @@ """Contains an example board to run tests on""" from shenzhen_solitaire.board import NumberCard, SpecialCard, Board +Suit = NumberCard.Suit + TEST_BOARD = Board() TEST_BOARD.field[0] = [ SpecialCard.Fa, @@ -65,3 +67,62 @@ TEST_BOARD.field[7] = [ NumberCard(NumberCard.Suit.Black, 1), NumberCard(NumberCard.Suit.Green, 8), ] + +B20190809172206_1 = Board() +B20190809172206_1.field[0] = [ + NumberCard(Suit.Green, 6), + NumberCard(Suit.Green, 5), + NumberCard(Suit.Red, 4), + NumberCard(Suit.Green, 4), + SpecialCard.Fa, +] + +B20190809172206_1.field[1] = [ + NumberCard(Suit.Black, 8), + NumberCard(Suit.Black, 6), + SpecialCard.Zhong, + NumberCard(Suit.Black, 9), + NumberCard(Suit.Green, 7), +] + +B20190809172206_1.field[2] = [ + SpecialCard.Zhong, + NumberCard(Suit.Black, 4), + NumberCard(Suit.Green, 2), + SpecialCard.Bai, + SpecialCard.Zhong, +] +B20190809172206_1.field[3] = [ + NumberCard(Suit.Green, 1), + NumberCard(Suit.Green, 3), + NumberCard(Suit.Black, 5), + SpecialCard.Fa, + SpecialCard.Fa, +] +B20190809172206_1.field[4] = [ + NumberCard(Suit.Red, 8), + SpecialCard.Zhong, + NumberCard(Suit.Red, 7), +] +B20190809172206_1.field[5] = [ + SpecialCard.Fa, + SpecialCard.Bai, + NumberCard(Suit.Red, 2), + SpecialCard.Hua, + SpecialCard.Bai, +] +B20190809172206_1.field[6] = [ + NumberCard(Suit.Black, 2), + NumberCard(Suit.Green, 8), + NumberCard(Suit.Black, 7), + SpecialCard.Bai, + NumberCard(Suit.Red, 9), +] + +B20190809172206_1.field[7] = [ + NumberCard(Suit.Red, 3), + NumberCard(Suit.Black, 3), + NumberCard(Suit.Green, 9), + NumberCard(Suit.Red, 5), + NumberCard(Suit.Red, 6), +] diff --git a/test/test_cv.py b/test/test_cv.py index e07c982..7cccd86 100644 --- a/test/test_cv.py +++ b/test/test_cv.py @@ -8,17 +8,18 @@ import numpy as np from shenzhen_solitaire import board from shenzhen_solitaire.card_detection import adjustment, board_parser from shenzhen_solitaire.card_detection.configuration import Configuration +from . import boards class CardDetectionTest(unittest.TestCase): def test_parse(self) -> None: - """Parse a configuration""" - with open("pictures/20190809172213_1.jpg", "rb") as png_file: - img_str = png_file.read() - nparr = np.frombuffer(img_str, np.uint8) - image = cv2.imdecode(nparr, cv2.IMREAD_COLOR) - # image = cv2.resize(image, (1000, 629)) + """Parse a configuration and a board""" + image = cv2.imread("pictures/20190809172206_1.jpg") loaded_config = Configuration.load("test_config.zip") - # loaded_config.field_adjustment = adjustment.adjust_field(image) - print(board_parser.parse_board(image, loaded_config)) + my_board = board_parser.parse_board(image, loaded_config) + + for rows in zip(boards.B20190809172206_1.field, my_board.field): + for good_cell, test_cell in zip(*rows): + self.assertEqual(good_cell, test_cell) + diff --git a/test_config.zip b/test_config.zip index 91b2d870a292234bbb97589510c4edec2f5bd756..8e6c0bd77a3d919535377b61a40a8fbc2569d79c 100644 GIT binary patch literal 45657 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 literal 23103 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 C{_jKp diff --git a/tools/generate_config.py b/tools/generate_config.py index 045e949..2ffe340 100644 --- a/tools/generate_config.py +++ b/tools/generate_config.py @@ -4,11 +4,11 @@ from shenzhen_solitaire.card_detection.configuration import Configuration def main() -> None: """Generate a configuration""" - with open("pictures/20190809172213_1.jpg", 'rb') as png_file: - img_str = png_file.read() - nparr = np.frombuffer(img_str, np.uint8) - image = cv2.imdecode(nparr, cv2.IMREAD_COLOR) + image = cv2.imread("pictures/20190809172213_1.jpg") generated_config = Configuration.generate(image) generated_config.save('test_config.zip') + +if __name__ == "__main__": + main() \ No newline at end of file