#!/usr/bin/env python from typing import TypeVar import cv2 as cv import cv2.aruco as aruco import numpy all_aruco_markers_dictionaries = { 'DICT_4X4_50': aruco.DICT_4X4_50, 'DICT_4X4_100': aruco.DICT_4X4_100, 'DICT_4X4_250': aruco.DICT_4X4_250, 'DICT_4X4_1000': aruco.DICT_4X4_1000, 'DICT_5X5_50': aruco.DICT_5X5_50, 'DICT_5X5_100': aruco.DICT_5X5_100, 'DICT_5X5_250': aruco.DICT_5X5_250, 'DICT_5X5_1000': aruco.DICT_5X5_1000, 'DICT_6X6_50': aruco.DICT_6X6_50, 'DICT_6X6_100': aruco.DICT_6X6_100, 'DICT_6X6_250': aruco.DICT_6X6_250, 'DICT_6X6_1000': aruco.DICT_6X6_1000, 'DICT_7X7_50': aruco.DICT_7X7_50, 'DICT_7X7_100': aruco.DICT_7X7_100, 'DICT_7X7_250': aruco.DICT_7X7_250, 'DICT_7X7_1000': aruco.DICT_7X7_1000, 'DICT_ARUCO_ORIGINAL': aruco.DICT_ARUCO_ORIGINAL, 'DICT_APRILTAG_16h5': aruco.DICT_APRILTAG_16h5, 'DICT_APRILTAG_25h9': aruco.DICT_APRILTAG_25h9, 'DICT_APRILTAG_36h10': aruco.DICT_APRILTAG_36h10, 'DICT_APRILTAG_36h11': aruco.DICT_APRILTAG_36h11 } """Dictionnary to list all built-in ArUco markers dictionaries from OpenCV ArUco package.""" ArUcoMarkerType = TypeVar('ArUcoMarker', bound="ArUcoMarker") # Type definition for type annotation convenience class ArUcoMarkersDictionary(): """Handle an ArUco markers dictionary.""" def __init__(self, name): if all_aruco_markers_dictionaries.get(name, None) is None: raise NameError(f'Bad ArUco markers dictionary name: {name}') self.__name = name dict_name_split = name.split('_') self.__format = dict_name_split[1] # DICT_ARUCO_ORIGINAL case if self.__format == 'ARUCO': self.__format = '5X5' self.__number = 1024 # DICT_APRILTAG case elif self.__format == 'APRILTAG': april_tag_format = dict_name_split[2] if april_tag_format == '16h5': self.__format = '4X4' self.__number = 30 elif april_tag_format == '25h9': self.__format = '5X5' self.__number = 30 elif april_tag_format == '36h10': self.__format = '6X6' self.__number = 2320 elif april_tag_format == '36h11': self.__format = '6X6' self.__number = 587 # other cases else: self.__number = int(dict_name_split[2]) self.__aruco_dict = aruco.Dictionary_get(all_aruco_markers_dictionaries[self.__name]) @property def name(self)-> str: """Get dictionary name.""" return self.__name @property def markers(self) -> aruco.Dictionary: """Get all markers from dictionary.""" return self.__aruco_dict @property def format(self) -> str: """Get markers format.""" return self.__format @property def number(self) -> int: """Get number of markers inside dictionary.""" return self.__number def create_marker(self, i, size) -> ArUcoMarkerType: """Create a marker.""" if i >= 0 and i < self.__number: from argaze.ArUcoMarkers import ArUcoMarker return ArUcoMarker.ArUcoMarker(self, i, size) else: raise ValueError(f'Bad index: {i}') def save(self, destination_folder, size, dpi): """Save all markers dictionary into separated .png files.""" for i in range(self.__number): self.create_marker(i, size).save(destination_folder, dpi)