diff options
Diffstat (limited to 'src/argaze/ArUcoMarkers/ArUcoCamera.py')
-rw-r--r-- | src/argaze/ArUcoMarkers/ArUcoCamera.py | 75 |
1 files changed, 44 insertions, 31 deletions
diff --git a/src/argaze/ArUcoMarkers/ArUcoCamera.py b/src/argaze/ArUcoMarkers/ArUcoCamera.py index 775ab40..ca58c20 100644 --- a/src/argaze/ArUcoMarkers/ArUcoCamera.py +++ b/src/argaze/ArUcoMarkers/ArUcoCamera.py @@ -8,7 +8,6 @@ __copyright__ = "Copyright 2023, Ecole Nationale de l'Aviation Civile (ENAC)" __license__ = "BSD" from typing import TypeVar, Tuple -from dataclasses import dataclass, field import json import os import time @@ -33,26 +32,32 @@ DEFAULT_ARUCOCAMERA_IMAGE_PARAMETERS = { } } -@dataclass class ArUcoCamera(ArFeatures.ArCamera): """ Define an ArCamera based on ArUco marker detection. - - Parameters: - aruco_detector: ArUco marker detector """ - aruco_detector: ArUcoDetector.ArUcoDetector = field(default_factory=ArUcoDetector.ArUcoDetector) + def __init__(self, aruco_detector: ArUcoDetector.ArUcoDetector, **kwargs): + """ Initialize ArUcoCamera + + Parameters: + aruco_detector: ArUco marker detector + """ - def __post_init__(self): + # DEBUG + print('ArUcoCamera.__init__ kwargs', kwargs) - super().__post_init__() + # Init parent class + super().__init__(**kwargs) + + # Init private attribute + self.__aruco_detector = aruco_detector # Check optic parameters - if self.aruco_detector.optic_parameters is not None: + if self.__aruco_detector.optic_parameters is not None: # Optic parameters dimensions should be equal to camera frame size - if self.aruco_detector.optic_parameters.dimensions != self.size: + if self.__aruco_detector.optic_parameters.dimensions != self.size: raise ArFeatures.LoadingFailed('ArUcoCamera: aruco_detector.optic_parameters.dimensions have to be equal to size.') @@ -61,18 +66,12 @@ class ArUcoCamera(ArFeatures.ArCamera): # Create default optic parameters adapted to frame size # Note: The choice of 1000 for default focal length should be discussed... - self.aruco_detector.optic_parameters = ArUcoOpticCalibrator.OpticParameters(rms=-1, dimensions=self.size, K=ArUcoOpticCalibrator.K0(focal_length=(1000., 1000.), width=self.size[0], height=self.size[1])) + self.__aruco_detector.optic_parameters = ArUcoOpticCalibrator.OpticParameters(rms=-1, dimensions=self.size, K=ArUcoOpticCalibrator.K0(focal_length=(1000., 1000.), width=self.size[0], height=self.size[1])) - def __str__(self) -> str: - """ - Returns: - String representation - """ - - output = super().__str__() - output += f'ArUcoDetector:\n{self.aruco_detector}\n' - - return output + @property + def aruco_detector(self) -> ArUcoDetector.ArUcoDetector: + """Get ArUco detector object.""" + return self.__aruco_detector @classmethod def from_dict(self, aruco_camera_data: dict, working_directory: str = None) -> ArUcoCameraType: @@ -120,11 +119,14 @@ class ArUcoCamera(ArFeatures.ArCamera): for layer_name, layer_data in aruco_camera_data['layers'].items(): aruco_camera_data['image_parameters']['draw_layers'][layer_name] = ArFeatures.DEFAULT_ARLAYER_DRAW_PARAMETERS - # Get values of temporary ar frame created from aruco_camera_data - temp_ar_frame_values = DataFeatures.as_dict(ArFeatures.ArFrame.from_dict(aruco_camera_data, working_directory)) + # Load temporary camera from aruco_camera_data then export it as dict + temp_camera_data = ArFeatures.ArCamera.from_dict(aruco_camera_data, working_directory).as_dict() + + # DEBUG + print('ArUcoCamera.from_dict: temp_camera_data=', temp_camera_data) # Create new aruco camera using temporary ar frame values - return ArUcoCamera(aruco_detector=new_aruco_detector, scenes=new_scenes, **temp_ar_frame_values) + return ArUcoCamera(aruco_detector = new_aruco_detector, scenes = new_scenes, **temp_camera_data) @classmethod def from_json(self, json_filepath: str) -> ArUcoCameraType: @@ -142,6 +144,17 @@ class ArUcoCamera(ArFeatures.ArCamera): return ArUcoCamera.from_dict(aruco_camera_data, working_directory) + def __str__(self) -> str: + """ + Returns: + String representation + """ + + output = super().__str__() + output += f'ArUcoDetector:\n{self.__aruco_detector}\n' + + return output + @DataFeatures.PipelineStepMethod def watch(self, timestamp: int|float, image: numpy.array): """Detect environment aruco markers from image and project scenes into camera frame. @@ -151,10 +164,10 @@ class ArUcoCamera(ArFeatures.ArCamera): """ # Use camera frame locker feature - with self.locker: + with self._lock: # Detect aruco markers - self.aruco_detector.detect_markers(timestamp, image) + self.__aruco_detector.detect_markers(timestamp, image) # Fill camera frame background with image self.background = image @@ -173,7 +186,7 @@ class ArUcoCamera(ArFeatures.ArCamera): try: # Build AOI scene directly from detected ArUco marker corners - self.layers[??].aoi_2d_scene |= scene.build_aruco_aoi_scene(self.aruco_detector.detected_markers) + self.layers[??].aoi_2d_scene |= scene.build_aruco_aoi_scene(self.__aruco_detector.detected_markers) except ArFeatures.PoseEstimationFailed: @@ -181,7 +194,7 @@ class ArUcoCamera(ArFeatures.ArCamera): ''' # Estimate scene pose from detected scene markers - tvec, rmat, _ = scene.estimate_pose(self.aruco_detector.detected_markers) + tvec, rmat, _ = scene.estimate_pose(self.__aruco_detector.detected_markers) # Project scene into camera frame according estimated pose for layer_name, layer_projection in scene.project(tvec, rmat, self.visual_hfov, self.visual_vfov): @@ -216,12 +229,12 @@ class ArUcoCamera(ArFeatures.ArCamera): image = super().image(**kwargs) # Use frame locker feature - with self.locker: + with self._lock: # Draw optic parameters grid if required if draw_optic_parameters_grid is not None: - self.aruco_detector.optic_parameters.draw(image, **draw_optic_parameters_grid) + self.__aruco_detector.optic_parameters.draw(image, **draw_optic_parameters_grid) # Draw scenes if required if draw_scenes is not None: @@ -233,7 +246,7 @@ class ArUcoCamera(ArFeatures.ArCamera): # Draw detected markers if required if draw_detected_markers is not None: - self.aruco_detector.draw_detected_markers(image, draw_detected_markers) + self.__aruco_detector.draw_detected_markers(image, draw_detected_markers) return image |