diff options
Diffstat (limited to 'src/argaze/ArUcoMarkers/ArUcoBoard.py')
-rw-r--r-- | src/argaze/ArUcoMarkers/ArUcoBoard.py | 55 |
1 files changed, 21 insertions, 34 deletions
diff --git a/src/argaze/ArUcoMarkers/ArUcoBoard.py b/src/argaze/ArUcoMarkers/ArUcoBoard.py index 5d2a39d..6c91fc6 100644 --- a/src/argaze/ArUcoMarkers/ArUcoBoard.py +++ b/src/argaze/ArUcoMarkers/ArUcoBoard.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from dataclasses import dataclass, field from argaze.ArUcoMarkers import ArUcoMarkersDictionary @@ -6,74 +7,60 @@ import numpy import cv2 as cv import cv2.aruco as aruco +@dataclass class ArUcoBoard(): """Calibration chess board with ArUco markers inside.""" - def __init__(self, columns: int, rows: int, square_size: float, marker_size: float, dictionary: ArUcoMarkersDictionary.ArUcoMarkersDictionary | str = None): - """Create columns x rows chess board with ArUco markers at given size in centimeters.""" + columns: int = field(default=0) + """Number of columns.""" - # Store properties - self.__columns = columns - self.__rows = rows - self.__square_size = square_size # in cm - self.__marker_size = marker_size # in cm + rows: int = field(default=0) + """Number of rows.""" - # Handle dictionary str or instance - if dictionary != None: + square_size: float = field(default=0.) + """Size of board square in centimeter.""" - if type(dictionary) == str: - self.dictionary = ArUcoMarkersDictionary.ArUcoMarkersDictionary(dictionary) - elif isinstance(dictionary, ArUcoMarkersDictionary.ArUcoMarkersDictionary): - self.dictionary = dictionary - else: - raise ValueError(f'dictionary: {dictionary}') + marker_size: float = field(default=0.) + """Size of ArUco markers inside board squares in centimeter.""" - else: + dictionary: ArUcoMarkersDictionary.ArUcoMarkersDictionary = field(default_factory=ArUcoMarkersDictionary.ArUcoMarkersDictionary) + """ArUco markers dictionary.""" - self.dictionary = ArUcoMarkersDictionary.ArUcoMarkersDictionary() + def __post_init__(self): # Create board model - self.__board = aruco.CharucoBoard((self.__columns, self.__rows), self.__square_size/100., self.__marker_size/100., self.dictionary.markers) - - def __del__(self): - pass - - @property - def model(self) -> aruco.CharucoBoard: - """Get the board model.""" - - return self.__board + self.model = aruco.CharucoBoard((self.columns, self.rows), self.square_size/100., self.marker_size/100., self.dictionary.markers) @property def identifiers(self) -> list[int]: """Get board markers identifiers.""" - return self.__board.getIds() + return self.model.getIds() @property def size(self)-> int: """Get numbers of columns and rows.""" - return self.__board.getChessboardSize() + return self.model.getChessboardSize() @property def markers_number(self) -> int: """Get number of markers.""" - return len(self.__board.getIds()) + return len(self.model.getIds()) @property def corners_number(self) -> int: """Get number of corners.""" - return (self.__board.getChessboardSize()[0] - 1 ) * (self.__board.getChessboardSize()[1] - 1) + return (self.model.getChessboardSize()[0] - 1 ) * (self.model.getChessboardSize()[1] - 1) def save(self, destination_folder: str, dpi: int): """Save a picture of the calibration board into a destination folder.""" - output_filename = f'{self.__dictionary.name}_{self.__marker_size}cm_{self.__columns*self.__square_size}cmx{self.__rows*self.__square_size}cm.png' + output_filename = f'{self.dictionary.name}_{self.marker_size}cm_{self.columns*self.square_size}cmx{self.rows*self.square_size}cm.png' - dimension = [round(d * self.__board.getSquareLength() * 100 * dpi / 2.54) for d in self.__board.getChessboardSize()] # 1 cm = 2.54 inches + dimension = [round(d * self.model.getSquareLength() * 100 * dpi / 2.54) for d in self.model.getChessboardSize()] # 1 cm = 2.54 inches - cv.imwrite(f'{destination_folder}/{output_filename}', self.__board.generateImage(dimension)) + cv.imwrite(f'{destination_folder}/{output_filename}', self.model.generateImage(dimension)) |