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