From 5a2f3b420303db6df3f9e68abcfb9bb937b6ccd7 Mon Sep 17 00:00:00 2001 From: Théo de la Hogue Date: Wed, 6 Sep 2023 17:50:31 +0200 Subject: More work on ArUco markers pipeline documentation. --- src/argaze/ArUcoMarkers/ArUcoCamera.py | 42 +---------------- src/argaze/ArUcoMarkers/ArUcoDetector.py | 81 ++++++++++++++++++++++++++++---- 2 files changed, 74 insertions(+), 49 deletions(-) (limited to 'src') diff --git a/src/argaze/ArUcoMarkers/ArUcoCamera.py b/src/argaze/ArUcoMarkers/ArUcoCamera.py index 30b4415..134e76b 100644 --- a/src/argaze/ArUcoMarkers/ArUcoCamera.py +++ b/src/argaze/ArUcoMarkers/ArUcoCamera.py @@ -71,47 +71,7 @@ class ArUcoCamera(ArFeatures.ArCamera): """ # Load ArUco detector - new_detector_data = aruco_camera_data.pop('aruco_detector') - - new_aruco_dictionary = ArUcoMarkersDictionary.ArUcoMarkersDictionary(**new_detector_data.pop('dictionary')) - new_marker_size = new_detector_data.pop('marker_size') - - # Check optic_parameters value type - optic_parameters_value = new_detector_data.pop('optic_parameters') - - # str: relative path to .json file - if type(optic_parameters_value) == str: - - optic_parameters_value = os.path.join(working_directory, optic_parameters_value) - new_optic_parameters = ArUcoOpticCalibrator.OpticParameters.from_json(optic_parameters_value) - - # dict: - else: - - new_optic_parameters = ArUcoOpticCalibrator.OpticParameters(**optic_parameters_value) - - # Load ArUco detector parameters - try: - - # Check detector parameters value type - detector_parameters_value = new_detector_data.pop('parameters') - - # str: relative path to .json file - if type(detector_parameters_value) == str: - - detector_parameters_value = os.path.join(working_directory, detector_parameters_value) - new_aruco_detector_parameters = ArUcoDetector.DetectorParameters.from_json(detector_parameters_value) - - # dict: - else: - - new_aruco_detector_parameters = ArUcoDetector.DetectorParameters(**detector_parameters_value) - - except KeyError: - - new_aruco_detector_parameters = ArUcoDetector.DetectorParameters() - - new_aruco_detector = ArUcoDetector.ArUcoDetector(new_aruco_dictionary, new_marker_size, new_optic_parameters, new_aruco_detector_parameters) + new_aruco_detector = ArUcoDetector.ArUcoDetector.from_dict(aruco_camera_data.pop('aruco_detector'), working_directory) # Load ArUcoScenes new_scenes = {} diff --git a/src/argaze/ArUcoMarkers/ArUcoDetector.py b/src/argaze/ArUcoMarkers/ArUcoDetector.py index 135eb08..73bea88 100644 --- a/src/argaze/ArUcoMarkers/ArUcoDetector.py +++ b/src/argaze/ArUcoMarkers/ArUcoDetector.py @@ -10,6 +10,7 @@ __license__ = "BSD" from typing import TypeVar, Tuple from dataclasses import dataclass, field import json +import os from collections import Counter import time @@ -152,19 +153,83 @@ class ArUcoDetector(): self.__detected_ids = [] @classmethod + def from_dict(self, aruco_detector_data: dict, working_directory: str = None) -> ArUcoDetectorType: + """Load attributes from dictionary. + + Parameters: + aruco_detector_data: dictionary with attributes to load + working_directory: folder path where to load files when a dictionary value is a relative filepath. + """ + + # Load ArUco dictionary + dictionary_value = aruco_detector_data.pop('dictionary') + + # str: dictionary name + if type(dictionary_value) == str: + + new_dictionary = ArUcoMarkersDictionary.ArUcoMarkersDictionary(dictionary_value) + + # dict: + else: + + new_dictionary = ArUcoMarkersDictionary.ArUcoMarkersDictionary(**dictionary_value) + + # Load ArUco marker size + new_marker_size = aruco_detector_data.pop('marker_size') + + # Load optic_parameters value type + optic_parameters_value = aruco_detector_data.pop('optic_parameters') + + # str: relative path to .json file + if type(optic_parameters_value) == str: + + optic_parameters_value = os.path.join(working_directory, optic_parameters_value) + new_optic_parameters = ArUcoOpticCalibrator.OpticParameters.from_json(optic_parameters_value) + + # dict: + else: + + new_optic_parameters = ArUcoOpticCalibrator.OpticParameters(**optic_parameters_value) + + # Load ArUco detector parameters + try: + + # Check detector parameters value type + parameters_value = aruco_detector_data.pop('parameters') + + # str: relative path to .json file + if type(parameters_value) == str: + + parameters_value = os.path.join(working_directory, parameters_value) + new_parameters = DetectorParameters.from_json(parameters_value) + + # dict: + else: + + new_parameters = DetectorParameters(**parameters_value) + + except KeyError: + + new_parameters = DetectorParameters() + + # Create aruco detector + return ArUcoDetector(new_dictionary, new_marker_size, new_optic_parameters, new_parameters) + + @classmethod def from_json(self, json_filepath: str) -> ArUcoDetectorType: - """Load ArUcoDetector setup from .json file.""" + """ + Load attributes from .json file. - with open(json_filepath) as configuration_file: + Parameters: + json_filepath: path to json file + """ - data = json.load(configuration_file) + with open(json_filepath) as configuration_file: - new_dictionary = ArUcoMarkersDictionary.ArUcoMarkersDictionary(**data.pop('dictionary')) - new_marker_size = data.pop('marker_size') - new_optic_parameters = ArUcoOpticCalibrator.OpticParameters(**data.pop('optic_parameters')) - new_parameters = DetectorParameters(**data.pop('parameters')) + aruco_detector_data = json.load(configuration_file) + working_directory = os.path.dirname(json_filepath) - return ArUcoDetector(new_dictionary, new_marker_size, new_optic_parameters, new_parameters) + return ArUcoDetector.from_dict(aruco_detector_data, working_directory) def __str__(self) -> str: """String display""" -- cgit v1.1