diff options
Diffstat (limited to 'src/argaze/ArUcoMarkers/ArUcoMarkersDictionary.py')
-rw-r--r-- | src/argaze/ArUcoMarkers/ArUcoMarkersDictionary.py | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/argaze/ArUcoMarkers/ArUcoMarkersDictionary.py b/src/argaze/ArUcoMarkers/ArUcoMarkersDictionary.py new file mode 100644 index 0000000..f8060f3 --- /dev/null +++ b/src/argaze/ArUcoMarkers/ArUcoMarkersDictionary.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python + +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_16h5, + '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 package.""" + +class ArUcoMarkersDictionary(): + """Handle an ArUco markers dictionary.""" + + def __init__(self, aruco_dictionary_name): + + if all_aruco_markers_dictionaries.get(aruco_dictionary_name, None) is None: + raise NameError(f'Bad ArUco markers dictionary name: {aruco_dictionary_name}') + + dict_name_split = aruco_dictionary_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[aruco_dictionary_name]) + + def get_markers(self): + return self.__aruco_dict + + def get_markers_format(self): + return self.__format + + def get_markers_number(self): + return self.__number + + def export_as_png(self, destination_folder, dpi, i): + """Save one marker into a .png file.""" + + if i >= 0 and i < self.__number: + + output_filename = f'marker_{self.__format}_{i}.png' + + print(destination_folder, output_filename) + + # create marker + marker = numpy.zeros((dpi, dpi, 1), dtype="uint8") + aruco.drawMarker(self.__aruco_dict, i, dpi, marker, 1) + + # save marker into destination folder + cv.imwrite(f'{destination_folder}/{output_filename}', marker) + + else: + raise ValueError(f'Bad ArUco index: {i}') + + def export_all(self, destination_folder, dpi): + """Save all markers dictionary into separated .png files.""" + + for i in range(self.__number): + + self.export_as_png(destination_folder, dpi, i) |