From 9078d44f26c0234a9b2cfdf1d5e0bb280ac6e75b Mon Sep 17 00:00:00 2001 From: Théo de la Hogue Date: Wed, 28 Jun 2023 15:47:41 +0200 Subject: Renaming aoi_scene into aoi_3d_scene into ArScene class. --- src/argaze/ArFeatures.py | 68 +++++++++++----------- src/argaze/utils/demo_environment/aoi_3d_scene.obj | 57 ++++++++++++++++++ src/argaze/utils/demo_environment/aoi_scene.obj | 57 ------------------ .../demo_environment/demo_ar_features_setup.json | 6 +- .../demo_environment/demo_gaze_features_setup.json | 2 +- 5 files changed, 95 insertions(+), 95 deletions(-) create mode 100644 src/argaze/utils/demo_environment/aoi_3d_scene.obj delete mode 100644 src/argaze/utils/demo_environment/aoi_scene.obj diff --git a/src/argaze/ArFeatures.py b/src/argaze/ArFeatures.py index 76d048d..86feb48 100644 --- a/src/argaze/ArFeatures.py +++ b/src/argaze/ArFeatures.py @@ -52,7 +52,7 @@ class ArEnvironment(): scene._environment = self # Init AOI scene projections - self.__aoi_scene_projections = {} + self.__aoi_2d_scenes = {} @classmethod def from_json(self, json_filepath: str) -> ArSceneType: @@ -137,19 +137,19 @@ class ArEnvironment(): new_aruco_scene = None - # Check aoi_scene value type - aoi_scene_value = scene_data.pop('aoi_scene') + # Check aoi_3d_scene value type + aoi_3d_scene_value = scene_data.pop('aoi_3d_scene') # str: relative path to .obj file - if type(aoi_scene_value) == str: + if type(aoi_3d_scene_value) == str: - obj_filepath = os.path.join(working_directory, aoi_scene_value) - new_aoi_scene = AOI3DScene.AOI3DScene.from_obj(obj_filepath) + obj_filepath = os.path.join(working_directory, aoi_3d_scene_value) + new_aoi_3d_scene = AOI3DScene.AOI3DScene.from_obj(obj_filepath) # dict: else: - new_aoi_scene = AOI3DScene.AOI3DScene(aoi_scene_value) + new_aoi_3d_scene = AOI3DScene.AOI3DScene(aoi_3d_scene_value) # Build screens new_screens = {} @@ -184,10 +184,10 @@ class ArEnvironment(): gaze_movement_identifier = None # Append new screen - new_screens[screen_name] = ArScreen.from_scene(new_aoi_scene, screen_name, new_screen_size, new_screen_background, gaze_movement_identifier, **screen_data) + new_screens[screen_name] = ArScreen.from_scene(new_aoi_3d_scene, screen_name, new_screen_size, new_screen_background, gaze_movement_identifier, **screen_data) # Append new scene - new_scenes[scene_name] = ArScene(new_aruco_scene, new_aoi_scene, new_screens, **scene_data) + new_scenes[scene_name] = ArScene(new_aruco_scene, new_aoi_3d_scene, new_screens, **scene_data) return ArEnvironment(new_name, new_aruco_detector, new_scenes) @@ -213,10 +213,10 @@ class ArEnvironment(): self.aruco_detector.draw_detected_markers(self.__image) # Draw each AOI scene - for scene_name, aoi_scene_projection in self.__aoi_scene_projections.items(): + for scene_name, aoi_2d_scene in self.__aoi_2d_scenes.items(): # Draw AOI scene projection - aoi_scene_projection.draw(self.__image, color=(255, 255, 255)) + aoi_2d_scene.draw(self.__image, color=(255, 255, 255)) return self.__image @@ -241,14 +241,14 @@ class ArEnvironment(): self.aruco_detector.detect_markers(self.__image) # Project each AOI scene - self.__aoi_scene_projections = {} + self.__aoi_2d_scenes = {} for scene_name, scene in self.scenes.items(): # Project scene try: # Try to build AOI scene from detected ArUco marker corners - self.__aoi_scene_projections[scene_name] = scene.build_aruco_aoi_scene(self.aruco_detector.detected_markers) + self.__aoi_2d_scenes[scene_name] = scene.build_aruco_aoi_scene(self.aruco_detector.detected_markers) except: @@ -259,7 +259,7 @@ class ArEnvironment(): tvec, rmat, _, _ = scene.estimate_pose(self.aruco_detector.detected_markers) # Project AOI scene into video image according estimated pose - self.__aoi_scene_projections[scene_name] = scene.project(tvec, rmat) + self.__aoi_2d_scenes[scene_name] = scene.project(tvec, rmat) def look(self, timestamp: int|float, gaze_position: GazeFeatures.GazePosition): """Project gaze position into environment at particular time.""" @@ -269,15 +269,15 @@ class ArEnvironment(): try: - aoi_scene_projection = self.__aoi_scene_projections[scene_name] + aoi_2d_scene = self.__aoi_2d_scenes[scene_name] # For each scene screens for screen_name, screen in scene.screens.items(): # TODO: Add option to use gaze precision circle - if aoi_scene_projection[screen.name].contains_point(gaze_position.value): + if aoi_2d_scene[screen.name].contains_point(gaze_position.value): - inner_x, inner_y = self.__aoi_scene_projections[scene_name][screen.name].clockwise().inner_axis(gaze_position.value) + inner_x, inner_y = self.__aoi_2d_scenes[scene_name][screen.name].clockwise().inner_axis(gaze_position.value) # QUESTION: How to project gaze precision? inner_gaze_position = GazeFeatures.GazePosition((inner_x, inner_y)) @@ -324,7 +324,7 @@ class ArScene(): Parameters: aruco_scene: ArUco markers 3D scene description used to estimate scene pose from detected markers: see [estimate_pose][argaze.ArFeatures.ArScene.estimate_pose] function below. - aoi_scene: AOI 3D scene description that will be projected onto estimated scene once its pose will be estimated : see [project][argaze.ArFeatures.ArScene.project] function below. + aoi_3d_scene: AOI 3D scene description that will be projected onto estimated scene once its pose will be estimated : see [project][argaze.ArFeatures.ArScene.project] function below. screens: All scene screens @@ -339,7 +339,7 @@ class ArScene(): """ aruco_scene: ArUcoScene.ArUcoScene = field(default_factory=ArUcoScene.ArUcoScene) - aoi_scene: AOI3DScene.AOI3DScene = field(default_factory=AOI3DScene.AOI3DScene) + aoi_3d_scene: AOI3DScene.AOI3DScene = field(default_factory=AOI3DScene.AOI3DScene) screens: dict = field(default_factory=dict) aruco_axis: dict = field(default_factory=dict) aruco_aoi: dict = field(default_factory=dict) @@ -352,7 +352,7 @@ class ArScene(): self._environment = None # Preprocess orthogonal projection to speed up further aruco aoi processings - self.__orthogonal_projection_cache = self.aoi_scene.orthogonal_projection + self.__orthogonal_projection_cache = self.aoi_3d_scene.orthogonal_projection # Setup screens scene after screen creation for name, screen in self.screens.items(): @@ -366,7 +366,7 @@ class ArScene(): output = f'ArEnvironment:\n{self._environment.name}\n' output += f'ArUcoScene:\n{self.aruco_scene}\n' - output += f'AOIScene:\n{self.aoi_scene}\n' + output += f'AOI3DScene:\n{self.aoi_3d_scene}\n' return output @@ -446,29 +446,29 @@ class ArScene(): if visual_hfov > 0: # Transform scene into camera referential - aoi_scene_camera_ref = self.aoi_scene.transform(tvec, rvec) + aoi_3d_scene_camera_ref = self.aoi_3d_scene.transform(tvec, rvec) # Get aoi inside vision cone field cone_vision_height_cm = 200 # cm cone_vision_radius_cm = numpy.tan(numpy.deg2rad(visual_hfov / 2)) * cone_vision_height_cm - _, aoi_outside = aoi_scene_camera_ref.vision_cone(cone_vision_radius_cm, cone_vision_height_cm) + _, aoi_outside = aoi_3d_scene_camera_ref.vision_cone(cone_vision_radius_cm, cone_vision_height_cm) # Keep only aoi inside vision cone field - aoi_scene_copy = self.aoi_scene.copy(exclude=aoi_outside.keys()) + aoi_3d_scene_copy = self.aoi_3d_scene.copy(exclude=aoi_outside.keys()) else: - aoi_scene_copy = self.aoi_scene.copy() + aoi_3d_scene_copy = self.aoi_3d_scene.copy() - aoi_scene_projection = aoi_scene_copy.project(tvec, rvec, self._environment.aruco_detector.optic_parameters.K) + aoi_2d_scene = aoi_3d_scene_copy.project(tvec, rvec, self._environment.aruco_detector.optic_parameters.K) # Warn user when the projected scene is empty - if len(aoi_scene_projection) == 0: + if len(aoi_2d_scene) == 0: raise SceneProjectionFailed('AOI projection is empty') - return aoi_scene_projection + return aoi_2d_scene def build_aruco_aoi_scene(self, detected_markers) -> AOI2DScene.AOI2DScene: """ @@ -504,7 +504,7 @@ class ArScene(): aruco_aoi_scene[aruco_aoi_name] = AOIFeatures.AreaOfInterest(aoi_corners) # Then each inner aoi is projected from the current aruco aoi - for inner_aoi_name, inner_aoi in self.aoi_scene.items(): + for inner_aoi_name, inner_aoi in self.aoi_3d_scene.items(): if aruco_aoi_name != inner_aoi_name: @@ -567,17 +567,17 @@ class ArScreen(): self.heatmap.init() @classmethod - def from_scene(self, aoi_scene, aoi_name, size, background, gaze_movement_identifier, scan_path: bool = False, aoi_scan_path: bool = False, heatmap: bool = False) -> ArScreenType: + def from_scene(self, aoi_3d_scene, aoi_name, size, background, gaze_movement_identifier, scan_path: bool = False, aoi_scan_path: bool = False, heatmap: bool = False) -> ArScreenType: - aoi_scene_projection = aoi_scene.orthogonal_projection.reframe(aoi_name, size) + aoi_2d_scene = aoi_3d_scene.orthogonal_projection.reframe(aoi_name, size) return ArScreen(aoi_name, \ size, \ background, \ - aoi_scene_projection, \ + aoi_2d_scene, \ gaze_movement_identifier, \ GazeFeatures.ScanPath() if scan_path else None, \ - GazeFeatures.AOIScanPath(aoi_scene_projection.keys()) if aoi_scan_path else None, \ + GazeFeatures.AOIScanPath(aoi_2d_scene.keys()) if aoi_scan_path else None, \ AOIFeatures.Heatmap(size) if heatmap else None \ ) @@ -667,4 +667,4 @@ class ArScreen(): # Update heatmap if self.heatmap: - self.heatmap.update(gaze_position.value, sigma=0.05) + self.heatmap.update(self.__gaze_position.value, sigma=0.05) diff --git a/src/argaze/utils/demo_environment/aoi_3d_scene.obj b/src/argaze/utils/demo_environment/aoi_3d_scene.obj new file mode 100644 index 0000000..8922e78 --- /dev/null +++ b/src/argaze/utils/demo_environment/aoi_3d_scene.obj @@ -0,0 +1,57 @@ +# Blender v3.0.1 OBJ File: 'ar_environment.blend' +# www.blender.org +o GrayRectangle +v 0.000000 0.000000 0.000000 +v 25.000000 0.000000 0.000000 +v 0.000000 14.960000 0.000000 +v 25.000000 14.960000 0.000000 +s off +f 1 2 4 3 +o RedSquare +v 3.497026 8.309391 0.000000 +v 7.504756 8.309391 0.000000 +v 3.497026 12.314838 0.001030 +v 7.504756 12.314838 0.001030 +s off +f 5 6 8 7 +o BlueTriangle +v 10.500295 2.307687 0.000000 +v 14.503224 2.306344 0.000000 +v 12.502419 6.312207 0.001030 +s off +f 9 10 11 +o GreenCircle +v 19.495552 12.311101 0.000000 +v 19.105371 12.272672 0.000000 +v 18.730185 12.158860 0.000000 +v 18.384411 11.974040 0.000000 +v 18.081339 11.725314 0.000000 +v 17.832613 11.422241 0.000000 +v 17.647793 11.076468 0.000000 +v 17.533981 10.701282 0.000000 +v 17.495552 10.311101 0.000000 +v 17.533981 9.920920 0.000000 +v 17.647793 9.545734 0.000000 +v 17.832613 9.199961 0.000000 +v 18.081339 8.896888 0.000000 +v 18.384411 8.648162 0.000000 +v 18.730185 8.463342 0.000000 +v 19.105371 8.349530 0.000000 +v 19.495552 8.311101 0.000000 +v 19.885733 8.349530 0.000000 +v 20.260920 8.463342 0.000000 +v 20.606693 8.648162 0.000000 +v 20.909765 8.896887 0.000000 +v 21.158491 9.199960 0.000000 +v 21.343311 9.545733 0.000000 +v 21.457123 9.920920 0.000000 +v 21.495552 10.311101 0.000000 +v 21.457123 10.701282 0.000000 +v 21.343311 11.076468 0.000000 +v 21.158491 11.422241 0.000000 +v 20.909765 11.725314 0.000000 +v 20.606693 11.974040 0.000000 +v 20.260920 12.158860 0.000000 +v 19.885733 12.272672 0.000000 +s off +f 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 12 diff --git a/src/argaze/utils/demo_environment/aoi_scene.obj b/src/argaze/utils/demo_environment/aoi_scene.obj deleted file mode 100644 index 8922e78..0000000 --- a/src/argaze/utils/demo_environment/aoi_scene.obj +++ /dev/null @@ -1,57 +0,0 @@ -# Blender v3.0.1 OBJ File: 'ar_environment.blend' -# www.blender.org -o GrayRectangle -v 0.000000 0.000000 0.000000 -v 25.000000 0.000000 0.000000 -v 0.000000 14.960000 0.000000 -v 25.000000 14.960000 0.000000 -s off -f 1 2 4 3 -o RedSquare -v 3.497026 8.309391 0.000000 -v 7.504756 8.309391 0.000000 -v 3.497026 12.314838 0.001030 -v 7.504756 12.314838 0.001030 -s off -f 5 6 8 7 -o BlueTriangle -v 10.500295 2.307687 0.000000 -v 14.503224 2.306344 0.000000 -v 12.502419 6.312207 0.001030 -s off -f 9 10 11 -o GreenCircle -v 19.495552 12.311101 0.000000 -v 19.105371 12.272672 0.000000 -v 18.730185 12.158860 0.000000 -v 18.384411 11.974040 0.000000 -v 18.081339 11.725314 0.000000 -v 17.832613 11.422241 0.000000 -v 17.647793 11.076468 0.000000 -v 17.533981 10.701282 0.000000 -v 17.495552 10.311101 0.000000 -v 17.533981 9.920920 0.000000 -v 17.647793 9.545734 0.000000 -v 17.832613 9.199961 0.000000 -v 18.081339 8.896888 0.000000 -v 18.384411 8.648162 0.000000 -v 18.730185 8.463342 0.000000 -v 19.105371 8.349530 0.000000 -v 19.495552 8.311101 0.000000 -v 19.885733 8.349530 0.000000 -v 20.260920 8.463342 0.000000 -v 20.606693 8.648162 0.000000 -v 20.909765 8.896887 0.000000 -v 21.158491 9.199960 0.000000 -v 21.343311 9.545733 0.000000 -v 21.457123 9.920920 0.000000 -v 21.495552 10.311101 0.000000 -v 21.457123 10.701282 0.000000 -v 21.343311 11.076468 0.000000 -v 21.158491 11.422241 0.000000 -v 20.909765 11.725314 0.000000 -v 20.606693 11.974040 0.000000 -v 20.260920 12.158860 0.000000 -v 19.885733 12.272672 0.000000 -s off -f 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 12 diff --git a/src/argaze/utils/demo_environment/demo_ar_features_setup.json b/src/argaze/utils/demo_environment/demo_ar_features_setup.json index 2044e35..3c1d512 100644 --- a/src/argaze/utils/demo_environment/demo_ar_features_setup.json +++ b/src/argaze/utils/demo_environment/demo_ar_features_setup.json @@ -15,15 +15,15 @@ "scenes": { "AR Scene Demo" : { "aruco_scene": "aruco_scene.obj", - "aoi_scene": "aoi_scene.obj", + "aoi_3d_scene": "aoi_3d_scene.obj", "screens": { "GrayRectangle": { - "size": [320, 240], + "size": [640, 480], "background": "screen_background.jpg", "gaze_movement_identifier": { "type": "DispersionThresholdIdentification", "parameters": { - "deviation_max_threshold": 10, + "deviation_max_threshold": 25, "duration_min_threshold": 200 } } diff --git a/src/argaze/utils/demo_environment/demo_gaze_features_setup.json b/src/argaze/utils/demo_environment/demo_gaze_features_setup.json index 02e21bc..56d5c72 100644 --- a/src/argaze/utils/demo_environment/demo_gaze_features_setup.json +++ b/src/argaze/utils/demo_environment/demo_gaze_features_setup.json @@ -2,7 +2,7 @@ "name": "AR Environment Demo", "scenes": { "AR Scene Demo" : { - "aoi_scene": "aoi_scene.obj", + "aoi_3d_scene": "aoi_3d_scene.obj", "screens": { "GrayRectangle": { "size": [1920, 1149], -- cgit v1.1