aboutsummaryrefslogtreecommitdiff
path: root/src/argaze/ArUcoMarkers/ArUcoMarkersDictionary.py
blob: 58b55b87a937eab806a3c975cf8720c3a8250722 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/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_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 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 create_marker(self, i, dpi=300):
        """Create a marker image."""

        marker = numpy.zeros((dpi, dpi, 1), dtype="uint8")
        aruco.drawMarker(self.__aruco_dict, i, dpi, marker, 1)

        return numpy.repeat(marker, 3).reshape(dpi, dpi, 3)

    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 = self.create_marker(i, dpi)

            # 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)