aboutsummaryrefslogtreecommitdiff
path: root/src/argaze/ArUcoMarkers/ArUcoCamera.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/argaze/ArUcoMarkers/ArUcoCamera.py')
-rw-r--r--src/argaze/ArUcoMarkers/ArUcoCamera.py75
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