From e201f430392742e88ef6b460ba303c1899942970 Mon Sep 17 00:00:00 2001 From: Bigyuun Date: Thu, 16 May 2024 08:10:28 +0900 Subject: [PATCH 01/11] mediapipie hand landmark on realsense depth camera module(.py) update --- src/custom_interfaces/CMakeLists.txt | 58 ++ src/custom_interfaces/msg/HandLandmarks.msg | 7 + .../msg/HandLandmarksMultiArray.msg | 4 + src/custom_interfaces/package.xml | 27 + .../handpose_pkg/RealSense_Utilities.zip | Bin 0 -> 23900 bytes .../RealSense_Utilities/.gitignore | 7 + .../MATLAB/depth_options.txt | 53 ++ .../MATLAB/get_options_from_rosbag.m | 40 ++ .../MATLAB/imu_options.txt | 6 + .../MATLAB/rgb_options.txt | 33 ++ .../RealSense_Utilities/README.md | 1 + .../RealSense_Utilities/object_detection.py | 113 ++++ .../RealSense_Utilities/opencv_stream.py | 179 +++++++ .../RealSense_Utilities/opencv_stream_test.py | 59 +++ .../RealSense_Utilities/opencv_stream_v2.py | 99 ++++ .../RealSense_Utilities/opencv_stream_v3.py | 80 +++ .../realsense_api/__init__.py | 1 + .../post_processing/decimation.py | 19 + .../post_processing/hole_filling.py | 19 + .../realsense_api/post_processing/option.py | 31 ++ .../realsense_api/post_processing/options.py | 112 ++++ .../realsense_api/post_processing/spatial.py | 64 +++ .../realsense_api/post_processing/temporal.py | 31 ++ .../realsense_api/realsense_api.py | 344 ++++++++++++ .../handpose_pkg/RealSense_Utilities/test.py | 4 + ...dpose_indexfinger_publisher.cpython-38.pyc | Bin 9123 -> 9123 bytes src/handpose_pkg/handpose_pkg/d405.json | 90 ++++ src/handpose_pkg/handpose_pkg/d455_0321.json | 104 ++++ .../handpose_pkg/handlandmark_keypoints.json | 25 + .../handpose_pkg/mediapipe_hands.py | 497 ++++++++++++++++++ src/handpose_pkg/package.xml | 1 + 31 files changed, 2108 insertions(+) create mode 100644 src/custom_interfaces/CMakeLists.txt create mode 100644 src/custom_interfaces/msg/HandLandmarks.msg create mode 100644 src/custom_interfaces/msg/HandLandmarksMultiArray.msg create mode 100644 src/custom_interfaces/package.xml create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities.zip create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/.gitignore create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/depth_options.txt create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/get_options_from_rosbag.m create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/imu_options.txt create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/rgb_options.txt create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/README.md create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/object_detection.py create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream.py create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_test.py create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_v2.py create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_v3.py create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/__init__.py create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/decimation.py create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/hole_filling.py create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/option.py create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/options.py create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/spatial.py create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/temporal.py create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/realsense_api.py create mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/test.py create mode 100644 src/handpose_pkg/handpose_pkg/d405.json create mode 100644 src/handpose_pkg/handpose_pkg/d455_0321.json create mode 100644 src/handpose_pkg/handpose_pkg/handlandmark_keypoints.json create mode 100644 src/handpose_pkg/handpose_pkg/mediapipe_hands.py diff --git a/src/custom_interfaces/CMakeLists.txt b/src/custom_interfaces/CMakeLists.txt new file mode 100644 index 0000000..4ffc82b --- /dev/null +++ b/src/custom_interfaces/CMakeLists.txt @@ -0,0 +1,58 @@ +cmake_minimum_required(VERSION 3.5) +project(custom_interfaces) + +# Default to C99 +if(NOT CMAKE_C_STANDARD) + set(CMAKE_C_STANDARD 99) +endif() + +# Default to C++14 +if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 14) +endif() + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +find_package(std_msgs REQUIRED) +find_package(geometry_msgs REQUIRED) +find_package(sensor_msgs REQUIRED) +find_package(builtin_interfaces REQUIRED) +find_package(rosidl_default_generators REQUIRED) + +set(msg_files + "msg/HandLandmarks.msg" + "msg/HandLandmarksMultiArray.msg" +) + +set(srv_files + # file +) + +set(action_files + # file +) + +rosidl_generate_interfaces(${PROJECT_NAME} + ${msg_files} + ${srv_files} + ${action_files} + # DEPENDENCIES builtin_interfaces + DEPENDENCIES builtin_interfaces std_msgs geometry_msgs sensor_msgs +) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + # the following line skips the linter which checks for copyrights + # uncomment the line when a copyright and license is not present in all source files + #set(ament_cmake_copyright_FOUND TRUE) + # the following line skips cpplint (only works in a git repo) + # uncomment the line when this package is not in a git repo + #set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +ament_package() diff --git a/src/custom_interfaces/msg/HandLandmarks.msg b/src/custom_interfaces/msg/HandLandmarks.msg new file mode 100644 index 0000000..55d9c58 --- /dev/null +++ b/src/custom_interfaces/msg/HandLandmarks.msg @@ -0,0 +1,7 @@ +# Motor operating target values +# builtin_interfaces/Time stamp +# std_msgs/Header header +uint8 index +string label +float32 score +std_msgs/Float64MultiArray landmarks \ No newline at end of file diff --git a/src/custom_interfaces/msg/HandLandmarksMultiArray.msg b/src/custom_interfaces/msg/HandLandmarksMultiArray.msg new file mode 100644 index 0000000..b337140 --- /dev/null +++ b/src/custom_interfaces/msg/HandLandmarksMultiArray.msg @@ -0,0 +1,4 @@ +# Motor operating target values +# builtin_interfaces/Time stamp +std_msgs/Header header +custom_interfaces/HandLandmarks[] hands \ No newline at end of file diff --git a/src/custom_interfaces/package.xml b/src/custom_interfaces/package.xml new file mode 100644 index 0000000..8a074d7 --- /dev/null +++ b/src/custom_interfaces/package.xml @@ -0,0 +1,27 @@ + + + + custom_interfaces + 0.0.0 + TODO: Package description + daeyun + Apache-2.0 + + ament_cmake + rosidl_default_generators + + std_msgs + geometry_msgs + sensor_msgs + + builtin_interfaces + rosidl_default_runtime + rosidl_interface_packages + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities.zip b/src/handpose_pkg/handpose_pkg/RealSense_Utilities.zip new file mode 100644 index 0000000000000000000000000000000000000000..d622e4726c4ed157796325eaf304941d2c62b8c2 GIT binary patch literal 23900 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

oI(S@fU?Wf_` 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 None: + self.options: OptionDict = { + OptionType.MAGNITUDE: OptionValues( + option_value=2, + option_value_increment=1, + option_min_value=1, + option_max_value=8 + ) + } + + def increment(self, option: OptionValues) -> None: + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/hole_filling.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/hole_filling.py new file mode 100644 index 0000000..7de60fa --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/hole_filling.py @@ -0,0 +1,19 @@ +# https://dev.intelrealsense.com/docs/post-processing-filters +from option import OptionValues, OptionType, FilterOptions + + +class HoleFillingOptions(FilterOptions): + def __init__(self) -> None: + self.options: OptionDict = { + OptionType.MAGNITUDE: OptionValues( + option_value=1, + option_value_increment=1, + option_min_value=0, + option_max_value=2 + ) + } + + def increment(self, option: OptionValues) -> None: + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/option.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/option.py new file mode 100644 index 0000000..73aa770 --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/option.py @@ -0,0 +1,31 @@ +from typing import TypedDict +from dataclasses import dataclass +from enum import Enum, auto +from abc import ABC, abstractmethod + + +class OptionType(Enum): + MAGNITUDE = auto() + SMOOTH_ALPHA = auto() + SMOOTH_DELTA = auto() + HOLE_FILLING = auto() + PERSISTENCY_INDEX = auto() + + +@dataclass +class OptionValues: + option_value: float + option_value_increment: float + option_min_value: float + option_max_value: float + + +# class OptionDict(TypedDict): +# option: OptionType +# properties: OptionValues + + +class FilterOptions(ABC): + @abstractmethod + def increment(self, option: OptionValues) -> None: + pass diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/options.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/options.py new file mode 100644 index 0000000..219759b --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/options.py @@ -0,0 +1,112 @@ +# https://dev.intelrealsense.com/docs/post-processing-filters +from RealSense_Utilities.realsense_api.post_processing.option import OptionValues, OptionType, FilterOptions + + +############################################################# +# -------------------- DECIMATION OPTIONS -------------------# +############################################################# +class DecimationOptions(FilterOptions): + def __init__(self) -> None: + self.options: dict = { + OptionType.MAGNITUDE: OptionValues( + option_value=2, + option_value_increment=1, + option_min_value=1, + option_max_value=8 + ) + } + + def increment(self, option: OptionValues) -> None: + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value + + +############################################################# +# --------------------- SPATIAL OPTIONS ---------------------# +############################################################# +class SpatialOptions(FilterOptions): + def __init__(self) -> None: + self.options: dict = { + OptionType.MAGNITUDE: OptionValues( + option_value=2, + option_value_increment=1, + option_min_value=0, + option_max_value=5 + ), + OptionType.SMOOTH_ALPHA: OptionValues( + option_value=0.5, + option_value_increment=0.25, + option_min_value=0.0, + option_max_value=1.0 + ), + OptionType.SMOOTH_DELTA: OptionValues( + option_value=2, + option_value_increment=1, + option_min_value=0, + option_max_value=5 + ), + OptionType.HOLE_FILLING: OptionValues( + option_value=0, + option_value_increment=1, + option_min_value=0, + option_max_value=5 + ) + } + + def increment(self, option: OptionValues): + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value + + +############################################################# +# --------------------- TEMPORAL OPTIONS --------------------# +############################################################# +class TemporalOptions(FilterOptions): + def __init__(self) -> None: + self.options: dict = { + OptionType.SMOOTH_ALPHA: OptionValues( + option_value=0.4, + option_value_increment=0.1, + option_min_value=0.0, + option_max_value=1.0 + ), + OptionType.SMOOTH_DELTA: OptionValues( + option_value=20, + option_value_increment=10, + option_min_value=0, + option_max_value=100 + ), + OptionType.PERSISTENCY_INDEX: OptionValues( + option_value=3, + option_value_increment=1, + option_min_value=0, + option_max_value=8 + ) + } + + def increment(self, option: OptionValues) -> None: + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value + + +############################################################# +# ------------------- HOLE FILLING OPTIONS ------------------# +############################################################# +class HoleFillingOptions(FilterOptions): + def __init__(self) -> None: + self.options: dict = { + OptionType.HOLE_FILLING: OptionValues( + option_value=1, + option_value_increment=1, + option_min_value=0, + option_max_value=2 + ) + } + + def increment(self, option: OptionValues) -> None: + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/spatial.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/spatial.py new file mode 100644 index 0000000..b6f73d3 --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/spatial.py @@ -0,0 +1,64 @@ +# https://dev.intelrealsense.com/docs/post-processing-filters +from dataclasses import asdict, dataclass, field +from option import OptionValues, OptionType, OptionDict, FilterOptions + + +class SpatialOptions(FilterOptions): + def __init__(self) -> None: + self.options: OptionDict = { + OptionType.MAGNITUDE: OptionValues( + option_value=2, + option_value_increment=1, + option_min_value=0, + option_max_value=5 + ), + OptionType.SMOOTH_ALPHA: OptionValues( + option_value=0.5, + option_value_increment=0.25, + option_min_value=0.0, + option_max_value=1.0 + ), + OptionType.SMOOTH_DELTA: OptionValues( + option_value=2, + option_value_increment=1, + option_min_value=0, + option_max_value=5 + ), + OptionType.HOLE_FILLING: OptionValues( + option_value=0, + option_value_increment=1, + option_min_value=0, + option_max_value=5 + ) + } + + def increment(self, option: OptionValues): + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value + +# spatial_filter = SpatialOptions() +# spatial_filter2 = SpatialOptions() + +# # # spatial_options = asdict(spatial_filter.options) +# spatial_filter.options[OptionType.SMOOTH_ALPHA].option_value_increment = 0.1 +# spatial_filter2.options[OptionType.SMOOTH_ALPHA].option_value_increment = 0.25 + +# spatial_filter_hole_filling = spatial_filter.options[OptionType.SMOOTH_ALPHA] +# spatial_filter_hole_filling2 = spatial_filter2.options[OptionType.SMOOTH_ALPHA] + +# for i in range(20): +# print(f'{spatial_filter_hole_filling.option_value} {spatial_filter_hole_filling2.option_value}') +# spatial_filter.increment(spatial_filter_hole_filling) +# spatial_filter2.increment(spatial_filter_hole_filling2) + +# print(type(spatial_filter)) +# for i,v in spatial_options.items(): +# print(i,v) + +# =a.hole_filling +# print(o.option_value) +# for i in range(7): +# a.increment(o) +# for i in spatial_filter.options: +# print(i) diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/temporal.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/temporal.py new file mode 100644 index 0000000..c6ae54c --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/temporal.py @@ -0,0 +1,31 @@ +# https://dev.intelrealsense.com/docs/post-processing-filters +from option import OptionValues, OptionType, OptionDict, FilterOptions + + +class TemporalOptions(FilterOptions): + def __init__(self) -> None: + self.options: OptionDict = { + OptionType.SMOOTH_ALPHA: OptionValues( + option_value=0.4, + option_value_increment=0.1, + option_min_value=0.0, + option_max_value=1.0 + ), + OptionType.SMOOTH_DELTA: OptionValues( + option_value=20, + option_value_increment=10, + option_min_value=0, + option_max_value=100 + ), + OptionType.HOLE_FILLING: OptionValues( + option_value=3, + option_value_increment=1, + option_min_value=0, + option_max_value=8 + ) + } + + def increment(self, option: OptionValues) -> None: + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/realsense_api.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/realsense_api.py new file mode 100644 index 0000000..902d26a --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/realsense_api.py @@ -0,0 +1,344 @@ +import numpy as np +import pyrealsense2 as rs +import json +import cv2 +from threading import Thread +from multiprocessing.pool import ThreadPool +# from realsense_api.post_processing.option import OptionType +from RealSense_Utilities.realsense_api.post_processing.options import \ + DecimationOptions, SpatialOptions, TemporalOptions, HoleFillingOptions, OptionType + + +# TODO: +# - Create a method for loading the json options that are generated by the realsense viewer +# - Create a method for displaying the options that are currently set +# - Add any remaining stream types into the get data method such as confidence +# - Add any other post processing filters that are missing + +# Links that I thought would be useful later: +# https://intelrealsense.github.io/librealsense/python_docs/_generated/pyrealsense2.threshold_filter.html?highlight=process +# https://github.com/IntelRealSense/librealsense/issues/6902 +# https://github.com/IntelRealSense/librealsense/issues/10078 + +def frame_to_np_array(frame, colorize_depth=False): + # Create colorized depth frame + if colorize_depth: + colorizer = rs.colorizer() + frame_as_image = np.asanyarray(colorizer.colorize(frame).get_data()) + return frame_as_image + frame_as_image = np.asanyarray(frame.get_data()) + return frame_as_image + + +def find_realsense(): + realsense_ctx = rs.context() + connected_devices = [] + serial_number = [] + for i in range(len(realsense_ctx.devices)): + detected_camera = realsense_ctx.devices[i] + connected_devices.append(detected_camera) + serial_number.append(detected_camera.get_info(rs.camera_info.serial_number)) + + return zip(serial_number, connected_devices) + + +def mediapipe_detection(image, model): + image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # COLOR CONVERSION BGR 2 RGB + image.flags.writeable = False # Image is no longer writeable + results = model.process(image) # Make prediction + image.flags.writeable = True # Image is now writeable + image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # COLOR CONVERSION RGB 2 BGR + return image, results + + +class RealSenseCamera: + def __init__(self, + depth_stream_width=848, depth_stream_height=480, + color_stream_width=640, color_stream_height=480, + depth_stream_fps=90, color_stream_fps=60, + device=None, adv_mode_flag=False, device_type='d455', + mp_lock=None, disable_color_auto_exposure=False): + + self.device = device + self.device_type = device_type + + self.current_timestamp = 0 + + self.colored_depthmap = None + self.color_image = None + self.depth_image = None + + # Resolution attributes + self.depth_stream_width = depth_stream_width + self.depth_stream_height = depth_stream_height + self.color_stream_width = color_stream_width + self.color_stream_height = color_stream_height + + self.depth_stream_fps = depth_stream_fps + self.color_stream_fps = color_stream_fps + + # Data attributes that will be set with get_data() + self.frameset = None + self.depth_frame = None + self.color_frame = None + self.infrared_frame = None + self.color_intrinsics = None + self.depth_intrinsics = None + self.depth_scale = None + self.camera_matrix = None + self.dist_coeffs = None + + # Holds the frameset after it has undergone filtering + self.filtered_frameset = None + + # Aligned frame holders + self.depth_frame_aligned = None + self.color_frame_aligned = None + + # Post Processing Filter attributes with default values + # https://dev.intelrealsense.com/docs/post-processing-filters + + self.decimation: DecimationOptions = DecimationOptions() + self.spatial: SpatialOptions = SpatialOptions() + self.temporal: TemporalOptions = TemporalOptions() + self.hole_filling: HoleFillingOptions = HoleFillingOptions() + + # Decimation filter attribute + self.decimation_magnitude = 3 + + # Spatial filter attributes + self.spatial_magnitude = 2 + self.spatial_smooth_alpha = 0.4 + self.spatial_smooth_delta = 4 + self.spatial_holes_fill = 0 + + # Temporal filter attributes + self.temporal_smooth_alpha = 0.1 + self.temporal_smooth_delta = 20 + self.persistency_index = 5 + + # Holes Filling filter attribute + self.hole_filling_param = 1 + + self.decimation_filter = rs.decimation_filter() + self.decimation_filter.set_option( + rs.option.filter_magnitude, + self.decimation_magnitude + ) + + self.spatial_filter = rs.spatial_filter() + self.spatial_filter.set_option( + rs.option.filter_magnitude, + self.spatial_magnitude + ) + self.spatial_filter.set_option( + rs.option.filter_smooth_alpha, + self.spatial_smooth_alpha + ) + self.spatial_filter.set_option( + rs.option.filter_smooth_delta, + self.spatial_smooth_delta + ) + self.spatial_filter.set_option( + rs.option.holes_fill, + self.spatial_holes_fill + ) + + self.temporal_filter = rs.temporal_filter() + self.temporal_filter.set_option( + rs.option.filter_smooth_alpha, + self.temporal_smooth_alpha + ) + self.temporal_filter.set_option( + rs.option.filter_smooth_delta, + self.temporal_smooth_delta + ) + self.temporal_filter.set_option( + rs.option.holes_fill, + self.persistency_index + ) + + self.hole_filling_filter = rs.hole_filling_filter() + self.hole_filling_filter.set_option( + rs.option.holes_fill, + self.hole_filling_param + ) + + self.depth_to_disparity = rs.disparity_transform(True) + self.disparity_to_depth = rs.disparity_transform(False) + + # json profile + if self.device_type == 'd455': + self.jsonObj = json.load(open("./d455_0321.json")) + elif self.device_type == 'd405': + self.jsonObj = json.load(open("./d405.json")) + elif self.device_type == 'd415': + self.jsonObj = json.load(open("./d415_0131.json")) + + self.pipeline = rs.pipeline() + config = rs.config() + + config.enable_device(self.device.get_info(rs.camera_info.serial_number)) + + config.enable_stream(rs.stream.depth, + self.depth_stream_width, self.depth_stream_height, + rs.format.z16, self.depth_stream_fps) + + config.enable_stream(rs.stream.color, + self.color_stream_width, self.color_stream_height, + rs.format.bgr8, self.color_stream_fps) + + config.enable_stream(rs.stream.infrared, + rs.format.y8, + self.depth_stream_fps) + + self.profile = self.pipeline.start(config) + + self.sensor = self.device.query_sensors() + + self.mp_lock = mp_lock + + # Get depth scale + depth_sensor = self.profile.get_device().first_depth_sensor() + depth_sensor.set_option(rs.option.emitter_enabled, 1) + self.depth_scale = depth_sensor.get_depth_scale() + + self.color_intrinsics = self.profile.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() + self.depth_intrinsics = self.profile.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() + self.camera_matrix = np.array( + [[self.color_intrinsics.fx, 0, self.color_intrinsics.ppx], + [0, self.color_intrinsics.fy, self.color_intrinsics.ppy], + [0, 0, 1]], + dtype=np.float64) + self.dist_coeffs = np.array([self.color_intrinsics.coeffs], dtype=np.float64) + + if adv_mode_flag: + self.adv_mode() + + if disable_color_auto_exposure: + color_sensor = self.sensor[1] + color_sensor.set_option(rs.option.auto_exposure_priority, 0) + color_sensor.set_option(rs.option.enable_auto_exposure, 0) + + def __iter__(self): + return self.device.get_info(rs.camera_info.serial_number) + + # def get_options(self): + def get_data(self): + if self.mp_lock is not None: + self.mp_lock.acquire() + + frameset = self.pipeline.wait_for_frames() + try: + self.current_timestamp = frameset.get_timestamp() + # self.frameset.keep() + self.depth_frame = frameset.get_depth_frame() + self.color_frame = frameset.get_color_frame() + self.infrared_frame = frameset.first(rs.stream.infrared) + + self.frameset = frameset + + except RuntimeError as e: + print(str(self.device.get_info(rs.camera_info.serial_number)) + " camera can't polling frame") + + if self.mp_lock is not None: + self.mp_lock.release() + + def get_aligned_frames(self, frameset, aligned_to_color=False, aligned_to_depth=False): + if aligned_to_color: + align_to = rs.stream.color + align = rs.align(align_to) + frameset = align.process(frameset) + + if aligned_to_depth: + align_to = rs.stream.depth + align = rs.align(align_to) + frameset = align.process(frameset) + + self.depth_frame_aligned = frameset.get_depth_frame() + self.color_frame_aligned = frameset.get_color_frame() + self.frameset = frameset + + def filter_depth_data(self, + enable_decimation=False, + enable_spatial=False, + enable_temporal=False, + enable_hole_filling=False): + + """Apply a cascade of filters on the depth frame""" + depth_to_disparity = rs.disparity_transform(True) + disparity_to_depth = rs.disparity_transform(False) + + frameset = self.frameset + # DECIMATION FILTER + if enable_decimation: + decimation = rs.decimation_filter() + decimation.set_option( + rs.option.filter_magnitude, + self.decimation.options[OptionType.MAGNITUDE].option_value + ) + frameset = decimation.process(frameset).as_frameset() + + # depth to disparity + frameset = depth_to_disparity.process(frameset).as_frameset() + + # SPATIAL FILTER + if enable_spatial: + spatial = rs.spatial_filter() + spatial.set_option( + rs.option.filter_magnitude, + self.spatial.options[OptionType.MAGNITUDE].option_value + ) + spatial.set_option( + rs.option.filter_smooth_alpha, + self.spatial.options[OptionType.SMOOTH_ALPHA].option_value + ) + spatial.set_option( + rs.option.filter_smooth_delta, + self.spatial.options[OptionType.SMOOTH_DELTA].option_value + ) + spatial.set_option( + rs.option.holes_fill, + self.spatial.options[OptionType.HOLE_FILLING].option_value + ) + frameset = spatial.process(frameset).as_frameset() + + # TEMPORAL FILTER + if enable_temporal: + temporal = rs.temporal_filter() + temporal.set_option( + rs.option.filter_smooth_alpha, + self.temporal.options[OptionType.SMOOTH_ALPHA].option_value + ) + temporal.set_option( + rs.option.filter_smooth_delta, + self.temporal.options[OptionType.SMOOTH_DELTA].option_value + ) + temporal.set_option( + rs.option.holes_fill, + self.temporal.options[OptionType.PERSISTENCY_INDEX].option_value + ) + frameset = temporal.process(frameset).as_frameset() + + # disparity to depth + frameset = disparity_to_depth.process(frameset).as_frameset() + + # HOLE FILLING + if enable_hole_filling: + hole_filling = rs.hole_filling_filter() + hole_filling.set_option( + rs.option.holes_fill, + self.hole_filling.options[OptionType.HOLE_FILLING].option_value + ) + frameset = hole_filling.process(frameset).as_frameset() + + self.filtered_frameset = frameset + + def adv_mode(self): + json_string = str(self.jsonObj).replace("'", '\"') + + advnc_mode_arg = rs.rs400_advanced_mode(self.device) + advnc_mode_arg.load_json(json_string) + + def stop(self): + self.pipeline.stop() diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/test.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/test.py new file mode 100644 index 0000000..d6f77c3 --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/test.py @@ -0,0 +1,4 @@ +from realsense_api.post_processing.decimation import DecimationOptions +from realsense_api.post_processing.spatial import SpatialOptions +from realsense_api.post_processing.temporal import TemporalOptions +from realsense_api.post_processing.hole_filling import HoleFillingOptions \ No newline at end of file diff --git a/src/handpose_pkg/handpose_pkg/__pycache__/handpose_indexfinger_publisher.cpython-38.pyc b/src/handpose_pkg/handpose_pkg/__pycache__/handpose_indexfinger_publisher.cpython-38.pyc index d63914f871d46f54251d75f9084bc50f64b30fe6..8f9cf74e1ea90482ff86121f2f3f0381446b9434 100644 GIT binary patch delta 20 acmZ4NzSx~Rl$V!_0SI=#vE0Z#Lm2=$z6G!V delta 20 acmZ4NzSx~Rl$V!_0SM~$$!z4Fp$q^vZUra+ diff --git a/src/handpose_pkg/handpose_pkg/d405.json b/src/handpose_pkg/handpose_pkg/d405.json new file mode 100644 index 0000000..2667648 --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/d405.json @@ -0,0 +1,90 @@ +{ + "device": { + "fw version": "5.15.1", + "name": "Intel RealSense D405", + "product line": "D400" + }, + "parameters": { + "aux-param-autoexposure-setpoint": "1000", + "aux-param-colorcorrection1": "-0.0556641", + "aux-param-colorcorrection10": "-0.194336", + "aux-param-colorcorrection11": "-0.194336", + "aux-param-colorcorrection12": "-0.589844", + "aux-param-colorcorrection2": "0.560547", + "aux-param-colorcorrection3": "0.560547", + "aux-param-colorcorrection4": "0.170898", + "aux-param-colorcorrection5": "-0.275391", + "aux-param-colorcorrection6": "-0.238281", + "aux-param-colorcorrection7": "-0.238281", + "aux-param-colorcorrection8": "1.34766", + "aux-param-colorcorrection9": "0.959961", + "aux-param-depthclampmax": "65536", + "aux-param-depthclampmin": "0", + "aux-param-disparityshift": "0", + "controls-autoexposure-auto": "False", + "controls-autoexposure-manual": "8500", + "controls-depth-gain": "16", + "controls-depth-white-balance-auto": "True", + "ignoreSAD": "0", + "param-amplitude-factor": "0", + "param-autoexposure-setpoint": "1000", + "param-censusenablereg-udiameter": "9", + "param-censusenablereg-vdiameter": "9", + "param-censususize": "9", + "param-censusvsize": "9", + "param-depthclampmax": "65536", + "param-depthclampmin": "0", + "param-depthunits": "1000", + "param-disableraucolor": "0", + "param-disablesadcolor": "0", + "param-disablesadnormalize": "0", + "param-disablesloleftcolor": "0", + "param-disableslorightcolor": "0", + "param-disparitymode": "0", + "param-disparityshift": "0", + "param-lambdaad": "800", + "param-lambdacensus": "26", + "param-leftrightthreshold": "24", + "param-maxscorethreshb": "2047", + "param-medianthreshold": "500", + "param-minscorethresha": "1", + "param-neighborthresh": "7", + "param-raumine": "1", + "param-rauminn": "1", + "param-rauminnssum": "3", + "param-raumins": "1", + "param-rauminw": "1", + "param-rauminwesum": "3", + "param-regioncolorthresholdb": "0.0499022", + "param-regioncolorthresholdg": "0.0499022", + "param-regioncolorthresholdr": "0.0499022", + "param-regionshrinku": "3", + "param-regionshrinkv": "1", + "param-robbinsmonrodecrement": "10", + "param-robbinsmonroincrement": "10", + "param-rsmdiffthreshold": "4", + "param-rsmrauslodiffthreshold": "1", + "param-rsmremovethreshold": "0.375", + "param-scanlineedgetaub": "72", + "param-scanlineedgetaug": "72", + "param-scanlineedgetaur": "72", + "param-scanlinep1": "60", + "param-scanlinep1onediscon": "105", + "param-scanlinep1twodiscon": "70", + "param-scanlinep2": "342", + "param-scanlinep2onediscon": "190", + "param-scanlinep2twodiscon": "130", + "param-secondpeakdelta": "325", + "param-texturecountthresh": "0", + "param-texturedifferencethresh": "0", + "param-usersm": "1", + "param-zunits": "1000" + }, + "schema version": 1, + "viewer": { + "stream-depth-format": "Z16", + "stream-fps": "30", + "stream-height": "480", + "stream-width": "848" + } +} \ No newline at end of file diff --git a/src/handpose_pkg/handpose_pkg/d455_0321.json b/src/handpose_pkg/handpose_pkg/d455_0321.json new file mode 100644 index 0000000..1bd164f --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/d455_0321.json @@ -0,0 +1,104 @@ +{ + "device": { + "fw version": "05.13.00.50", + "name": "Intel RealSense D455", + "product line": "D400" + }, + "parameters": { + "aux-param-autoexposure-setpoint": "1000", + "aux-param-colorcorrection1": "-0.493164", + "aux-param-colorcorrection10": "-0.272461", + "aux-param-colorcorrection11": "-0.272461", + "aux-param-colorcorrection12": "-0.355469", + "aux-param-colorcorrection2": "0.831055", + "aux-param-colorcorrection3": "0.831055", + "aux-param-colorcorrection4": "-0.368164", + "aux-param-colorcorrection5": "-0.133789", + "aux-param-colorcorrection6": "-0.323242", + "aux-param-colorcorrection7": "-0.323242", + "aux-param-colorcorrection8": "1.19141", + "aux-param-colorcorrection9": "0.90918", + "aux-param-depthclampmax": "1500", + "aux-param-depthclampmin": "0", + "aux-param-disparityshift": "0", + "controls-autoexposure-auto": "True", + "controls-autoexposure-manual": "3500", + "controls-color-autoexposure-auto": "True", + "controls-color-autoexposure-manual": "156", + "controls-color-backlight-compensation": "0", + "controls-color-brightness": "0", + "controls-color-contrast": "50", + "controls-color-gain": "64", + "controls-color-gamma": "300", + "controls-color-hue": "0", + "controls-color-power-line-frequency": "3", + "controls-color-saturation": "64", + "controls-color-sharpness": "50", + "controls-color-white-balance-auto": "True", + "controls-color-white-balance-manual": "4600", + "controls-depth-gain": "16", + "controls-laserpower": "360", + "controls-laserstate": "on", + "ignoreSAD": "0", + "param-amplitude-factor": "0.08", + "param-autoexposure-setpoint": "1000", + "param-censusenablereg-udiameter": "9", + "param-censusenablereg-vdiameter": "9", + "param-censususize": "9", + "param-censusvsize": "9", + "param-depthclampmax": "1500", + "param-depthclampmin": "0", + "param-depthunits": "1000", + "param-disableraucolor": "0", + "param-disablesadcolor": "0", + "param-disablesadnormalize": "0", + "param-disablesloleftcolor": "0", + "param-disableslorightcolor": "0", + "param-disparitymode": "0", + "param-disparityshift": "0", + "param-lambdaad": "800", + "param-lambdacensus": "26", + "param-leftrightthreshold": "24", + "param-maxscorethreshb": "2047", + "param-medianthreshold": "500", + "param-minscorethresha": "1", + "param-neighborthresh": "7", + "param-raumine": "1", + "param-rauminn": "1", + "param-rauminnssum": "3", + "param-raumins": "1", + "param-rauminw": "1", + "param-rauminwesum": "3", + "param-regioncolorthresholdb": "0.0499022", + "param-regioncolorthresholdg": "0.0499022", + "param-regioncolorthresholdr": "0.0499022", + "param-regionshrinku": "3", + "param-regionshrinkv": "1", + "param-robbinsmonrodecrement": "10", + "param-robbinsmonroincrement": "10", + "param-rsmdiffthreshold": "4", + "param-rsmrauslodiffthreshold": "1", + "param-rsmremovethreshold": "0.375", + "param-scanlineedgetaub": "72", + "param-scanlineedgetaug": "72", + "param-scanlineedgetaur": "72", + "param-scanlinep1": "60", + "param-scanlinep1onediscon": "105", + "param-scanlinep1twodiscon": "70", + "param-scanlinep2": "342", + "param-scanlinep2onediscon": "190", + "param-scanlinep2twodiscon": "130", + "param-secondpeakdelta": "325", + "param-texturecountthresh": "0", + "param-texturedifferencethresh": "0", + "param-usersm": "1", + "param-zunits": "1000" + }, + "schema version": 1, + "viewer": { + "stream-depth-format": "Z16", + "stream-fps": "90", + "stream-height": "480", + "stream-width": "848" + } +} \ No newline at end of file diff --git a/src/handpose_pkg/handpose_pkg/handlandmark_keypoints.json b/src/handpose_pkg/handpose_pkg/handlandmark_keypoints.json new file mode 100644 index 0000000..05cb2a6 --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/handlandmark_keypoints.json @@ -0,0 +1,25 @@ +{ + "keypoints": { + "wrist": 0, + "thumb_cmc": 1, + "thumb_mcp": 2, + "thumb_ip": 3, + "thumb_tip": 4, + "index_finger_mcp": 5, + "index_finger_pip": 6, + "index_finger_dip": 7, + "index_finger_tip": 8, + "middle_finger_mcp": 9, + "middle_finger_pip": 10, + "middle_finger_dip": 11, + "middle_finger_tip": 12, + "ring_finger_mcp": 13, + "ring_finger_pip": 14, + "ring_finger_dip": 15, + "ring_finger_tip": 16, + "pinky_mcp": 17, + "pinky_pip": 18, + "pinky_dip": 19, + "pinky_tip": 20 + } +} \ No newline at end of file diff --git a/src/handpose_pkg/handpose_pkg/mediapipe_hands.py b/src/handpose_pkg/handpose_pkg/mediapipe_hands.py new file mode 100644 index 0000000..00d8c3b --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/mediapipe_hands.py @@ -0,0 +1,497 @@ +import mediapipe as mp +import cv2 +import numpy as np +import uuid +import os +import pyrealsense2 as rs +import time +import matplotlib +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +from matplotlib.animation import FuncAnimation +from functools import partial +import threading +# matplotlib.use('Agg') + +import json + +from RealSense_Utilities.realsense_api.realsense_api import RealSenseCamera +from RealSense_Utilities.realsense_api.realsense_api import find_realsense +from RealSense_Utilities.realsense_api.realsense_api import frame_to_np_array + +import queue + +queue = queue.Queue() + + +class HandLandmarks(): + def __init__(self): + self.keypoints = json.load(open("./handlandmark_keypoints.json")) + self.hand_landmarks = {} # tuple + self.hand_landmarks['index'] = None + self.hand_landmarks['score'] = None + self.hand_landmarks['label'] = None + self.hand_landmarks['landmarks'] = None + self.hand_landmarks['world_landmarks'] = None # calculate from camera instrinsic(Realsense) + + # if serveral hands is detected, hand_results will has objects of each hands. + # e.g. [{hand_landmarks#1}, {hand_landmarks#2}, ...] + self.hand_results = [] + + pass + + +class MediaPipeHandLandmarkDetector(HandLandmarks): + # pass + def __init__(self): + super().__init__() + self.camera_to_hand_vector = {'x': 0, 'y': 0, 'z': 0} + self.hand_data = np.zeros((21, 3)) + self.mp_drawing = mp.solutions.drawing_utils + self.mp_hands = mp.solutions.hands + self.hands = self.mp_hands.Hands(min_detection_confidence=0.8, + min_tracking_confidence=0.7) + # smoothing (LPF-low pass filter) + self.depth_intrinsics = None + self.finger_depth_prev = 0 + self.finger_depth_curr = 0 + self.filter_sensitivity = 0.3 + + self.color_image = None + self.depth_image = None + self.depth_image_prev = None + self.start_flag = False + + self.pps = 0 + + def hand_detection(self, color_frame, depth_frame, depth_intrinsic=None): + + ###################################################### + # Flip the image horizontally for a later selfie-view display, and convert + # the BGR image to RGB. + self.depth_intrinsics = depth_intrinsic + self.color_image = color_frame + self.color_image = cv2.flip(self.color_image, 1) + self.color_image = cv2.cvtColor(self.color_image, cv2.COLOR_BGR2RGB) + self.depth_image = depth_frame + + if self.start_flag == False: + self.depth_image_filtered = self.depth_image + else: + self.depth_image_filtered = self.filter_sensitivity * self.depth_image + ( + 1 - self.filter_sensitivity) * self.depth_image_prev + + self.depth_image_filtered = cv2.flip(self.depth_image_filtered, 1) + self.depth_image_prev = self.depth_image_filtered + # depth_norm_image = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.3), cv2.COLORMAP_JET) + + # To improve performance, optionally mark the image as not writeable to + # pass by reference. + self.color_image.flags.writeable = False + results = self.hands.process(self.color_image) + image_height, image_width, _ = self.color_image.shape + depth_image_height, depth_image_width = self.depth_image_filtered.shape + if image_height != depth_image_height or image_width != depth_image_width: + print(f'[mediapipe_hands.py | Warning] It does not match a size (H x W) of color & depth frame') + # Draw the hand annotations on the image. + self.color_image.flags.writeable = True + self.color_image = cv2.cvtColor(self.color_image, cv2.COLOR_RGB2BGR) + ###################################################### + + self.hand_results.clear() + + if results.multi_handedness: + + s_time = time.time() + + for handedness, hand_landmarks in zip(results.multi_handedness, results.multi_hand_landmarks): + # dictionary clear + self.hand_landmarks = {key: None for key in self.hand_landmarks} + + classification = handedness.classification[0] + index = classification.index + score = classification.score + label = classification.label + self.hand_landmarks['index'] = classification.index + self.hand_landmarks['score'] = classification.score + self.hand_landmarks['label'] = classification.label + + hand_data = np.zeros((21, 3)) + for idx, landmrk in enumerate(hand_landmarks.landmark): + cx, cy, cz = landmrk.x, landmrk.y, landmrk.z + hand_data[idx, 0] = cx + hand_data[idx, 1] = cy + hand_data[idx, 2] = cz + + pixel_x = int(cx * image_width) + pixel_y = int(cy * image_height) + + self.hand_landmarks['landmarks'] = hand_data + + world_landmarks = self.conversion_hand_keypoint_pixel_to_point(hand_data, top_point_n=None) + self.hand_landmarks['world_landmarks'] = world_landmarks + + # finally + self.hand_results.append(self.hand_landmarks) + + # drawing points on image + self.mp_drawing.draw_landmarks( + self.color_image, + hand_landmarks, + self.mp_hands.HAND_CONNECTIONS, + # mp_drawing_styles.get_default_hand_landmarks_style(), + # mp_drawing_styles.get_default_hand_connections_style() + ) + + # print(pixel_x, pixel_y) + # if pixel_x>0 and pixel_x0 and pixel_y= w or y <= 0 or y >= h: + ''' out of index ''' + return + + z = self.depth_image_filtered[y, x] + xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) + align_keypoint_world_arr.append(xyz_world) + + return align_keypoint_world_arr + + elif isinstance(top_point_n, int): + z_arr = keypoint_arr[:, 2] # depth values + min_z = np.min(z_arr) + min_z_index = np.argmin(z_arr) + ########################################################## + ## select top N values and obtain scale of x,y and z + # - start + b_ids, b_values = self.get_bottom_n_values(z_arr, n=top_point_n) + + selected_keypoint_arr = keypoint_arr[b_ids] + + selected_keypoint_world_arr = [] + offset_min_z = 0 + h, w = self.depth_image_filtered.shape + for idx, pixel_xyz in enumerate(selected_keypoint_arr): + x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow + y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow + if x <= 0 or x >= w or y <= 0 or y >= h: + ''' out of index ''' + return + + z = self.depth_image_filtered[y, x] + if idx == min_z_index: + offset_min_z = z + xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) + selected_keypoint_world_arr.append(xyz_world) + + s_x, s_y, s_z = self.get_scales_xyz_coordinate_to_world(selected_keypoint_arr=selected_keypoint_arr, + selected_keypoint_world_arr=selected_keypoint_world_arr, + sz_type='sx') + # obtan scale of x,y and z + # - end + ########################################################## + + # calculate world xyz of all keypoints + # There is the keypoint which the nearest keypoint from camera, we make its z-value as 0. + # cf) Originally, wrist point is 0 on mediapipe algorithm. + ''' + TODO + Apply scale of x,y and z + and offset from top distance !!! 2024.05.13 + ''' + align_z_keypoint_arr = keypoint_arr + align_z_keypoint_arr[:, 2] = keypoint_arr[:, 2] - min_z + align_z_keypoint_world_arr = [] + for idx, pixel_xyz in enumerate(align_z_keypoint_arr): + up_x = int(pixel_xyz[0] * w) + up_y = int(pixel_xyz[1] * h) + x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow + y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow + if x <= 0 or x >= w or y <= 0 or y >= h: + ''' out of index ''' + return + # z = self.depth_image_filtered[y, x] + z = pixel_xyz[2] * s_z + offset_min_z + + print(f'scale: {s_z} : pixel_xyz={pixel_xyz[2]} / z={z}') + xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) + align_z_keypoint_world_arr.append(xyz_world) + + align_z_keypoint_world_arr = np.asarray(align_z_keypoint_world_arr, dtype=np.float64) + return align_z_keypoint_world_arr + + except Exception as e: + print(f'[mediapipe_hands.py] Exception error: {e}') + finally: + pass + + def get_top_n_values(self, arr, n=3): + arr = np.array(arr) + max_indices = np.argpartition(arr, -n)[-n:] # 가장 큰 값의 인덱스를 찾습니다. + max_values = np.partition(arr, -n)[-n:] # 배열에서 가장 큰 값 3개를 찾습니다. + return max_indices, max_values + + def get_bottom_n_values(self, arr, n=3): + arr = np.array(arr) + min_indices = np.argpartition(arr, n)[:n] # 가장 작은 값의 인덱스를 찾습니다. + min_values = np.partition(arr, n)[:n] # 배열에서 가장 작은 값 3개를 찾습니다. + return min_indices, min_values + + def get_scales_xyz_coordinate_to_world(self, selected_keypoint_arr, selected_keypoint_world_arr, sz_type='sx'): + """Obtain scales of x,y and z + scale = abs(real_distance / point_distance) + It is the average of values that have several points and are selected as a combination of two points. + (nC2) + + Args: + selected_keypoint_arr (_type_): _description_ + selected_keypoint_world_arr (_type_): _description_ + + Returns: + _type_: _description_ + """ + n_arr = np.array(selected_keypoint_arr) + w_arr = np.array(selected_keypoint_world_arr) + + scale_xyz = [] + # n = len(selected_keypoint_arr) + for idx, _ in enumerate(selected_keypoint_arr): + for i in range(idx + 1, len(selected_keypoint_arr)): + scales = abs((w_arr[idx] - w_arr[i]) / (n_arr[idx] - n_arr[i])) + scale_xyz.append(scales) + scale_xyz = np.asarray(scale_xyz) # convert to numpay array + scale_x = np.mean(scale_xyz[:, 0]) + scale_y = np.mean(scale_xyz[:, 1]) + if (sz_type == 'sx'): + scale_z = scale_x + else: + scale_z = np.mean(scale_xyz[:, 2]) + + return scale_x, scale_y, scale_z + + # def get_hand_keypoint_normalized_xyz(self, hand_index=0, keypoint='index_finger_tip'): + # try: + # keypoint_index = self.keypoints['keypoints'][keypoint] + # landmarks = self.hand_results[hand_index]['landmarks'] + # x = landmarks[keypoint_index,0] + # y = landmarks[keypoint_index,1] + # z = landmarks[keypoint_index,2] + + # return x,y,z + # except Exception as e: + # print(f'[mediapipe_hands.py] Exception error: {e}') + # finally: + # pass + + def rs_init(self): + # Realsense 카메라 객체 생성 + self.pipeline = rs.pipeline() + self.config = rs.config() + # config.enable_stream(rs.stream.color, 1280, 720, rs.format.bgr8, 30) + # config.enable_stream(rs.stream.depth, 1280, 720, rs.format.z16, 30) + self.config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) + self.config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) + + # 카메라 시작 + self.profile = self.pipeline.start(self.config) + self.align = rs.align(rs.stream.color) + # align = rs.align(rs.stream.depth) + + self.color_intrinsics = self.profile.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() + self.depth_intrinsics = self.profile.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() + + # color_intrinsics = align.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() + # depth_intrinsics = align.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() + + print(f'intrinsics(color): {self.color_intrinsics}') + print(f'intrinsics(depth): {self.depth_intrinsics}') + + self.depth_sensor = self.profile.get_device().first_depth_sensor() + if self.depth_sensor.supports(rs.option.depth_units): + self.depth_sensor.set_option(rs.option.depth_units, 0.001) + print(f'depth sensor: {self.depth_sensor} - change depth_units to : 0.001') + self.pipeline.stop() + print(f'Reopen the camera...') + time.sleep(1) + + self.profile = self.pipeline.start(self.config) + self.align = rs.align(rs.stream.color) + else: + print('depth sensor doesn''t support changing depth_units.') + + def get_frames(self): + frames = self.pipeline.wait_for_frames() + # align_frames = align.process(frames) + align_frames = frames + color_frame = align_frames.get_color_frame() + depth_frame = align_frames.get_depth_frame() + depth_frame = rs.hole_filling_filter().process(depth_frame) + + if not depth_frame or not color_frame: + return depth_frame, color_frame + + self.color_image = np.asanyarray(color_frame.get_data()) + self.depth_image = np.asanyarray(depth_frame.get_data()) + + # return + return self.color_image, self.depth_image + + +def main(args=None): + try: + mphand = MediaPipeHandLandmarkDetector() + mphand.rs_init() + + while True: + try: + image_color, image_depth = mphand.get_frames() + + # if not image_color or not image_depth: + # continue + + mphand.hand_detection(image_color, image_depth, mphand.depth_intrinsics) + + # cv2.putText(image, f"FPS: {int(fps)}", (20, 20), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 255), 1) + + # pixel_x = int(g_hand_data[8, 0] * image_width) + # pixel_y = int(g_hand_data[8, 1] * image_height) + # # print(pixel_x, pixel_y) + # if pixel_x > 0 and pixel_x < image_width and pixel_y > 0 and pixel_y < image_height: + # + # # Applying filter + # finger_depth_curr = depth_image[pixel_y, pixel_x] + # filter_depth = filter_sensitivity * finger_depth_curr + (1 - filter_sensitivity) * finger_depth_prev + # # camera_to_hand_vector = rs.rs2_deproject_pixel_to_point(color_intrinsics, [pixel_x, pixel_y], filter_depth) + # camera_to_hand_vector = rs.rs2_deproject_pixel_to_point(depth_intrinsics, [pixel_x, pixel_y], + # filter_depth) + # self.camera_to_hand_vector['x'] = camera_to_hand_vector[0] + # self.camera_to_hand_vector['y'] = camera_to_hand_vector[1] + # self.camera_to_hand_vector['z'] = camera_to_hand_vector[2] + # + # if hand_label == "Right": + # self.publishall() + # else: + # msg = Vector3() + # msg.x = 0.0 + # msg.y = 0.0 + # msg.z = 300.0 + # self.handpose_publisher.publish(msg) + + image_width = 640 + image_height = 480 + + index_finger_tip_image = mphand.hand_landmarks['landmarks'] + xyz_idx = index_finger_tip_image[8] + index_finger_tip = mphand.hand_landmarks['world_landmarks'] + x = min(int(xyz_idx[0] * image_width), image_width - 1) # prevent the index overflow + y = min(int(xyz_idx[1] * image_height), image_height - 1) # prevent the index overflow + # if x <= 0 or x >= w or y <= 0 or y >= h: + # ''' out of index ''' + # return + z = mphand.depth_image_filtered[y, x] + z2 = index_finger_tip[8][2] + + finger_depth = z + cv2.line(mphand.color_image, (int(image_width / 2), int(image_height / 2)), + (int(image_width / 2), int(image_height / 2)), (255, 0, 0), 5) + cv2.putText(mphand.color_image, f"(basic: {finger_depth:.1f} mm", + (x, y - 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + cv2.putText(mphand.color_image, f"(scale: {z2:.1f}) mm", + (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + cv2.putText(mphand.color_image, + f"{x:.1f}, {y:.1f}, {z:.1f} mm", + (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + cv2.line(mphand.depth_image_filtered, (x, y), (x, y), (0, 255, 0), 5) + cv2.putText(mphand.depth_image_filtered, f"{finger_depth:.1f} mm", + (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) + cv2.putText(mphand.depth_image_filtered, + f"{x:.1f}, {y:.1f}, {z:.1f} mm", + (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) + + cv2.imshow('MediaPipe Hands', mphand.color_image) + cv2.imshow('depth image', mphand.depth_image_filtered) + + if cv2.waitKey(5) & 0xFF == 27: + break + except KeyboardInterrupt: + print(f'Keyboard Interrupt (SIGINT)') + + finally: + pass + + +if __name__ == '__main__': + main() + + diff --git a/src/handpose_pkg/package.xml b/src/handpose_pkg/package.xml index a9f4a03..d39182c 100644 --- a/src/handpose_pkg/package.xml +++ b/src/handpose_pkg/package.xml @@ -11,6 +11,7 @@ std_msgs sensor_msgs geometry_msgs + custom_interfaces mediapipe rviz_visual_tools From 8b695a2af7bad4bb40e55e76c51bd7d61128cb77 Mon Sep 17 00:00:00 2001 From: Bigyuun Date: Thu, 16 May 2024 08:10:40 +0900 Subject: [PATCH 02/11] update --- .vscode/c_cpp_properties.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 0e6c965..c17a30a 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -8,6 +8,10 @@ "includePath": [ "${workspaceFoler}/**", "${workspaceFolder}/install/custom_interfaces/include/custom_interfaces", + "${workspaceFolder}/src/custom_interfaces/include/custom_interfaces", + "${workspaceFolder}/src/custom_interfaces/include/custom_interfaces/**", + "${workspaceFolder}/src/custom_interfaces/include/custom_interfaces/msg", + "${workspaceFolder}/src/custom_interfaces/msg", "/opt/ros/humble/include/**", "/home/daeyun/Desktop/github_repos/SIFM/**", "/home/daeyun/Desktop/github_repos/SIFM/src/tcp_pkg/include", From da0cb3ee54e9b064749a084b9e871ed20a53e6c2 Mon Sep 17 00:00:00 2001 From: Bigyuun Date: Wed, 22 May 2024 10:10:59 +0900 Subject: [PATCH 03/11] mediapipe-hand-landmarks detection code update --- .../handpose_pkg/mediapipe_hands.py | 304 ++++++++++++------ ...y => mediapipe_hands_3D_realsense_demo.py} | 60 +++- 2 files changed, 257 insertions(+), 107 deletions(-) rename src/handpose_pkg/handpose_pkg/{realsense_demo_coordinate_v2.py => mediapipe_hands_3D_realsense_demo.py} (84%) diff --git a/src/handpose_pkg/handpose_pkg/mediapipe_hands.py b/src/handpose_pkg/handpose_pkg/mediapipe_hands.py index 00d8c3b..32f6a64 100644 --- a/src/handpose_pkg/handpose_pkg/mediapipe_hands.py +++ b/src/handpose_pkg/handpose_pkg/mediapipe_hands.py @@ -11,6 +11,7 @@ from matplotlib.animation import FuncAnimation from functools import partial import threading +from multiprocessing import Process # matplotlib.use('Agg') import json @@ -22,6 +23,118 @@ import queue queue = queue.Queue() +g_hand_data = np.zeros((21, 3)) +g_canonical_points = np.zeros((21, 3)) +g_world_points = np.zeros((21, 3)) + +class RealTimePlot3D: + def __init__(self, num_points=21): + self.num_points = num_points + self.data = np.random.randn(self.num_points, 3) + self.fig = plt.figure() + # self.fig2 = plt.figure() + self.ax = self.fig.add_subplot(221, projection='3d') # visualization of hand pose + self.ax.set_xlabel('X Label') + self.ax.set_ylabel('Y Label') + self.ax.set_zlabel('Z Label') + self.ax.set_xlim(-0.1, 0.1) + self.ax.set_ylim(-0.1, 0.1) + self.ax.set_zlim(-0.1, 0.1) + + self.ax2 = self.fig.add_subplot(222, projection='3d') # visualization of hand pose + self.ax2.set_xlabel('X pixel') + self.ax2.set_ylabel('Y pixel') + self.ax2.set_zlabel('Z depth') + + self.ax3 = self.fig.add_subplot(223, projection='3d') # visualization of hand pose + self.ax3.set_xlabel('X pixel') + self.ax3.set_ylabel('Y pixel') + self.ax3.set_zlabel('Z depth') + + self.ax4 = self.fig.add_subplot(224, projection='3d') # visualization of hand pose + self.ax4.set_xlabel('X pixel') + self.ax4.set_ylabel('Y pixel') + self.ax4.set_zlabel('Z depth') + + # self.ani = None + self.ani = FuncAnimation(self.fig, self.update_data, frames=1, interval=100) + self.scatter = self.ax.scatter(g_hand_data[:, 0], g_hand_data[:, 1], g_hand_data[:, 2]) + self.scatter_canonical_points = self.ax.scatter(g_canonical_points[:, 0], g_canonical_points[:, 1], g_canonical_points[:, 2]) + self.scatter_world_points = self.ax.scatter(g_world_points[:, 0], g_world_points[:, 1], g_world_points[:, 2]) + self.update_thread = threading.Thread(target=self.update_data) + self.update_thread.daemon = True + + def update_data(self, frames): + + global g_hand_data, g_canonical_points, g_world_points + colors = ['black', 'blue', 'green', 'orange', 'red', 'black'] + intervals = [4, 8, 12, 16, 20] + + while True: + + data = g_hand_data + data_c_p = g_canonical_points + data_w_p = g_world_points + + # 현재 점 삭제 + self.scatter.remove() + self.scatter_canonical_points.remove() + self.scatter_world_points.remove() + self.ax.cla() + self.ax2.cla() + self.ax3.cla() + self.ax4.cla() + self.ax.set_xlabel('X Label') + self.ax.set_ylabel('Y Label') + self.ax.set_zlabel('Z Label') + # self.ax.set_xlim(0, 500) + # self.ax.set_ylim(0, 500) + # self.ax.set_zlim(-100, 400) + + max_xyz_c = np.max(data_c_p, axis=0) + min_xyz_c = np.min(data_c_p, axis=0) + max_xyz_w = np.max(data_w_p, axis=0) + min_xyz_w = np.min(data_w_p, axis=0) + th = 50 + self.ax2.set_xlim(min_xyz_c[0] - th, max_xyz_c[0] + th) + self.ax2.set_ylim(min_xyz_c[1] - th, max_xyz_c[1] + th) + self.ax2.set_zlim(min_xyz_c[2] - th, max_xyz_c[2] + th) + self.ax3.set_xlim(min_xyz_c[0] - th, max_xyz_c[0] + th) + self.ax3.set_ylim(min_xyz_c[1] - th, max_xyz_c[1] + th) + self.ax3.set_zlim(min_xyz_c[2] - th, max_xyz_c[2] + th) + self.ax4.set_xlim(min_xyz_w[0] - th, max_xyz_w[0] + th) + self.ax4.set_ylim(min_xyz_w[1] - th, max_xyz_w[1] + th) + self.ax4.set_zlim(min_xyz_w[2] - th, max_xyz_w[2] + th) + + + # print(f'{data[8,0]} / {data[8,1]} / {data[8,2]}') + self.scatter = self.ax.scatter(data[:, 0], data[:, 1], data[:, 2], color='black', s=50, alpha=1) + self.scatter_canonical_points = self.ax2.scatter(data_c_p[:, 0], data_c_p[:, 1], data_c_p[:, 2], color='red', s=10, alpha=1) + self.scatter_world_points = self.ax2.scatter(data_w_p[:, 0], data_w_p[:, 1], data_w_p[:, 2], color='blue', s=10, alpha=1) + self.scatter_canonical_points = self.ax3.scatter(data_c_p[:, 0], data_c_p[:, 1], data_c_p[:, 2], color='red', s=10, alpha=1) + self.scatter_world_points = self.ax4.scatter(data_w_p[:, 0], data_w_p[:, 1], data_w_p[:, 2], color='blue', s=10, alpha=1) + + + + + + # self.scatter_2 = self.ax2.scatter() + for i in range(len(intervals)): + start_idx = 0 if i == 0 else intervals[i - 1] + 1 + end_idx = intervals[i] + self.ax.plot(data[start_idx:end_idx + 1, 0], data[start_idx:end_idx + 1, 1], data[start_idx:end_idx + 1, 2], color=colors[i]) + self.ax2.plot(data_c_p[start_idx:end_idx + 1, 0], data_c_p[start_idx:end_idx + 1, 1], data_c_p[start_idx:end_idx + 1, 2], color=colors[i]) + self.ax2.plot(data_w_p[start_idx:end_idx + 1, 0], data_w_p[start_idx:end_idx + 1, 1], data_w_p[start_idx:end_idx + 1, 2], color=colors[i]) + self.ax3.plot(data_c_p[start_idx:end_idx + 1, 0], data_c_p[start_idx:end_idx + 1, 1], data_c_p[start_idx:end_idx + 1, 2], color=colors[i]) + self.ax4.plot(data_w_p[start_idx:end_idx + 1, 0], data_w_p[start_idx:end_idx + 1, 1], data_w_p[start_idx:end_idx + 1, 2], color=colors[i]) + + return + # return self.scatter + + def start(self): + # 데이터 업데이트 쓰레드 시작 + self.update_thread.start() + self.ani = FuncAnimation(self.fig, self.update_data, frames=100, interval=30) class HandLandmarks(): @@ -57,6 +170,9 @@ def __init__(self): self.finger_depth_curr = 0 self.filter_sensitivity = 0.3 + self.image_width = 1280 + self.image_height = 720 + self.color_image = None self.depth_image = None self.depth_image_prev = None @@ -65,7 +181,7 @@ def __init__(self): self.pps = 0 def hand_detection(self, color_frame, depth_frame, depth_intrinsic=None): - + global g_hand_data, g_canonical_points, g_world_points ###################################################### # Flip the image horizontally for a later selfie-view display, and convert # the BGR image to RGB. @@ -89,9 +205,9 @@ def hand_detection(self, color_frame, depth_frame, depth_intrinsic=None): # pass by reference. self.color_image.flags.writeable = False results = self.hands.process(self.color_image) - image_height, image_width, _ = self.color_image.shape + self.image_height, self.image_width, _ = self.color_image.shape depth_image_height, depth_image_width = self.depth_image_filtered.shape - if image_height != depth_image_height or image_width != depth_image_width: + if self.image_height != depth_image_height or self.image_width != depth_image_width: print(f'[mediapipe_hands.py | Warning] It does not match a size (H x W) of color & depth frame') # Draw the hand annotations on the image. self.color_image.flags.writeable = True @@ -122,10 +238,15 @@ def hand_detection(self, color_frame, depth_frame, depth_intrinsic=None): hand_data[idx, 0] = cx hand_data[idx, 1] = cy hand_data[idx, 2] = cz - - pixel_x = int(cx * image_width) - pixel_y = int(cy * image_height) - + g_hand_data[idx, 0] = cx + g_hand_data[idx, 1] = cy + g_hand_data[idx, 2] = cz + pixel_x = int(cx * self.image_width) + pixel_y = int(cy * self.image_height) + + canonical_points, world_points = self.compare_coordinate_canonical_with_world(hand_data) + g_canonical_points = canonical_points + g_world_points = world_points self.hand_landmarks['landmarks'] = hand_data world_landmarks = self.conversion_hand_keypoint_pixel_to_point(hand_data, top_point_n=None) @@ -143,32 +264,35 @@ def hand_detection(self, color_frame, depth_frame, depth_intrinsic=None): # mp_drawing_styles.get_default_hand_connections_style() ) - # print(pixel_x, pixel_y) - # if pixel_x>0 and pixel_x0 and pixel_y 0 and pixel_x < image_width and pixel_y > 0 and pixel_y < image_height: - # - # # Applying filter - # finger_depth_curr = depth_image[pixel_y, pixel_x] - # filter_depth = filter_sensitivity * finger_depth_curr + (1 - filter_sensitivity) * finger_depth_prev - # # camera_to_hand_vector = rs.rs2_deproject_pixel_to_point(color_intrinsics, [pixel_x, pixel_y], filter_depth) - # camera_to_hand_vector = rs.rs2_deproject_pixel_to_point(depth_intrinsics, [pixel_x, pixel_y], - # filter_depth) - # self.camera_to_hand_vector['x'] = camera_to_hand_vector[0] - # self.camera_to_hand_vector['y'] = camera_to_hand_vector[1] - # self.camera_to_hand_vector['z'] = camera_to_hand_vector[2] - # - # if hand_label == "Right": - # self.publishall() - # else: - # msg = Vector3() - # msg.x = 0.0 - # msg.y = 0.0 - # msg.z = 300.0 - # self.handpose_publisher.publish(msg) - - image_width = 640 - image_height = 480 - - index_finger_tip_image = mphand.hand_landmarks['landmarks'] + self.hand_detection(image_color, image_depth, self.depth_intrinsics) + + index_finger_tip_image = self.hand_landmarks['landmarks'] + if index_finger_tip_image is None: + continue xyz_idx = index_finger_tip_image[8] - index_finger_tip = mphand.hand_landmarks['world_landmarks'] + index_finger_tip = self.hand_landmarks['world_landmarks'] x = min(int(xyz_idx[0] * image_width), image_width - 1) # prevent the index overflow y = min(int(xyz_idx[1] * image_height), image_height - 1) # prevent the index overflow # if x <= 0 or x >= w or y <= 0 or y >= h: # ''' out of index ''' # return - z = mphand.depth_image_filtered[y, x] + z = self.depth_image_filtered[y, x] z2 = index_finger_tip[8][2] finger_depth = z - cv2.line(mphand.color_image, (int(image_width / 2), int(image_height / 2)), + cv2.line(self.color_image, (int(image_width / 2), int(image_height / 2)), (int(image_width / 2), int(image_height / 2)), (255, 0, 0), 5) - cv2.putText(mphand.color_image, f"(basic: {finger_depth:.1f} mm", + cv2.putText(self.color_image, f"(basic: {finger_depth:.1f} mm", (x, y - 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) - cv2.putText(mphand.color_image, f"(scale: {z2:.1f}) mm", + cv2.putText(self.color_image, f"(scale: {z2:.1f}) mm", (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) - cv2.putText(mphand.color_image, + cv2.putText(self.color_image, f"{x:.1f}, {y:.1f}, {z:.1f} mm", (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) - cv2.line(mphand.depth_image_filtered, (x, y), (x, y), (0, 255, 0), 5) - cv2.putText(mphand.depth_image_filtered, f"{finger_depth:.1f} mm", + cv2.line(self.depth_image_filtered, (x, y), (x, y), (0, 255, 0), 5) + cv2.putText(self.depth_image_filtered, f"{finger_depth:.1f} mm", (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) - cv2.putText(mphand.depth_image_filtered, + cv2.putText(self.depth_image_filtered, f"{x:.1f}, {y:.1f}, {z:.1f} mm", (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) - cv2.imshow('MediaPipe Hands', mphand.color_image) - cv2.imshow('depth image', mphand.depth_image_filtered) + cv2.imshow('MediaPipe Hands', self.color_image) + + depth_show_img = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image_filtered, alpha=0.3), cv2.COLORMAP_JET) + cv2.imshow('depth image', depth_show_img) if cv2.waitKey(5) & 0xFF == 27: break - except KeyboardInterrupt: - print(f'Keyboard Interrupt (SIGINT)') + except KeyboardInterrupt: + print(f'Keyboard Interrupt (SIGINT)') + finally: + pass - finally: - pass +def main(): + HLD = MediaPipeHandLandmarkDetector() + thread_mediapipe_hand = threading.Thread(target=HLD.realsense_demo) + thread_mediapipe_hand.daemon = True + thread_mediapipe_hand.start() + + print('RealTimePlot3D class is update...') + + real_time_plot = RealTimePlot3D() + real_time_plot.start() + print('show start') + plt.show() + print('show end') + + # t = Process(target=HLD.realsense_demo(), args=(10,)) + # t.start() + # t.join() if __name__ == '__main__': main() - diff --git a/src/handpose_pkg/handpose_pkg/realsense_demo_coordinate_v2.py b/src/handpose_pkg/handpose_pkg/mediapipe_hands_3D_realsense_demo.py similarity index 84% rename from src/handpose_pkg/handpose_pkg/realsense_demo_coordinate_v2.py rename to src/handpose_pkg/handpose_pkg/mediapipe_hands_3D_realsense_demo.py index 7be9959..ba0a6f4 100644 --- a/src/handpose_pkg/handpose_pkg/realsense_demo_coordinate_v2.py +++ b/src/handpose_pkg/handpose_pkg/mediapipe_hands_3D_realsense_demo.py @@ -18,8 +18,9 @@ queue = queue.Queue() g_hand_data = np.zeros((21, 3)) +g_hand_data_scaled = np.zeros((21, 3)) +g_hand_data_normalized = np.zeros((21, 3)) g_hand_world_data = np.zeros((21, 3)) -g_hand_world_data_normalized = np.zeros((21, 3)) class RealTimePlot3D: def __init__(self, num_points=21): @@ -41,7 +42,7 @@ def __init__(self, num_points=21): def update_data(self, frames): - global g_hand_data, g_hand_data_normalized + global g_hand_data, g_hand_world_data, g_hand_data_normalized colors = ['black', 'blue', 'green', 'orange', 'red', 'black'] intervals = [4, 8, 12, 16, 20] @@ -52,12 +53,19 @@ def update_data(self, frames): self.ax.set_xlabel('X Label') self.ax.set_ylabel('Y Label') self.ax.set_zlabel('Z Label') - data = g_hand_data + self.ax.set_xlim(0, 500) + self.ax.set_ylim(0, 500) + self.ax.set_zlim(-100, 400) + # data = g_hand_data + data = g_hand_data_scaled + # data = g_hand_world_data + # data = g_hand_data_normalized self.scatter = self.ax.scatter(data[:, 0], data[:, 1], data[:, 2], color='black', s=50, alpha=1) + # self.scatter = self.ax.scatter(0,0,0, color='red',s=50, alpha=1) for i in range(len(intervals)): start_idx = 0 if i == 0 else intervals[i - 1] + 1 end_idx = intervals[i] @@ -79,7 +87,7 @@ def start(self): class MediaPipeHandLandmarkDetector: pass def mediapipe_hand_detection(): - global g_hand_data, g_hand_data_normalized + global g_hand_data, g_hand_data_scaled, g_hand_data_normalized hand_data = np.zeros((21, 3)) mp_drawing = mp.solutions.drawing_utils @@ -135,6 +143,7 @@ def mediapipe_hand_detection(): p_time = time.time() with mp_hands.Hands( + static_image_mode=False, min_detection_confidence=0.8, min_tracking_confidence=0.7) as hands: while True: @@ -155,6 +164,9 @@ def mediapipe_hand_detection(): # depth_frame_spatial_filter = rs.spatial_filter().process(depth_frame) # depth_frame_temporal_filter = rs.temporal_filter().process(depth_frame) + + # decimated_queue = rs.decimation_filter(2) + # depth_frame = decimated_queue.process(depth_frame) depth_frame = rs.hole_filling_filter().process(depth_frame) @@ -213,15 +225,20 @@ def mediapipe_hand_detection(): for ids, landmrk in enumerate(hand_landmarks.landmark): cx, cy, cz = landmrk.x, landmrk.y, landmrk.z + g_hand_data[ids, 0] = cx g_hand_data[ids, 1] = cy g_hand_data[ids, 2] = cz + g_hand_data_scaled[ids, 0] = cx * image_width + g_hand_data_scaled[ids, 1] = cy * image_height + g_hand_data_scaled[ids, 2] = cz * image_width + # 정규화 min_vals = np.min(g_hand_data, axis=0) max_vals = np.max(g_hand_data, axis=0) g_hand_data_normalized = (g_hand_data - min_vals) / (max_vals - min_vals) - g_hand_data_normalized[:, 2] = g_hand_data[:,2] + # g_hand_data_normalized[:, 2] = g_hand_data[:,2] mp_drawing.draw_landmarks( image, @@ -232,18 +249,22 @@ def mediapipe_hand_detection(): ) if results.multi_hand_world_landmarks: - for hand_world_landmarks in results.multi_hand_world_landmarks: - # Here is How to Get All the Coordinates - for ids, landmrk in enumerate(hand_world_landmarks.landmark): - # print(ids, landmrk) - cx, cy, cz = landmrk.x, landmrk.y, landmrk.z - # print(f'{ids}: {cx}, {cy}, {cz}') - g_hand_world_data[ids, 0] = cx - g_hand_world_data[ids, 1] = cy - g_hand_world_data[ids, 2] = cz - else: - # print("No Right Hand") - pass + for hand_world_landmarks in results.multi_hand_world_landmarks: + # Here is How to Get All the Coordinates + for ids, landmrk in enumerate(hand_world_landmarks.landmark): + # print(ids, landmrk) + cx, cy, cz = landmrk.x, landmrk.y, landmrk.z + # print(f'{ids}: {cx}, {cy}, {cz}') + g_hand_world_data[ids, 0] = cx + g_hand_world_data[ids, 1] = cy + g_hand_world_data[ids, 2] = cz + + # for hand_world_landmarks in results.multi_hand_world_landmarks: + # mp_drawing.plot_landmarks( + # hand_world_landmarks, mp_hands.HAND_CONNECTIONS, azimuth=5) + else: + # print("No Right Hand") + pass c_time = time.time() fps = 1 / (c_time - p_time) @@ -264,6 +285,10 @@ def mediapipe_hand_detection(): pixel_x = int(g_hand_data[8, 0] * image_width) pixel_y = int(g_hand_data[8, 1] * image_height) + + # pixel_x = int(g_hand_world_data[8, 0] * image_width) + # pixel_y = int(g_hand_world_data[8, 1] * image_height) + # print(pixel_x, pixel_y) if pixel_x>0 and pixel_x0 and pixel_y Date: Fri, 24 May 2024 15:51:04 +0900 Subject: [PATCH 04/11] update mediapipe code --- .../handpose_pkg/mediapipe_hands.py | 339 +++++++++++++++--- 1 file changed, 283 insertions(+), 56 deletions(-) diff --git a/src/handpose_pkg/handpose_pkg/mediapipe_hands.py b/src/handpose_pkg/handpose_pkg/mediapipe_hands.py index 32f6a64..075b7f0 100644 --- a/src/handpose_pkg/handpose_pkg/mediapipe_hands.py +++ b/src/handpose_pkg/handpose_pkg/mediapipe_hands.py @@ -26,6 +26,12 @@ g_hand_data = np.zeros((21, 3)) g_canonical_points = np.zeros((21, 3)) g_world_points = np.zeros((21, 3)) +g_world_points_iqr = np.zeros((21, 3)) +g_replace_point = np.zeros((21, 3)) +g_palm_center = np.zeros(3) +g_palm_normal_vector = np.zeros(3) +g_palm_center_cano = np.zeros(3) +g_palm_normal_vector_cano = np.zeros(3) class RealTimePlot3D: def __init__(self, num_points=21): @@ -33,7 +39,7 @@ def __init__(self, num_points=21): self.data = np.random.randn(self.num_points, 3) self.fig = plt.figure() # self.fig2 = plt.figure() - self.ax = self.fig.add_subplot(221, projection='3d') # visualization of hand pose + self.ax = self.fig.add_subplot(231, projection='3d') # visualization of hand pose self.ax.set_xlabel('X Label') self.ax.set_ylabel('Y Label') self.ax.set_zlabel('Z Label') @@ -41,32 +47,45 @@ def __init__(self, num_points=21): self.ax.set_ylim(-0.1, 0.1) self.ax.set_zlim(-0.1, 0.1) - self.ax2 = self.fig.add_subplot(222, projection='3d') # visualization of hand pose + self.ax2 = self.fig.add_subplot(232, projection='3d') # visualization of hand pose self.ax2.set_xlabel('X pixel') self.ax2.set_ylabel('Y pixel') self.ax2.set_zlabel('Z depth') - self.ax3 = self.fig.add_subplot(223, projection='3d') # visualization of hand pose + self.ax3 = self.fig.add_subplot(233, projection='3d') # visualization of hand pose self.ax3.set_xlabel('X pixel') self.ax3.set_ylabel('Y pixel') self.ax3.set_zlabel('Z depth') - self.ax4 = self.fig.add_subplot(224, projection='3d') # visualization of hand pose + self.ax4 = self.fig.add_subplot(234, projection='3d') # visualization of hand pose self.ax4.set_xlabel('X pixel') self.ax4.set_ylabel('Y pixel') self.ax4.set_zlabel('Z depth') + self.ax5 = self.fig.add_subplot(235, projection='3d') # visualization of hand pose + self.ax5.set_xlabel('X pixel') + self.ax5.set_ylabel('Y pixel') + self.ax5.set_zlabel('Z depth') + + self.ax6 = self.fig.add_subplot(236, projection='3d') # visualization of hand pose + self.ax6.set_xlabel('X pixel') + self.ax6.set_ylabel('Y pixel') + self.ax6.set_zlabel('Z depth') + # self.ani = None self.ani = FuncAnimation(self.fig, self.update_data, frames=1, interval=100) self.scatter = self.ax.scatter(g_hand_data[:, 0], g_hand_data[:, 1], g_hand_data[:, 2]) self.scatter_canonical_points = self.ax.scatter(g_canonical_points[:, 0], g_canonical_points[:, 1], g_canonical_points[:, 2]) self.scatter_world_points = self.ax.scatter(g_world_points[:, 0], g_world_points[:, 1], g_world_points[:, 2]) + self.scatter_world_points_iqr = self.ax.scatter(g_world_points_iqr[:, 0], g_world_points_iqr[:, 1], g_world_points_iqr[:, 2]) + self.scatter_replace_points = self.ax.scatter(g_replace_point[:, 0], g_replace_point[:, 1], g_replace_point[:, 2]) self.update_thread = threading.Thread(target=self.update_data) self.update_thread.daemon = True def update_data(self, frames): - global g_hand_data, g_canonical_points, g_world_points + global g_hand_data, g_canonical_points, g_world_points, g_world_points_iqr, g_replace_point + global g_palm_center, g_palm_normal_vector, g_palm_center_cano, g_palm_normal_vector_cano colors = ['black', 'blue', 'green', 'orange', 'red', 'black'] intervals = [4, 8, 12, 16, 20] @@ -75,15 +94,24 @@ def update_data(self, frames): data = g_hand_data data_c_p = g_canonical_points data_w_p = g_world_points + data_w_p_iqr = g_world_points_iqr + data_r_p = g_replace_point + # print(f'canonical: {data_c_p}') + # print(f'world_iqr: {data_w_p_iqr}') + # print(f'replace: {data_r_p}') # 현재 점 삭제 self.scatter.remove() self.scatter_canonical_points.remove() self.scatter_world_points.remove() + self.scatter_world_points_iqr.remove() + self.scatter_replace_points.remove() self.ax.cla() self.ax2.cla() self.ax3.cla() self.ax4.cla() + self.ax5.cla() + self.ax6.cla() self.ax.set_xlabel('X Label') self.ax.set_ylabel('Y Label') self.ax.set_zlabel('Z Label') @@ -95,38 +123,81 @@ def update_data(self, frames): min_xyz_c = np.min(data_c_p, axis=0) max_xyz_w = np.max(data_w_p, axis=0) min_xyz_w = np.min(data_w_p, axis=0) + max_xyz_w_iqr = np.max(data_w_p_iqr, axis=0) + min_xyz_w_iqr = np.min(data_w_p_iqr, axis=0) + th = 50 - self.ax2.set_xlim(min_xyz_c[0] - th, max_xyz_c[0] + th) - self.ax2.set_ylim(min_xyz_c[1] - th, max_xyz_c[1] + th) - self.ax2.set_zlim(min_xyz_c[2] - th, max_xyz_c[2] + th) - self.ax3.set_xlim(min_xyz_c[0] - th, max_xyz_c[0] + th) - self.ax3.set_ylim(min_xyz_c[1] - th, max_xyz_c[1] + th) - self.ax3.set_zlim(min_xyz_c[2] - th, max_xyz_c[2] + th) - self.ax4.set_xlim(min_xyz_w[0] - th, max_xyz_w[0] + th) - self.ax4.set_ylim(min_xyz_w[1] - th, max_xyz_w[1] + th) - self.ax4.set_zlim(min_xyz_w[2] - th, max_xyz_w[2] + th) + # self.ax2.set_xlim(min_xyz_c[0] - th, max_xyz_c[0] + th) + # self.ax2.set_ylim(min_xyz_c[1] - th, max_xyz_c[1] + th) + # self.ax2.set_zlim(min_xyz_c[2] - th, max_xyz_c[2] + th) + # self.ax4.set_xlim(min_xyz_c[0] - th, max_xyz_c[0] + th) + # self.ax4.set_ylim(min_xyz_c[1] - th, max_xyz_c[1] + th) + # self.ax4.set_zlim(min_xyz_c[2] - th, max_xyz_c[2] + th) + # self.ax5.set_xlim(min_xyz_w[0] - th, max_xyz_w[0] + th) + # self.ax5.set_ylim(min_xyz_w[1] - th, max_xyz_w[1] + th) + # self.ax5.set_zlim(min_xyz_w[2] - th, max_xyz_w[2] + th) + # self.ax6.set_xlim(min_xyz_w_iqr[0] - th, max_xyz_w_iqr[0] + th) + # self.ax6.set_ylim(min_xyz_w_iqr[1] - th, max_xyz_w_iqr[1] + th) + # self.ax6.set_zlim(min_xyz_w_iqr[2] - th, max_xyz_w_iqr[2] + th) + + self.ax2.set_xlim(300, 500) + self.ax2.set_ylim(100, 300) + self.ax2.set_zlim(400, 700) + self.ax3.set_xlim(300, 500) + self.ax3.set_ylim(100, 300) + self.ax3.set_zlim(400, 700) + self.ax4.set_xlim(300, 500) + self.ax4.set_ylim(100, 300) + self.ax4.set_zlim(400, 700) + self.ax5.set_xlim(300, 500) + self.ax5.set_ylim(100, 300) + self.ax5.set_zlim(400, 700) + self.ax6.set_xlim(300, 500) + self.ax6.set_ylim(100, 300) + self.ax6.set_zlim(400, 700) # print(f'{data[8,0]} / {data[8,1]} / {data[8,2]}') self.scatter = self.ax.scatter(data[:, 0], data[:, 1], data[:, 2], color='black', s=50, alpha=1) + self.scatter_canonical_points = self.ax2.scatter(data_c_p[:, 0], data_c_p[:, 1], data_c_p[:, 2], color='red', s=10, alpha=1) self.scatter_world_points = self.ax2.scatter(data_w_p[:, 0], data_w_p[:, 1], data_w_p[:, 2], color='blue', s=10, alpha=1) - self.scatter_canonical_points = self.ax3.scatter(data_c_p[:, 0], data_c_p[:, 1], data_c_p[:, 2], color='red', s=10, alpha=1) - self.scatter_world_points = self.ax4.scatter(data_w_p[:, 0], data_w_p[:, 1], data_w_p[:, 2], color='blue', s=10, alpha=1) + self.scatter_world_points_iqr = self.ax2.scatter(data_w_p_iqr[:, 0], data_w_p_iqr[:, 1], data_w_p_iqr[:, 2], color='green', s=10, alpha=1) + self.scatter_replace_points = self.ax2.scatter(data_r_p[:, 0], data_r_p[:, 1], data_r_p[:, 2], color='purple', s=10, alpha=1) + self.scatter_replace_points = self.ax3.scatter(data_r_p[:, 0], data_r_p[:, 1], data_r_p[:, 2], color='purple', s=10, alpha=1) + self.scatter_canonical_points = self.ax4.scatter(data_c_p[:, 0], data_c_p[:, 1], data_c_p[:, 2], color='red', s=10, alpha=1) + self.scatter_world_points = self.ax5.scatter(data_w_p[:, 0], data_w_p[:, 1], data_w_p[:, 2], color='blue', s=10, alpha=1) + self.scatter_world_points_iqr = self.ax6.scatter(data_w_p_iqr[:, 0], data_w_p_iqr[:, 1], data_w_p_iqr[:, 2], color='green', s=10, alpha=1) + # self.scatter_replace_points = self.ax6.scatter(data_r_p[:, 0], data_r_p[:, 1], data_r_p[:, 2], color='purple', s=10, alpha=1) + # print(f'canonical: {data_c_p}') + # print(f'world_iqr: {data_w_p_iqr}') + # print(f'replace: {data_r_p}') # self.scatter_2 = self.ax2.scatter() for i in range(len(intervals)): start_idx = 0 if i == 0 else intervals[i - 1] + 1 end_idx = intervals[i] self.ax.plot(data[start_idx:end_idx + 1, 0], data[start_idx:end_idx + 1, 1], data[start_idx:end_idx + 1, 2], color=colors[i]) - self.ax2.plot(data_c_p[start_idx:end_idx + 1, 0], data_c_p[start_idx:end_idx + 1, 1], data_c_p[start_idx:end_idx + 1, 2], color=colors[i]) - self.ax2.plot(data_w_p[start_idx:end_idx + 1, 0], data_w_p[start_idx:end_idx + 1, 1], data_w_p[start_idx:end_idx + 1, 2], color=colors[i]) - self.ax3.plot(data_c_p[start_idx:end_idx + 1, 0], data_c_p[start_idx:end_idx + 1, 1], data_c_p[start_idx:end_idx + 1, 2], color=colors[i]) - self.ax4.plot(data_w_p[start_idx:end_idx + 1, 0], data_w_p[start_idx:end_idx + 1, 1], data_w_p[start_idx:end_idx + 1, 2], color=colors[i]) + self.ax2.plot(data_c_p[start_idx:end_idx + 1, 0], data_c_p[start_idx:end_idx + 1, 1], data_c_p[start_idx:end_idx + 1, 2], color='red') + self.ax2.plot(data_w_p[start_idx:end_idx + 1, 0], data_w_p[start_idx:end_idx + 1, 1], data_w_p[start_idx:end_idx + 1, 2], color='blue') + self.ax2.plot(data_w_p_iqr[start_idx:end_idx + 1, 0], data_w_p_iqr[start_idx:end_idx + 1, 1], data_w_p_iqr[start_idx:end_idx + 1, 2], color='green') + self.ax2.plot(data_r_p[start_idx:end_idx + 1, 0], data_r_p[start_idx:end_idx + 1, 1], data_r_p[start_idx:end_idx + 1, 2], color='purple') + + self.ax3.plot(data_r_p[start_idx:end_idx + 1, 0], data_r_p[start_idx:end_idx + 1, 1], data_r_p[start_idx:end_idx + 1, 2], color='purple') + # 벡터 그리기 + self.ax3.quiver(g_palm_center[0], g_palm_center[1], g_palm_center[2] , g_palm_normal_vector[0], g_palm_normal_vector[1], g_palm_normal_vector[2], color='r', length=150, normalize=False) + + self.ax4.plot(data_c_p[start_idx:end_idx + 1, 0], data_c_p[start_idx:end_idx + 1, 1], data_c_p[start_idx:end_idx + 1, 2], color='red') + self.ax4.quiver(g_palm_center_cano[0], g_palm_center_cano[1], g_palm_center_cano[2] , g_palm_normal_vector_cano[0], g_palm_normal_vector_cano[1], g_palm_normal_vector_cano[2], color='r', length=150, normalize=False) + + self.ax5.plot(data_w_p[start_idx:end_idx + 1, 0], data_w_p[start_idx:end_idx + 1, 1], data_w_p[start_idx:end_idx + 1, 2], color='blue') + + self.ax6.plot(data_w_p_iqr[start_idx:end_idx + 1, 0], data_w_p_iqr[start_idx:end_idx + 1, 1], data_w_p_iqr[start_idx:end_idx + 1, 2], color='green') + # self.ax6.plot(data_r_p[start_idx:end_idx + 1, 0], data_r_p[start_idx:end_idx + 1, 1], data_r_p[start_idx:end_idx + 1, 2], color='purple') return # return self.scatter @@ -144,8 +215,11 @@ def __init__(self): self.hand_landmarks['index'] = None self.hand_landmarks['score'] = None self.hand_landmarks['label'] = None - self.hand_landmarks['landmarks'] = None - self.hand_landmarks['world_landmarks'] = None # calculate from camera instrinsic(Realsense) + self.hand_landmarks['landmarks'] = np.zeros((21, 3)) + self.hand_landmarks['world_landmarks'] = np.zeros((21, 3)) # calculate from camera instrinsic(Realsense) + # self.hand_landmarks['canonical_landmarks'] = None # calculate from camera instrinsic(Realsense) + # self.hand_landmarks['replace_landmarks'] = None # calculate from camera instrinsic(Realsense) + # if serveral hands is detected, hand_results will has objects of each hands. # e.g. [{hand_landmarks#1}, {hand_landmarks#2}, ...] @@ -164,24 +238,34 @@ def __init__(self): self.mp_hands = mp.solutions.hands self.hands = self.mp_hands.Hands(min_detection_confidence=0.8, min_tracking_confidence=0.7) + self.canonical_points = np.zeros((21, 3)) + self.world_points = np.zeros((21, 3)) + self.world_points_iqr = np.zeros((21, 3)) + self.replace_point = np.zeros((21, 3)) + self.palm_vector = {'x', 'y', 'z', 'r','p','y'} + # smoothing (LPF-low pass filter) self.depth_intrinsics = None self.finger_depth_prev = 0 self.finger_depth_curr = 0 self.filter_sensitivity = 0.3 - self.image_width = 1280 - self.image_height = 720 + self.image_width = 640 + self.image_height = 480 self.color_image = None self.depth_image = None self.depth_image_prev = None + self.depth_image_for_drawing = None self.start_flag = False + self.hand_thickness = 10 # mm + self.pps = 0 def hand_detection(self, color_frame, depth_frame, depth_intrinsic=None): - global g_hand_data, g_canonical_points, g_world_points + global g_hand_data, g_canonical_points, g_world_points, g_world_points_iqr, g_replace_point + global g_palm_center, g_palm_normal_vector, g_palm_center_cano, g_palm_normal_vector_cano ###################################################### # Flip the image horizontally for a later selfie-view display, and convert # the BGR image to RGB. @@ -244,13 +328,28 @@ def hand_detection(self, color_frame, depth_frame, depth_intrinsic=None): pixel_x = int(cx * self.image_width) pixel_y = int(cy * self.image_height) - canonical_points, world_points = self.compare_coordinate_canonical_with_world(hand_data) + canonical_points, world_points, world_points_iqr, replace_point = self.compare_coordinate_canonical_with_world(hand_data) g_canonical_points = canonical_points g_world_points = world_points + g_world_points_iqr = world_points_iqr + g_replace_point = replace_point + self.canonical_points = canonical_points + self.world_points = world_points + self.world_points_iqr = world_points_iqr + self.replace_point = replace_point + + self.hand_landmarks['landmarks'] = hand_data + # world_landmarks = self.conversion_hand_keypoint_pixel_to_point(hand_data, top_point_n=None) + # self.hand_landmarks['world_landmarks'] = world_landmarks + self.hand_landmarks['world_landmarks'] = self.get_hand_world_xyz() + c, n_v = self.get_palm_pose(coord='replace') + g_palm_center = c + g_palm_normal_vector = n_v - world_landmarks = self.conversion_hand_keypoint_pixel_to_point(hand_data, top_point_n=None) - self.hand_landmarks['world_landmarks'] = world_landmarks + c2, n_v2 = self.get_palm_pose(coord='canonical') + g_palm_center_cano = c2 + g_palm_normal_vector_cano = n_v2 # finally self.hand_results.append(self.hand_landmarks) @@ -264,10 +363,25 @@ def hand_detection(self, color_frame, depth_frame, depth_intrinsic=None): # mp_drawing_styles.get_default_hand_connections_style() ) + # self.depth_image_for_drawing = np.zeros((self.image_height, self.image_width, 3), dtype=np.uint16) + # self.depth_image_for_drawing[:, :, 0] = self.depth_image_filtered + # self.depth_image_for_drawing = cv2.cvtColor(self.depth_image_for_drawing, cv2.COLOR_RGB2BGR) + + self.depth_image_for_drawing = self.depth_image_filtered + self.depth_image_for_drawing = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image_for_drawing, alpha=0.3), cv2.COLORMAP_JET) + + self.mp_drawing.draw_landmarks( + self.depth_image_for_drawing, + hand_landmarks, + self.mp_hands.HAND_CONNECTIONS, + # mp_drawing_styles.get_default_hand_landmarks_style(), + # mp_drawing_styles.get_default_hand_connections_style() + ) + e_time = time.time() self.pps = 1 / (e_time - s_time) - def compare_coordinate_canonical_with_world(self, hand_landmarks_array): + def compare_coordinate_canonical_with_world(self, hand_landmarks_array, replace_th=50): canonical_point = np.zeros((21, 3)) hand_landmarks_array = np.asarray(hand_landmarks_array) w, h = self.image_width, self.image_height @@ -280,36 +394,135 @@ def compare_coordinate_canonical_with_world(self, hand_landmarks_array): canonical_point[:, 2] = [int(x * w) for x in hand_landmarks_array[:, 2]] canonical_point = np.asarray(canonical_point, dtype=int) - world_point = np.zeros((21,3)) + world_point = np.zeros((21, 3)) + world_point_iqr = np.zeros((21, 3)) + # depth = np.zeros((1, 21)) depth = self.depth_image[canonical_point[:, 1], canonical_point[:, 0]] world_point[:, 0] = canonical_point[:, 0] world_point[:, 1] = canonical_point[:, 1] world_point[:, 2] = depth + world_point_iqr[:, 0] = canonical_point[:, 0] + world_point_iqr[:, 1] = canonical_point[:, 1] + world_point_iqr[:, 2] = self.replace_outliers_iqr_as_mean(depth, q1_rate=25, q3_rate=75, alpha=0) + world_point = np.asarray(world_point, dtype=int) - depth_avg = np.mean(world_point[:, 2]) - canonical_point[:, 2] = canonical_point[:, 2] + depth_avg - return canonical_point, world_point + # depth_avg = np.mean(world_point[:, 2]) + depth_avg = np.mean(world_point_iqr[:, 2]) + canonical_point[:, 2] = canonical_point[:, 2] + depth_avg + self.hand_thickness + + replace_point = world_point_iqr + xyz_distances = np.linalg.norm(world_point_iqr-canonical_point, axis=1) + # print(f'canonical_point: {canonical_point}') + # print(f'world_point_iqr: {world_point_iqr}') + # print(f'replace_point(before): {replace_point}') + replace_point[xyz_distances >= replace_th] = canonical_point[xyz_distances >= replace_th] + # print(f'distances(th=20 mm): {xyz_distances} / {xyz_distances >= replace_th}') + # print(f'replace_point(after): {replace_point}') + return canonical_point, world_point, world_point_iqr, replace_point pass - def get_hand_keypoint_pixel_xy(self): - pass + @staticmethod + def vector_to_rpy(x, y, z): + # Yaw (ψ) + yaw = np.arctan2(y, x) + # Pitch (θ) + pitch = np.arctan2(-z, np.sqrt(x ** 2 + y ** 2)) + # Roll (φ) is typically set to zero for a single vector + roll = 0.0 + return roll, pitch, yaw + + @staticmethod + def remove_outliers_iqr(data, q1_rate=25., q3_rate=75., alpha=1.5): + """ + # IQR 방법으로 이상치 제거 + :return: + """ + q1 = np.percentile(data, q1_rate) + q3 = np.percentile(data, q3_rate) + iqr = q3 - q1 + lower_bound = q1 - (alpha * iqr) + upper_bound = q3 + (alpha * iqr) + return data[(data >= lower_bound) & (data <= upper_bound)] + + @staticmethod + def replace_outliers_iqr_as_mean(data, q1_rate=25., q3_rate=75., alpha=0.5): + """ + # IQR 방법으로 이상치 제거하고 평균값으로 대체하는 함수 + :return: + """ + q1 = np.percentile(data, q1_rate) + q3 = np.percentile(data, q3_rate) + iqr = q3 - q1 + lower_bound = q1 - (alpha * iqr) + upper_bound = q3 + (alpha * iqr) + + # 이상치의 인덱스를 저장 + outliers_indices = np.where((data < lower_bound) | (data > upper_bound))[0] + + # 이상치가 아닌 값들로 평균을 계산 + mean_value = np.mean(data[(data >= lower_bound) & (data <= upper_bound)]) + + # 이상치를 평균값으로 대체 + data[outliers_indices] = mean_value + + # print(f'IQR: q1:{q1}, q3:{q3}, iqr:{iqr}, l_b:{lower_bound}, u_b:{upper_bound}, indices:{outliers_indices}, mean:{mean_value}') + return data - def get_hand_keypoint_pixel_xyz(self, hand_index=0, keypoint='index_finger_tip'): + + def get_hand_keypoint_pixel_xyz(self, hand_index=0, keypoint='index_finger_tip', coord='replace'): try: keypoint_index = self.keypoints['keypoints'][keypoint] - landmarks = self.hand_results[hand_index]['landmarks'] - x = landmarks[keypoint_index, 0] - y = landmarks[keypoint_index, 1] - z = landmarks[keypoint_index, 2] - return x, y, z + if coord == 'canonical': + landmarks = self.canonical_points + x = landmarks[keypoint_index, 0] + y = landmarks[keypoint_index, 1] + z = landmarks[keypoint_index, 2] + return np.array([x, y, z]) + + elif coord == 'replace': + landmarks = self.replace_point + x = landmarks[keypoint_index, 0] + y = landmarks[keypoint_index, 1] + z = landmarks[keypoint_index, 2] + return np.array([x, y, z]) + + elif coord == 'normalized': + landmarks = self.hand_results[hand_index]['landmarks'] + x = landmarks[keypoint_index, 0] + y = landmarks[keypoint_index, 1] + z = landmarks[keypoint_index, 2] + return np.array([x, y, z]) + except Exception as e: print(f'[mediapipe_hands.py] Exception error: {e}') finally: pass + def get_hand_world_xyz(self): + xyz_world = [] + for idx, xyz in enumerate(self.replace_point): + coordinate_xyz = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [xyz[0], xyz[1]], xyz[2]) + xyz_world.append(coordinate_xyz) + + xyz_world = np.asarray(xyz_world, dtype=np.float64) + return xyz_world + + def get_palm_pose(self, coord='replace'): + p1 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='wrist', coord=coord) + p2 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='pinky_mcp', coord=coord) + p3 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='index_finger_mcp', coord=coord) + + v1 = p2 - p1 + v2 = p3 - p1 + center_point = (p1 + p2 + p3) / 3. + normal_vector = np.cross(v1, v2) + normal_unit_vector = normal_vector / np.linalg.norm(normal_vector, 2) + + return center_point, normal_unit_vector + def conversion_hand_keypoint_pixel_to_point(self, keypoints_array, top_point_n=None): """Algorithm for annotating pixel. -- Not Used -- @@ -338,7 +551,7 @@ def conversion_hand_keypoint_pixel_to_point(self, keypoints_array, top_point_n=N keypoint_arr = np.reshape(keypoints_array, (21, 3)) # must be check if top_point_n == None: - align_keypoint_world_arr = [] + align_z_keypoint_world_arr = [] h, w = self.depth_image_filtered.shape for idx, pixel_xyz in enumerate(keypoint_arr): x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow @@ -349,9 +562,10 @@ def conversion_hand_keypoint_pixel_to_point(self, keypoints_array, top_point_n=N z = self.depth_image_filtered[y, x] xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) - align_keypoint_world_arr.append(xyz_world) + align_z_keypoint_world_arr.append(xyz_world) - return align_keypoint_world_arr + align_z_keypoint_world_arr = np.asarray(align_z_keypoint_world_arr, dtype=np.float64) + return align_z_keypoint_world_arr elif isinstance(top_point_n, int): z_arr = keypoint_arr[:, 2] # depth values @@ -493,8 +707,7 @@ def rs_init(self, fps=30): # 카메라 시작 self.profile = self.pipeline.start(self.config) - self.align = rs.align(rs.stream.color) - # align = rs.align(rs.stream.depth) + # self.align = rs.align(rs.stream.color) self.color_intrinsics = self.profile.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() self.depth_intrinsics = self.profile.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() @@ -520,15 +733,20 @@ def rs_init(self, fps=30): def get_frames(self): frames = self.pipeline.wait_for_frames() - # align_frames = align.process(frames) align_frames = frames + # align_frames = self.align.process(frames) + + depth_to_disparity_transform = rs.disparity_transform(True) # True for depth to disparity + align_frames = depth_to_disparity_transform.process(align_frames) + + align_frames = rs.spatial_filter().process(align_frames) + align_frames = rs.temporal_filter().process(align_frames) + + disparity_to_depth_transform = rs.disparity_transform(False) + align_frames = disparity_to_depth_transform.process(align_frames).as_frameset() + color_frame = align_frames.get_color_frame() depth_frame = align_frames.get_depth_frame() - # depth_frame = rs.depth_to_disparity().process(depth_frame) - depth_frame = rs.spatial_filter().process(depth_frame) - depth_frame = rs.temporal_filter().process(depth_frame) - # depth_frame = rs.disparity_to_depth().process(depth_frame) - # depth_frame = rs.hole_filling_filter().process(depth_frame) if not depth_frame or not color_frame: return depth_frame, color_frame @@ -556,17 +774,18 @@ def realsense_demo(self): self.hand_detection(image_color, image_depth, self.depth_intrinsics) index_finger_tip_image = self.hand_landmarks['landmarks'] - if index_finger_tip_image is None: + index_finger_tip_world = self.hand_landmarks['world_landmarks'] + + if index_finger_tip_image is None or index_finger_tip_world is None: continue xyz_idx = index_finger_tip_image[8] - index_finger_tip = self.hand_landmarks['world_landmarks'] x = min(int(xyz_idx[0] * image_width), image_width - 1) # prevent the index overflow y = min(int(xyz_idx[1] * image_height), image_height - 1) # prevent the index overflow # if x <= 0 or x >= w or y <= 0 or y >= h: # ''' out of index ''' # return z = self.depth_image_filtered[y, x] - z2 = index_finger_tip[8][2] + z2 = index_finger_tip_world[8][2] finger_depth = z cv2.line(self.color_image, (int(image_width / 2), int(image_height / 2)), @@ -584,11 +803,19 @@ def realsense_demo(self): cv2.putText(self.depth_image_filtered, f"{x:.1f}, {y:.1f}, {z:.1f} mm", (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) + + + if self.color_image is None or self.depth_image_for_drawing is None: + continue cv2.imshow('MediaPipe Hands', self.color_image) depth_show_img = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image_filtered, alpha=0.3), cv2.COLORMAP_JET) - cv2.imshow('depth image', depth_show_img) + # cv2.imshow('depth image', depth_show_img) + + cv2.imshow('depth image2', self.depth_image_for_drawing) + + if cv2.waitKey(5) & 0xFF == 27: break From 357331506f4fe6ec753baaa74c9fe5982d5aa4f0 Mon Sep 17 00:00:00 2001 From: Bigyuun Date: Fri, 31 May 2024 16:53:06 +0900 Subject: [PATCH 05/11] update handpose code --- .../handpose_pkg/D455_preset_default.json | 104 +++ .../mediapipe_hands_developing.py | 848 ++++++++++++++++++ .../handpose_pkg/mediapipe_hands_legacy.py | 848 ++++++++++++++++++ 3 files changed, 1800 insertions(+) create mode 100644 src/handpose_pkg/handpose_pkg/D455_preset_default.json create mode 100644 src/handpose_pkg/handpose_pkg/mediapipe_hands_developing.py create mode 100644 src/handpose_pkg/handpose_pkg/mediapipe_hands_legacy.py diff --git a/src/handpose_pkg/handpose_pkg/D455_preset_default.json b/src/handpose_pkg/handpose_pkg/D455_preset_default.json new file mode 100644 index 0000000..5f2de14 --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/D455_preset_default.json @@ -0,0 +1,104 @@ +{ + "device": { + "fw version": "5.12.7.150", + "name": "Intel RealSense D455", + "product line": "D400" + }, + "parameters": { + "aux-param-autoexposure-setpoint": "400", + "aux-param-colorcorrection1": "0.461914", + "aux-param-colorcorrection10": "-0.553711", + "aux-param-colorcorrection11": "-0.553711", + "aux-param-colorcorrection12": "0.0458984", + "aux-param-colorcorrection2": "0.540039", + "aux-param-colorcorrection3": "0.540039", + "aux-param-colorcorrection4": "0.208008", + "aux-param-colorcorrection5": "-0.332031", + "aux-param-colorcorrection6": "-0.212891", + "aux-param-colorcorrection7": "-0.212891", + "aux-param-colorcorrection8": "0.68457", + "aux-param-colorcorrection9": "0.930664", + "aux-param-depthclampmax": "65536", + "aux-param-depthclampmin": "0", + "aux-param-disparityshift": "0", + "controls-autoexposure-auto": "True", + "controls-autoexposure-manual": "8500", + "controls-color-autoexposure-auto": "True", + "controls-color-autoexposure-manual": "166", + "controls-color-backlight-compensation": "0", + "controls-color-brightness": "0", + "controls-color-contrast": "50", + "controls-color-gain": "64", + "controls-color-gamma": "300", + "controls-color-hue": "0", + "controls-color-power-line-frequency": "3", + "controls-color-saturation": "64", + "controls-color-sharpness": "50", + "controls-color-white-balance-auto": "True", + "controls-color-white-balance-manual": "4600", + "controls-depth-gain": "16", + "controls-laserpower": "150", + "controls-laserstate": "on", + "ignoreSAD": "0", + "param-amplitude-factor": "0", + "param-autoexposure-setpoint": "400", + "param-censusenablereg-udiameter": "9", + "param-censusenablereg-vdiameter": "9", + "param-censususize": "9", + "param-censusvsize": "9", + "param-depthclampmax": "65536", + "param-depthclampmin": "0", + "param-depthunits": "1000", + "param-disableraucolor": "0", + "param-disablesadcolor": "0", + "param-disablesadnormalize": "0", + "param-disablesloleftcolor": "0", + "param-disableslorightcolor": "0", + "param-disparitymode": "0", + "param-disparityshift": "0", + "param-lambdaad": "800", + "param-lambdacensus": "26", + "param-leftrightthreshold": "24", + "param-maxscorethreshb": "2047", + "param-medianthreshold": "500", + "param-minscorethresha": "1", + "param-neighborthresh": "7", + "param-raumine": "1", + "param-rauminn": "1", + "param-rauminnssum": "3", + "param-raumins": "1", + "param-rauminw": "1", + "param-rauminwesum": "3", + "param-regioncolorthresholdb": "0.0499022", + "param-regioncolorthresholdg": "0.0499022", + "param-regioncolorthresholdr": "0.0499022", + "param-regionshrinku": "3", + "param-regionshrinkv": "1", + "param-robbinsmonrodecrement": "10", + "param-robbinsmonroincrement": "10", + "param-rsmdiffthreshold": "4", + "param-rsmrauslodiffthreshold": "1", + "param-rsmremovethreshold": "0.375", + "param-scanlineedgetaub": "72", + "param-scanlineedgetaug": "72", + "param-scanlineedgetaur": "72", + "param-scanlinep1": "60", + "param-scanlinep1onediscon": "105", + "param-scanlinep1twodiscon": "70", + "param-scanlinep2": "342", + "param-scanlinep2onediscon": "190", + "param-scanlinep2twodiscon": "130", + "param-secondpeakdelta": "325", + "param-texturecountthresh": "0", + "param-texturedifferencethresh": "0", + "param-usersm": "1", + "param-zunits": "1000" + }, + "schema version": 1, + "viewer": { + "stream-depth-format": "Z16", + "stream-fps": "30", + "stream-height": "480", + "stream-width": "640" + } +} \ No newline at end of file diff --git a/src/handpose_pkg/handpose_pkg/mediapipe_hands_developing.py b/src/handpose_pkg/handpose_pkg/mediapipe_hands_developing.py new file mode 100644 index 0000000..075b7f0 --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/mediapipe_hands_developing.py @@ -0,0 +1,848 @@ +import mediapipe as mp +import cv2 +import numpy as np +import uuid +import os +import pyrealsense2 as rs +import time +import matplotlib +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +from matplotlib.animation import FuncAnimation +from functools import partial +import threading +from multiprocessing import Process +# matplotlib.use('Agg') + +import json + +from RealSense_Utilities.realsense_api.realsense_api import RealSenseCamera +from RealSense_Utilities.realsense_api.realsense_api import find_realsense +from RealSense_Utilities.realsense_api.realsense_api import frame_to_np_array + +import queue + +queue = queue.Queue() +g_hand_data = np.zeros((21, 3)) +g_canonical_points = np.zeros((21, 3)) +g_world_points = np.zeros((21, 3)) +g_world_points_iqr = np.zeros((21, 3)) +g_replace_point = np.zeros((21, 3)) +g_palm_center = np.zeros(3) +g_palm_normal_vector = np.zeros(3) +g_palm_center_cano = np.zeros(3) +g_palm_normal_vector_cano = np.zeros(3) + +class RealTimePlot3D: + def __init__(self, num_points=21): + self.num_points = num_points + self.data = np.random.randn(self.num_points, 3) + self.fig = plt.figure() + # self.fig2 = plt.figure() + self.ax = self.fig.add_subplot(231, projection='3d') # visualization of hand pose + self.ax.set_xlabel('X Label') + self.ax.set_ylabel('Y Label') + self.ax.set_zlabel('Z Label') + self.ax.set_xlim(-0.1, 0.1) + self.ax.set_ylim(-0.1, 0.1) + self.ax.set_zlim(-0.1, 0.1) + + self.ax2 = self.fig.add_subplot(232, projection='3d') # visualization of hand pose + self.ax2.set_xlabel('X pixel') + self.ax2.set_ylabel('Y pixel') + self.ax2.set_zlabel('Z depth') + + self.ax3 = self.fig.add_subplot(233, projection='3d') # visualization of hand pose + self.ax3.set_xlabel('X pixel') + self.ax3.set_ylabel('Y pixel') + self.ax3.set_zlabel('Z depth') + + self.ax4 = self.fig.add_subplot(234, projection='3d') # visualization of hand pose + self.ax4.set_xlabel('X pixel') + self.ax4.set_ylabel('Y pixel') + self.ax4.set_zlabel('Z depth') + + self.ax5 = self.fig.add_subplot(235, projection='3d') # visualization of hand pose + self.ax5.set_xlabel('X pixel') + self.ax5.set_ylabel('Y pixel') + self.ax5.set_zlabel('Z depth') + + self.ax6 = self.fig.add_subplot(236, projection='3d') # visualization of hand pose + self.ax6.set_xlabel('X pixel') + self.ax6.set_ylabel('Y pixel') + self.ax6.set_zlabel('Z depth') + + # self.ani = None + self.ani = FuncAnimation(self.fig, self.update_data, frames=1, interval=100) + self.scatter = self.ax.scatter(g_hand_data[:, 0], g_hand_data[:, 1], g_hand_data[:, 2]) + self.scatter_canonical_points = self.ax.scatter(g_canonical_points[:, 0], g_canonical_points[:, 1], g_canonical_points[:, 2]) + self.scatter_world_points = self.ax.scatter(g_world_points[:, 0], g_world_points[:, 1], g_world_points[:, 2]) + self.scatter_world_points_iqr = self.ax.scatter(g_world_points_iqr[:, 0], g_world_points_iqr[:, 1], g_world_points_iqr[:, 2]) + self.scatter_replace_points = self.ax.scatter(g_replace_point[:, 0], g_replace_point[:, 1], g_replace_point[:, 2]) + self.update_thread = threading.Thread(target=self.update_data) + self.update_thread.daemon = True + + def update_data(self, frames): + + global g_hand_data, g_canonical_points, g_world_points, g_world_points_iqr, g_replace_point + global g_palm_center, g_palm_normal_vector, g_palm_center_cano, g_palm_normal_vector_cano + colors = ['black', 'blue', 'green', 'orange', 'red', 'black'] + intervals = [4, 8, 12, 16, 20] + + while True: + + data = g_hand_data + data_c_p = g_canonical_points + data_w_p = g_world_points + data_w_p_iqr = g_world_points_iqr + data_r_p = g_replace_point + # print(f'canonical: {data_c_p}') + # print(f'world_iqr: {data_w_p_iqr}') + # print(f'replace: {data_r_p}') + + # 현재 점 삭제 + self.scatter.remove() + self.scatter_canonical_points.remove() + self.scatter_world_points.remove() + self.scatter_world_points_iqr.remove() + self.scatter_replace_points.remove() + self.ax.cla() + self.ax2.cla() + self.ax3.cla() + self.ax4.cla() + self.ax5.cla() + self.ax6.cla() + self.ax.set_xlabel('X Label') + self.ax.set_ylabel('Y Label') + self.ax.set_zlabel('Z Label') + # self.ax.set_xlim(0, 500) + # self.ax.set_ylim(0, 500) + # self.ax.set_zlim(-100, 400) + + max_xyz_c = np.max(data_c_p, axis=0) + min_xyz_c = np.min(data_c_p, axis=0) + max_xyz_w = np.max(data_w_p, axis=0) + min_xyz_w = np.min(data_w_p, axis=0) + max_xyz_w_iqr = np.max(data_w_p_iqr, axis=0) + min_xyz_w_iqr = np.min(data_w_p_iqr, axis=0) + + th = 50 + # self.ax2.set_xlim(min_xyz_c[0] - th, max_xyz_c[0] + th) + # self.ax2.set_ylim(min_xyz_c[1] - th, max_xyz_c[1] + th) + # self.ax2.set_zlim(min_xyz_c[2] - th, max_xyz_c[2] + th) + # self.ax4.set_xlim(min_xyz_c[0] - th, max_xyz_c[0] + th) + # self.ax4.set_ylim(min_xyz_c[1] - th, max_xyz_c[1] + th) + # self.ax4.set_zlim(min_xyz_c[2] - th, max_xyz_c[2] + th) + # self.ax5.set_xlim(min_xyz_w[0] - th, max_xyz_w[0] + th) + # self.ax5.set_ylim(min_xyz_w[1] - th, max_xyz_w[1] + th) + # self.ax5.set_zlim(min_xyz_w[2] - th, max_xyz_w[2] + th) + # self.ax6.set_xlim(min_xyz_w_iqr[0] - th, max_xyz_w_iqr[0] + th) + # self.ax6.set_ylim(min_xyz_w_iqr[1] - th, max_xyz_w_iqr[1] + th) + # self.ax6.set_zlim(min_xyz_w_iqr[2] - th, max_xyz_w_iqr[2] + th) + + self.ax2.set_xlim(300, 500) + self.ax2.set_ylim(100, 300) + self.ax2.set_zlim(400, 700) + self.ax3.set_xlim(300, 500) + self.ax3.set_ylim(100, 300) + self.ax3.set_zlim(400, 700) + self.ax4.set_xlim(300, 500) + self.ax4.set_ylim(100, 300) + self.ax4.set_zlim(400, 700) + self.ax5.set_xlim(300, 500) + self.ax5.set_ylim(100, 300) + self.ax5.set_zlim(400, 700) + self.ax6.set_xlim(300, 500) + self.ax6.set_ylim(100, 300) + self.ax6.set_zlim(400, 700) + + + # print(f'{data[8,0]} / {data[8,1]} / {data[8,2]}') + self.scatter = self.ax.scatter(data[:, 0], data[:, 1], data[:, 2], color='black', s=50, alpha=1) + + self.scatter_canonical_points = self.ax2.scatter(data_c_p[:, 0], data_c_p[:, 1], data_c_p[:, 2], color='red', s=10, alpha=1) + self.scatter_world_points = self.ax2.scatter(data_w_p[:, 0], data_w_p[:, 1], data_w_p[:, 2], color='blue', s=10, alpha=1) + self.scatter_world_points_iqr = self.ax2.scatter(data_w_p_iqr[:, 0], data_w_p_iqr[:, 1], data_w_p_iqr[:, 2], color='green', s=10, alpha=1) + self.scatter_replace_points = self.ax2.scatter(data_r_p[:, 0], data_r_p[:, 1], data_r_p[:, 2], color='purple', s=10, alpha=1) + + self.scatter_replace_points = self.ax3.scatter(data_r_p[:, 0], data_r_p[:, 1], data_r_p[:, 2], color='purple', s=10, alpha=1) + + self.scatter_canonical_points = self.ax4.scatter(data_c_p[:, 0], data_c_p[:, 1], data_c_p[:, 2], color='red', s=10, alpha=1) + + self.scatter_world_points = self.ax5.scatter(data_w_p[:, 0], data_w_p[:, 1], data_w_p[:, 2], color='blue', s=10, alpha=1) + + self.scatter_world_points_iqr = self.ax6.scatter(data_w_p_iqr[:, 0], data_w_p_iqr[:, 1], data_w_p_iqr[:, 2], color='green', s=10, alpha=1) + # self.scatter_replace_points = self.ax6.scatter(data_r_p[:, 0], data_r_p[:, 1], data_r_p[:, 2], color='purple', s=10, alpha=1) + + # print(f'canonical: {data_c_p}') + # print(f'world_iqr: {data_w_p_iqr}') + # print(f'replace: {data_r_p}') + # self.scatter_2 = self.ax2.scatter() + for i in range(len(intervals)): + start_idx = 0 if i == 0 else intervals[i - 1] + 1 + end_idx = intervals[i] + self.ax.plot(data[start_idx:end_idx + 1, 0], data[start_idx:end_idx + 1, 1], data[start_idx:end_idx + 1, 2], color=colors[i]) + self.ax2.plot(data_c_p[start_idx:end_idx + 1, 0], data_c_p[start_idx:end_idx + 1, 1], data_c_p[start_idx:end_idx + 1, 2], color='red') + self.ax2.plot(data_w_p[start_idx:end_idx + 1, 0], data_w_p[start_idx:end_idx + 1, 1], data_w_p[start_idx:end_idx + 1, 2], color='blue') + self.ax2.plot(data_w_p_iqr[start_idx:end_idx + 1, 0], data_w_p_iqr[start_idx:end_idx + 1, 1], data_w_p_iqr[start_idx:end_idx + 1, 2], color='green') + self.ax2.plot(data_r_p[start_idx:end_idx + 1, 0], data_r_p[start_idx:end_idx + 1, 1], data_r_p[start_idx:end_idx + 1, 2], color='purple') + + self.ax3.plot(data_r_p[start_idx:end_idx + 1, 0], data_r_p[start_idx:end_idx + 1, 1], data_r_p[start_idx:end_idx + 1, 2], color='purple') + # 벡터 그리기 + self.ax3.quiver(g_palm_center[0], g_palm_center[1], g_palm_center[2] , g_palm_normal_vector[0], g_palm_normal_vector[1], g_palm_normal_vector[2], color='r', length=150, normalize=False) + + self.ax4.plot(data_c_p[start_idx:end_idx + 1, 0], data_c_p[start_idx:end_idx + 1, 1], data_c_p[start_idx:end_idx + 1, 2], color='red') + self.ax4.quiver(g_palm_center_cano[0], g_palm_center_cano[1], g_palm_center_cano[2] , g_palm_normal_vector_cano[0], g_palm_normal_vector_cano[1], g_palm_normal_vector_cano[2], color='r', length=150, normalize=False) + + self.ax5.plot(data_w_p[start_idx:end_idx + 1, 0], data_w_p[start_idx:end_idx + 1, 1], data_w_p[start_idx:end_idx + 1, 2], color='blue') + + self.ax6.plot(data_w_p_iqr[start_idx:end_idx + 1, 0], data_w_p_iqr[start_idx:end_idx + 1, 1], data_w_p_iqr[start_idx:end_idx + 1, 2], color='green') + # self.ax6.plot(data_r_p[start_idx:end_idx + 1, 0], data_r_p[start_idx:end_idx + 1, 1], data_r_p[start_idx:end_idx + 1, 2], color='purple') + + return + # return self.scatter + + def start(self): + # 데이터 업데이트 쓰레드 시작 + self.update_thread.start() + self.ani = FuncAnimation(self.fig, self.update_data, frames=100, interval=30) + + +class HandLandmarks(): + def __init__(self): + self.keypoints = json.load(open("./handlandmark_keypoints.json")) + self.hand_landmarks = {} # tuple + self.hand_landmarks['index'] = None + self.hand_landmarks['score'] = None + self.hand_landmarks['label'] = None + self.hand_landmarks['landmarks'] = np.zeros((21, 3)) + self.hand_landmarks['world_landmarks'] = np.zeros((21, 3)) # calculate from camera instrinsic(Realsense) + # self.hand_landmarks['canonical_landmarks'] = None # calculate from camera instrinsic(Realsense) + # self.hand_landmarks['replace_landmarks'] = None # calculate from camera instrinsic(Realsense) + + + # if serveral hands is detected, hand_results will has objects of each hands. + # e.g. [{hand_landmarks#1}, {hand_landmarks#2}, ...] + self.hand_results = [] + + pass + + +class MediaPipeHandLandmarkDetector(HandLandmarks): + # pass + def __init__(self): + super().__init__() + self.camera_to_hand_vector = {'x': 0, 'y': 0, 'z': 0} + self.hand_data = np.zeros((21, 3)) + self.mp_drawing = mp.solutions.drawing_utils + self.mp_hands = mp.solutions.hands + self.hands = self.mp_hands.Hands(min_detection_confidence=0.8, + min_tracking_confidence=0.7) + self.canonical_points = np.zeros((21, 3)) + self.world_points = np.zeros((21, 3)) + self.world_points_iqr = np.zeros((21, 3)) + self.replace_point = np.zeros((21, 3)) + self.palm_vector = {'x', 'y', 'z', 'r','p','y'} + + # smoothing (LPF-low pass filter) + self.depth_intrinsics = None + self.finger_depth_prev = 0 + self.finger_depth_curr = 0 + self.filter_sensitivity = 0.3 + + self.image_width = 640 + self.image_height = 480 + + self.color_image = None + self.depth_image = None + self.depth_image_prev = None + self.depth_image_for_drawing = None + self.start_flag = False + + self.hand_thickness = 10 # mm + + self.pps = 0 + + def hand_detection(self, color_frame, depth_frame, depth_intrinsic=None): + global g_hand_data, g_canonical_points, g_world_points, g_world_points_iqr, g_replace_point + global g_palm_center, g_palm_normal_vector, g_palm_center_cano, g_palm_normal_vector_cano + ###################################################### + # Flip the image horizontally for a later selfie-view display, and convert + # the BGR image to RGB. + self.depth_intrinsics = depth_intrinsic + self.color_image = color_frame + self.color_image = cv2.flip(self.color_image, 1) + self.color_image = cv2.cvtColor(self.color_image, cv2.COLOR_BGR2RGB) + self.depth_image = depth_frame + + if self.start_flag == False: + self.depth_image_filtered = self.depth_image + else: + self.depth_image_filtered = self.filter_sensitivity * self.depth_image + ( + 1 - self.filter_sensitivity) * self.depth_image_prev + + self.depth_image_filtered = cv2.flip(self.depth_image_filtered, 1) + self.depth_image_prev = self.depth_image_filtered + # depth_norm_image = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.3), cv2.COLORMAP_JET) + + # To improve performance, optionally mark the image as not writeable to + # pass by reference. + self.color_image.flags.writeable = False + results = self.hands.process(self.color_image) + self.image_height, self.image_width, _ = self.color_image.shape + depth_image_height, depth_image_width = self.depth_image_filtered.shape + if self.image_height != depth_image_height or self.image_width != depth_image_width: + print(f'[mediapipe_hands.py | Warning] It does not match a size (H x W) of color & depth frame') + # Draw the hand annotations on the image. + self.color_image.flags.writeable = True + self.color_image = cv2.cvtColor(self.color_image, cv2.COLOR_RGB2BGR) + ###################################################### + + self.hand_results.clear() + + if results.multi_handedness: + + s_time = time.time() + + for handedness, hand_landmarks in zip(results.multi_handedness, results.multi_hand_landmarks): + # dictionary clear + self.hand_landmarks = {key: None for key in self.hand_landmarks} + + classification = handedness.classification[0] + index = classification.index + score = classification.score + label = classification.label + self.hand_landmarks['index'] = classification.index + self.hand_landmarks['score'] = classification.score + self.hand_landmarks['label'] = classification.label + + hand_data = np.zeros((21, 3)) + for idx, landmrk in enumerate(hand_landmarks.landmark): + cx, cy, cz = landmrk.x, landmrk.y, landmrk.z + hand_data[idx, 0] = cx + hand_data[idx, 1] = cy + hand_data[idx, 2] = cz + g_hand_data[idx, 0] = cx + g_hand_data[idx, 1] = cy + g_hand_data[idx, 2] = cz + pixel_x = int(cx * self.image_width) + pixel_y = int(cy * self.image_height) + + canonical_points, world_points, world_points_iqr, replace_point = self.compare_coordinate_canonical_with_world(hand_data) + g_canonical_points = canonical_points + g_world_points = world_points + g_world_points_iqr = world_points_iqr + g_replace_point = replace_point + self.canonical_points = canonical_points + self.world_points = world_points + self.world_points_iqr = world_points_iqr + self.replace_point = replace_point + + + self.hand_landmarks['landmarks'] = hand_data + # world_landmarks = self.conversion_hand_keypoint_pixel_to_point(hand_data, top_point_n=None) + # self.hand_landmarks['world_landmarks'] = world_landmarks + self.hand_landmarks['world_landmarks'] = self.get_hand_world_xyz() + c, n_v = self.get_palm_pose(coord='replace') + g_palm_center = c + g_palm_normal_vector = n_v + + c2, n_v2 = self.get_palm_pose(coord='canonical') + g_palm_center_cano = c2 + g_palm_normal_vector_cano = n_v2 + + # finally + self.hand_results.append(self.hand_landmarks) + + # drawing points on image + self.mp_drawing.draw_landmarks( + self.color_image, + hand_landmarks, + self.mp_hands.HAND_CONNECTIONS, + # mp_drawing_styles.get_default_hand_landmarks_style(), + # mp_drawing_styles.get_default_hand_connections_style() + ) + + # self.depth_image_for_drawing = np.zeros((self.image_height, self.image_width, 3), dtype=np.uint16) + # self.depth_image_for_drawing[:, :, 0] = self.depth_image_filtered + # self.depth_image_for_drawing = cv2.cvtColor(self.depth_image_for_drawing, cv2.COLOR_RGB2BGR) + + self.depth_image_for_drawing = self.depth_image_filtered + self.depth_image_for_drawing = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image_for_drawing, alpha=0.3), cv2.COLORMAP_JET) + + self.mp_drawing.draw_landmarks( + self.depth_image_for_drawing, + hand_landmarks, + self.mp_hands.HAND_CONNECTIONS, + # mp_drawing_styles.get_default_hand_landmarks_style(), + # mp_drawing_styles.get_default_hand_connections_style() + ) + + e_time = time.time() + self.pps = 1 / (e_time - s_time) + + def compare_coordinate_canonical_with_world(self, hand_landmarks_array, replace_th=50): + canonical_point = np.zeros((21, 3)) + hand_landmarks_array = np.asarray(hand_landmarks_array) + w, h = self.image_width, self.image_height + + # canonical_point[:, 0] = min(int(hand_landmarks_array[:, 0] * w), w - 1) + # canonical_point[:, 1] = min(int(hand_landmarks_array[:, 1] * h), h - 1) + # canonical_point[:, 2] = int(hand_landmarks_array[:, 2] * w) + canonical_point[:, 0] = [min(int(x * w), w - 1) for x in hand_landmarks_array[:, 0]] + canonical_point[:, 1] = [min(int(x * h), h - 1) for x in hand_landmarks_array[:, 1]] + canonical_point[:, 2] = [int(x * w) for x in hand_landmarks_array[:, 2]] + canonical_point = np.asarray(canonical_point, dtype=int) + + world_point = np.zeros((21, 3)) + world_point_iqr = np.zeros((21, 3)) + + # depth = np.zeros((1, 21)) + depth = self.depth_image[canonical_point[:, 1], canonical_point[:, 0]] + world_point[:, 0] = canonical_point[:, 0] + world_point[:, 1] = canonical_point[:, 1] + world_point[:, 2] = depth + world_point_iqr[:, 0] = canonical_point[:, 0] + world_point_iqr[:, 1] = canonical_point[:, 1] + world_point_iqr[:, 2] = self.replace_outliers_iqr_as_mean(depth, q1_rate=25, q3_rate=75, alpha=0) + + world_point = np.asarray(world_point, dtype=int) + + # depth_avg = np.mean(world_point[:, 2]) + depth_avg = np.mean(world_point_iqr[:, 2]) + canonical_point[:, 2] = canonical_point[:, 2] + depth_avg + self.hand_thickness + + replace_point = world_point_iqr + xyz_distances = np.linalg.norm(world_point_iqr-canonical_point, axis=1) + # print(f'canonical_point: {canonical_point}') + # print(f'world_point_iqr: {world_point_iqr}') + # print(f'replace_point(before): {replace_point}') + replace_point[xyz_distances >= replace_th] = canonical_point[xyz_distances >= replace_th] + # print(f'distances(th=20 mm): {xyz_distances} / {xyz_distances >= replace_th}') + # print(f'replace_point(after): {replace_point}') + return canonical_point, world_point, world_point_iqr, replace_point + pass + + @staticmethod + def vector_to_rpy(x, y, z): + # Yaw (ψ) + yaw = np.arctan2(y, x) + # Pitch (θ) + pitch = np.arctan2(-z, np.sqrt(x ** 2 + y ** 2)) + # Roll (φ) is typically set to zero for a single vector + roll = 0.0 + return roll, pitch, yaw + + @staticmethod + def remove_outliers_iqr(data, q1_rate=25., q3_rate=75., alpha=1.5): + """ + # IQR 방법으로 이상치 제거 + :return: + """ + q1 = np.percentile(data, q1_rate) + q3 = np.percentile(data, q3_rate) + iqr = q3 - q1 + lower_bound = q1 - (alpha * iqr) + upper_bound = q3 + (alpha * iqr) + return data[(data >= lower_bound) & (data <= upper_bound)] + + @staticmethod + def replace_outliers_iqr_as_mean(data, q1_rate=25., q3_rate=75., alpha=0.5): + """ + # IQR 방법으로 이상치 제거하고 평균값으로 대체하는 함수 + :return: + """ + q1 = np.percentile(data, q1_rate) + q3 = np.percentile(data, q3_rate) + iqr = q3 - q1 + lower_bound = q1 - (alpha * iqr) + upper_bound = q3 + (alpha * iqr) + + # 이상치의 인덱스를 저장 + outliers_indices = np.where((data < lower_bound) | (data > upper_bound))[0] + + # 이상치가 아닌 값들로 평균을 계산 + mean_value = np.mean(data[(data >= lower_bound) & (data <= upper_bound)]) + + # 이상치를 평균값으로 대체 + data[outliers_indices] = mean_value + + # print(f'IQR: q1:{q1}, q3:{q3}, iqr:{iqr}, l_b:{lower_bound}, u_b:{upper_bound}, indices:{outliers_indices}, mean:{mean_value}') + return data + + + def get_hand_keypoint_pixel_xyz(self, hand_index=0, keypoint='index_finger_tip', coord='replace'): + try: + keypoint_index = self.keypoints['keypoints'][keypoint] + + if coord == 'canonical': + landmarks = self.canonical_points + x = landmarks[keypoint_index, 0] + y = landmarks[keypoint_index, 1] + z = landmarks[keypoint_index, 2] + return np.array([x, y, z]) + + elif coord == 'replace': + landmarks = self.replace_point + x = landmarks[keypoint_index, 0] + y = landmarks[keypoint_index, 1] + z = landmarks[keypoint_index, 2] + return np.array([x, y, z]) + + elif coord == 'normalized': + landmarks = self.hand_results[hand_index]['landmarks'] + x = landmarks[keypoint_index, 0] + y = landmarks[keypoint_index, 1] + z = landmarks[keypoint_index, 2] + return np.array([x, y, z]) + + except Exception as e: + print(f'[mediapipe_hands.py] Exception error: {e}') + finally: + pass + + def get_hand_world_xyz(self): + xyz_world = [] + for idx, xyz in enumerate(self.replace_point): + coordinate_xyz = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [xyz[0], xyz[1]], xyz[2]) + xyz_world.append(coordinate_xyz) + + xyz_world = np.asarray(xyz_world, dtype=np.float64) + return xyz_world + + def get_palm_pose(self, coord='replace'): + p1 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='wrist', coord=coord) + p2 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='pinky_mcp', coord=coord) + p3 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='index_finger_mcp', coord=coord) + + v1 = p2 - p1 + v2 = p3 - p1 + center_point = (p1 + p2 + p3) / 3. + normal_vector = np.cross(v1, v2) + normal_unit_vector = normal_vector / np.linalg.norm(normal_vector, 2) + + return center_point, normal_unit_vector + + def conversion_hand_keypoint_pixel_to_point(self, keypoints_array, top_point_n=None): + """Algorithm for annotating pixel. + -- Not Used -- + Select 3(or more, optional) points closest to the camera. + And, calculate of scale of x,y and z (distance_pixel : distance_world) + Finally, obtain all 21 x,y and z dimension values of keypoints on real world + + Landmarks + There are 21 hand landmarks, each composed of x, y and z coordinates. + The x and y coordinates are normalized to [0.0, 1.0] by the image width and height, respectively. + The z coordinate represents the landmark depth, with the depth at the wrist being the origin. + The smaller the value, the closer the landmark is to the camera. + The magnitude of z uses roughly the same scale as x. + source: https://developers.google.com/mediapipe/solutions/vision/hand_landmarker/python#handle_and_display_results + + + Author: DY + Args: + keypoints_array (ndarray): (21, 3) array + + Returns: + ndarray: (21,3) world dx,dy,dz coordinates + """ + + try: + keypoint_arr = np.reshape(keypoints_array, (21, 3)) # must be check + + if top_point_n == None: + align_z_keypoint_world_arr = [] + h, w = self.depth_image_filtered.shape + for idx, pixel_xyz in enumerate(keypoint_arr): + x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow + y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow + if x <= 0 or x >= w or y <= 0 or y >= h: + ''' out of index ''' + return + + z = self.depth_image_filtered[y, x] + xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) + align_z_keypoint_world_arr.append(xyz_world) + + align_z_keypoint_world_arr = np.asarray(align_z_keypoint_world_arr, dtype=np.float64) + return align_z_keypoint_world_arr + + elif isinstance(top_point_n, int): + z_arr = keypoint_arr[:, 2] # depth values + min_z = np.min(z_arr) + min_z_index = np.argmin(z_arr) + ########################################################## + ## select top N values and obtain scale of x,y and z + # - start + b_ids, b_values = self.get_bottom_n_values(z_arr, n=top_point_n) + + selected_keypoint_arr = keypoint_arr[b_ids] + + selected_keypoint_world_arr = [] + offset_min_z = 0 + h, w = self.depth_image_filtered.shape + for idx, pixel_xyz in enumerate(selected_keypoint_arr): + x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow + y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow + if x <= 0 or x >= w or y <= 0 or y >= h: + ''' out of index ''' + return + + z = self.depth_image_filtered[y, x] + if idx == min_z_index: + offset_min_z = z + xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) + selected_keypoint_world_arr.append(xyz_world) + + s_x, s_y, s_z = self.get_scales_xyz_coordinate_to_world(selected_keypoint_arr=selected_keypoint_arr, + selected_keypoint_world_arr=selected_keypoint_world_arr, + sz_type='sx') + # obtan scale of x,y and z + # - end + ########################################################## + + # calculate world xyz of all keypoints + # There is the keypoint which the nearest keypoint from camera, we make its z-value as 0. + # cf) Originally, wrist point is 0 on mediapipe algorithm. + ''' + TODO + Apply scale of x,y and z + and offset from top distance !!! 2024.05.13 + ''' + align_z_keypoint_arr = keypoint_arr + align_z_keypoint_arr[:, 2] = keypoint_arr[:, 2] - min_z + align_z_keypoint_world_arr = [] + for idx, pixel_xyz in enumerate(align_z_keypoint_arr): + up_x = int(pixel_xyz[0] * w) + up_y = int(pixel_xyz[1] * h) + x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow + y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow + if x <= 0 or x >= w or y <= 0 or y >= h: + ''' out of index ''' + return + # z = self.depth_image_filtered[y, x] + z = pixel_xyz[2] * s_z + offset_min_z + + print(f'scale: {s_z} : pixel_xyz={pixel_xyz[2]} / z={z}') + xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) + align_z_keypoint_world_arr.append(xyz_world) + + align_z_keypoint_world_arr = np.asarray(align_z_keypoint_world_arr, dtype=np.float64) + return align_z_keypoint_world_arr + + except Exception as e: + print(f'[mediapipe_hands.py] Exception error: {e}') + finally: + pass + + def get_top_n_values(self, arr, n=3): + arr = np.array(arr) + max_indices = np.argpartition(arr, -n)[-n:] # 가장 큰 값의 인덱스를 찾습니다. + max_values = np.partition(arr, -n)[-n:] # 배열에서 가장 큰 값 3개를 찾습니다. + return max_indices, max_values + + def get_bottom_n_values(self, arr, n=3): + arr = np.array(arr) + min_indices = np.argpartition(arr, n)[:n] # 가장 작은 값의 인덱스를 찾습니다. + min_values = np.partition(arr, n)[:n] # 배열에서 가장 작은 값 3개를 찾습니다. + return min_indices, min_values + + def get_scales_xyz_coordinate_to_world(self, selected_keypoint_arr, selected_keypoint_world_arr, sz_type='sx'): + """Obtain scales of x,y and z + -- Not Used -- + scale = abs(real_distance / point_distance) + It is the average of values that have several points and are selected as a combination of two points. + (nC2) + + Args: + selected_keypoint_arr (_type_): _description_ + selected_keypoint_world_arr (_type_): _description_ + + Returns: + _type_: _description_ + """ + n_arr = np.array(selected_keypoint_arr) + w_arr = np.array(selected_keypoint_world_arr) + + scale_xyz = [] + # n = len(selected_keypoint_arr) + for idx, _ in enumerate(selected_keypoint_arr): + for i in range(idx + 1, len(selected_keypoint_arr)): + scales = abs((w_arr[idx] - w_arr[i]) / (n_arr[idx] - n_arr[i])) + scale_xyz.append(scales) + scale_xyz = np.asarray(scale_xyz) # convert to numpay array + scale_x = np.mean(scale_xyz[:, 0]) + scale_y = np.mean(scale_xyz[:, 1]) + if (sz_type == 'sx'): + scale_z = scale_x + else: + scale_z = np.mean(scale_xyz[:, 2]) + + return scale_x, scale_y, scale_z + + # def get_hand_keypoint_normalized_xyz(self, hand_index=0, keypoint='index_finger_tip'): + # try: + # keypoint_index = self.keypoints['keypoints'][keypoint] + # landmarks = self.hand_results[hand_index]['landmarks'] + # x = landmarks[keypoint_index,0] + # y = landmarks[keypoint_index,1] + # z = landmarks[keypoint_index,2] + + # return x,y,z + # except Exception as e: + # print(f'[mediapipe_hands.py] Exception error: {e}') + # finally: + # pass + + def rs_init(self, fps=30): + # Realsense 카메라 객체 생성 + self.pipeline = rs.pipeline() + self.config = rs.config() + # config.enable_stream(rs.stream.color, 1280, 720, rs.format.bgr8, 30) + # config.enable_stream(rs.stream.depth, 1280, 720, rs.format.z16, 30) + width = self.image_width + height = self.image_height + self.config.enable_stream(rs.stream.color, width, height, rs.format.bgr8, fps) + self.config.enable_stream(rs.stream.depth, width, height, rs.format.z16, fps) + + # 카메라 시작 + self.profile = self.pipeline.start(self.config) + # self.align = rs.align(rs.stream.color) + + self.color_intrinsics = self.profile.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() + self.depth_intrinsics = self.profile.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() + + # color_intrinsics = align.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() + # depth_intrinsics = align.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() + + print(f'intrinsics(color): {self.color_intrinsics}') + print(f'intrinsics(depth): {self.depth_intrinsics}') + + self.depth_sensor = self.profile.get_device().first_depth_sensor() + if self.depth_sensor.supports(rs.option.depth_units): + self.depth_sensor.set_option(rs.option.depth_units, 0.001) + print(f'depth sensor: {self.depth_sensor} - change depth_units to : 0.001') + self.pipeline.stop() + print(f'Reopen the camera...') + time.sleep(1) + + self.profile = self.pipeline.start(self.config) + self.align = rs.align(rs.stream.color) + else: + print('depth sensor doesn''t support changing depth_units.') + + def get_frames(self): + frames = self.pipeline.wait_for_frames() + align_frames = frames + # align_frames = self.align.process(frames) + + depth_to_disparity_transform = rs.disparity_transform(True) # True for depth to disparity + align_frames = depth_to_disparity_transform.process(align_frames) + + align_frames = rs.spatial_filter().process(align_frames) + align_frames = rs.temporal_filter().process(align_frames) + + disparity_to_depth_transform = rs.disparity_transform(False) + align_frames = disparity_to_depth_transform.process(align_frames).as_frameset() + + color_frame = align_frames.get_color_frame() + depth_frame = align_frames.get_depth_frame() + + if not depth_frame or not color_frame: + return depth_frame, color_frame + + self.color_image = np.asanyarray(color_frame.get_data()) + self.depth_image = np.asanyarray(depth_frame.get_data()) + + # return + return self.color_image, self.depth_image + + def realsense_demo(self): + global g_hand_data + try: + image_width = self.image_width + image_height = self.image_height + # mphand = MediaPipeHandLandmarkDetector() + self.rs_init() + + while True: + image_color, image_depth = self.get_frames() + + # if not image_color or not image_depth: + # continue + + self.hand_detection(image_color, image_depth, self.depth_intrinsics) + + index_finger_tip_image = self.hand_landmarks['landmarks'] + index_finger_tip_world = self.hand_landmarks['world_landmarks'] + + if index_finger_tip_image is None or index_finger_tip_world is None: + continue + xyz_idx = index_finger_tip_image[8] + x = min(int(xyz_idx[0] * image_width), image_width - 1) # prevent the index overflow + y = min(int(xyz_idx[1] * image_height), image_height - 1) # prevent the index overflow + # if x <= 0 or x >= w or y <= 0 or y >= h: + # ''' out of index ''' + # return + z = self.depth_image_filtered[y, x] + z2 = index_finger_tip_world[8][2] + + finger_depth = z + cv2.line(self.color_image, (int(image_width / 2), int(image_height / 2)), + (int(image_width / 2), int(image_height / 2)), (255, 0, 0), 5) + cv2.putText(self.color_image, f"(basic: {finger_depth:.1f} mm", + (x, y - 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + cv2.putText(self.color_image, f"(scale: {z2:.1f}) mm", + (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + cv2.putText(self.color_image, + f"{x:.1f}, {y:.1f}, {z:.1f} mm", + (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + cv2.line(self.depth_image_filtered, (x, y), (x, y), (0, 255, 0), 5) + cv2.putText(self.depth_image_filtered, f"{finger_depth:.1f} mm", + (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) + cv2.putText(self.depth_image_filtered, + f"{x:.1f}, {y:.1f}, {z:.1f} mm", + (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) + + + if self.color_image is None or self.depth_image_for_drawing is None: + continue + + cv2.imshow('MediaPipe Hands', self.color_image) + + depth_show_img = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image_filtered, alpha=0.3), cv2.COLORMAP_JET) + # cv2.imshow('depth image', depth_show_img) + + cv2.imshow('depth image2', self.depth_image_for_drawing) + + + + if cv2.waitKey(5) & 0xFF == 27: + break + except KeyboardInterrupt: + print(f'Keyboard Interrupt (SIGINT)') + finally: + pass + +def main(): + HLD = MediaPipeHandLandmarkDetector() + thread_mediapipe_hand = threading.Thread(target=HLD.realsense_demo) + thread_mediapipe_hand.daemon = True + thread_mediapipe_hand.start() + + print('RealTimePlot3D class is update...') + + real_time_plot = RealTimePlot3D() + real_time_plot.start() + + print('show start') + plt.show() + print('show end') + + # t = Process(target=HLD.realsense_demo(), args=(10,)) + # t.start() + # t.join() + +if __name__ == '__main__': + main() + diff --git a/src/handpose_pkg/handpose_pkg/mediapipe_hands_legacy.py b/src/handpose_pkg/handpose_pkg/mediapipe_hands_legacy.py new file mode 100644 index 0000000..075b7f0 --- /dev/null +++ b/src/handpose_pkg/handpose_pkg/mediapipe_hands_legacy.py @@ -0,0 +1,848 @@ +import mediapipe as mp +import cv2 +import numpy as np +import uuid +import os +import pyrealsense2 as rs +import time +import matplotlib +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +from matplotlib.animation import FuncAnimation +from functools import partial +import threading +from multiprocessing import Process +# matplotlib.use('Agg') + +import json + +from RealSense_Utilities.realsense_api.realsense_api import RealSenseCamera +from RealSense_Utilities.realsense_api.realsense_api import find_realsense +from RealSense_Utilities.realsense_api.realsense_api import frame_to_np_array + +import queue + +queue = queue.Queue() +g_hand_data = np.zeros((21, 3)) +g_canonical_points = np.zeros((21, 3)) +g_world_points = np.zeros((21, 3)) +g_world_points_iqr = np.zeros((21, 3)) +g_replace_point = np.zeros((21, 3)) +g_palm_center = np.zeros(3) +g_palm_normal_vector = np.zeros(3) +g_palm_center_cano = np.zeros(3) +g_palm_normal_vector_cano = np.zeros(3) + +class RealTimePlot3D: + def __init__(self, num_points=21): + self.num_points = num_points + self.data = np.random.randn(self.num_points, 3) + self.fig = plt.figure() + # self.fig2 = plt.figure() + self.ax = self.fig.add_subplot(231, projection='3d') # visualization of hand pose + self.ax.set_xlabel('X Label') + self.ax.set_ylabel('Y Label') + self.ax.set_zlabel('Z Label') + self.ax.set_xlim(-0.1, 0.1) + self.ax.set_ylim(-0.1, 0.1) + self.ax.set_zlim(-0.1, 0.1) + + self.ax2 = self.fig.add_subplot(232, projection='3d') # visualization of hand pose + self.ax2.set_xlabel('X pixel') + self.ax2.set_ylabel('Y pixel') + self.ax2.set_zlabel('Z depth') + + self.ax3 = self.fig.add_subplot(233, projection='3d') # visualization of hand pose + self.ax3.set_xlabel('X pixel') + self.ax3.set_ylabel('Y pixel') + self.ax3.set_zlabel('Z depth') + + self.ax4 = self.fig.add_subplot(234, projection='3d') # visualization of hand pose + self.ax4.set_xlabel('X pixel') + self.ax4.set_ylabel('Y pixel') + self.ax4.set_zlabel('Z depth') + + self.ax5 = self.fig.add_subplot(235, projection='3d') # visualization of hand pose + self.ax5.set_xlabel('X pixel') + self.ax5.set_ylabel('Y pixel') + self.ax5.set_zlabel('Z depth') + + self.ax6 = self.fig.add_subplot(236, projection='3d') # visualization of hand pose + self.ax6.set_xlabel('X pixel') + self.ax6.set_ylabel('Y pixel') + self.ax6.set_zlabel('Z depth') + + # self.ani = None + self.ani = FuncAnimation(self.fig, self.update_data, frames=1, interval=100) + self.scatter = self.ax.scatter(g_hand_data[:, 0], g_hand_data[:, 1], g_hand_data[:, 2]) + self.scatter_canonical_points = self.ax.scatter(g_canonical_points[:, 0], g_canonical_points[:, 1], g_canonical_points[:, 2]) + self.scatter_world_points = self.ax.scatter(g_world_points[:, 0], g_world_points[:, 1], g_world_points[:, 2]) + self.scatter_world_points_iqr = self.ax.scatter(g_world_points_iqr[:, 0], g_world_points_iqr[:, 1], g_world_points_iqr[:, 2]) + self.scatter_replace_points = self.ax.scatter(g_replace_point[:, 0], g_replace_point[:, 1], g_replace_point[:, 2]) + self.update_thread = threading.Thread(target=self.update_data) + self.update_thread.daemon = True + + def update_data(self, frames): + + global g_hand_data, g_canonical_points, g_world_points, g_world_points_iqr, g_replace_point + global g_palm_center, g_palm_normal_vector, g_palm_center_cano, g_palm_normal_vector_cano + colors = ['black', 'blue', 'green', 'orange', 'red', 'black'] + intervals = [4, 8, 12, 16, 20] + + while True: + + data = g_hand_data + data_c_p = g_canonical_points + data_w_p = g_world_points + data_w_p_iqr = g_world_points_iqr + data_r_p = g_replace_point + # print(f'canonical: {data_c_p}') + # print(f'world_iqr: {data_w_p_iqr}') + # print(f'replace: {data_r_p}') + + # 현재 점 삭제 + self.scatter.remove() + self.scatter_canonical_points.remove() + self.scatter_world_points.remove() + self.scatter_world_points_iqr.remove() + self.scatter_replace_points.remove() + self.ax.cla() + self.ax2.cla() + self.ax3.cla() + self.ax4.cla() + self.ax5.cla() + self.ax6.cla() + self.ax.set_xlabel('X Label') + self.ax.set_ylabel('Y Label') + self.ax.set_zlabel('Z Label') + # self.ax.set_xlim(0, 500) + # self.ax.set_ylim(0, 500) + # self.ax.set_zlim(-100, 400) + + max_xyz_c = np.max(data_c_p, axis=0) + min_xyz_c = np.min(data_c_p, axis=0) + max_xyz_w = np.max(data_w_p, axis=0) + min_xyz_w = np.min(data_w_p, axis=0) + max_xyz_w_iqr = np.max(data_w_p_iqr, axis=0) + min_xyz_w_iqr = np.min(data_w_p_iqr, axis=0) + + th = 50 + # self.ax2.set_xlim(min_xyz_c[0] - th, max_xyz_c[0] + th) + # self.ax2.set_ylim(min_xyz_c[1] - th, max_xyz_c[1] + th) + # self.ax2.set_zlim(min_xyz_c[2] - th, max_xyz_c[2] + th) + # self.ax4.set_xlim(min_xyz_c[0] - th, max_xyz_c[0] + th) + # self.ax4.set_ylim(min_xyz_c[1] - th, max_xyz_c[1] + th) + # self.ax4.set_zlim(min_xyz_c[2] - th, max_xyz_c[2] + th) + # self.ax5.set_xlim(min_xyz_w[0] - th, max_xyz_w[0] + th) + # self.ax5.set_ylim(min_xyz_w[1] - th, max_xyz_w[1] + th) + # self.ax5.set_zlim(min_xyz_w[2] - th, max_xyz_w[2] + th) + # self.ax6.set_xlim(min_xyz_w_iqr[0] - th, max_xyz_w_iqr[0] + th) + # self.ax6.set_ylim(min_xyz_w_iqr[1] - th, max_xyz_w_iqr[1] + th) + # self.ax6.set_zlim(min_xyz_w_iqr[2] - th, max_xyz_w_iqr[2] + th) + + self.ax2.set_xlim(300, 500) + self.ax2.set_ylim(100, 300) + self.ax2.set_zlim(400, 700) + self.ax3.set_xlim(300, 500) + self.ax3.set_ylim(100, 300) + self.ax3.set_zlim(400, 700) + self.ax4.set_xlim(300, 500) + self.ax4.set_ylim(100, 300) + self.ax4.set_zlim(400, 700) + self.ax5.set_xlim(300, 500) + self.ax5.set_ylim(100, 300) + self.ax5.set_zlim(400, 700) + self.ax6.set_xlim(300, 500) + self.ax6.set_ylim(100, 300) + self.ax6.set_zlim(400, 700) + + + # print(f'{data[8,0]} / {data[8,1]} / {data[8,2]}') + self.scatter = self.ax.scatter(data[:, 0], data[:, 1], data[:, 2], color='black', s=50, alpha=1) + + self.scatter_canonical_points = self.ax2.scatter(data_c_p[:, 0], data_c_p[:, 1], data_c_p[:, 2], color='red', s=10, alpha=1) + self.scatter_world_points = self.ax2.scatter(data_w_p[:, 0], data_w_p[:, 1], data_w_p[:, 2], color='blue', s=10, alpha=1) + self.scatter_world_points_iqr = self.ax2.scatter(data_w_p_iqr[:, 0], data_w_p_iqr[:, 1], data_w_p_iqr[:, 2], color='green', s=10, alpha=1) + self.scatter_replace_points = self.ax2.scatter(data_r_p[:, 0], data_r_p[:, 1], data_r_p[:, 2], color='purple', s=10, alpha=1) + + self.scatter_replace_points = self.ax3.scatter(data_r_p[:, 0], data_r_p[:, 1], data_r_p[:, 2], color='purple', s=10, alpha=1) + + self.scatter_canonical_points = self.ax4.scatter(data_c_p[:, 0], data_c_p[:, 1], data_c_p[:, 2], color='red', s=10, alpha=1) + + self.scatter_world_points = self.ax5.scatter(data_w_p[:, 0], data_w_p[:, 1], data_w_p[:, 2], color='blue', s=10, alpha=1) + + self.scatter_world_points_iqr = self.ax6.scatter(data_w_p_iqr[:, 0], data_w_p_iqr[:, 1], data_w_p_iqr[:, 2], color='green', s=10, alpha=1) + # self.scatter_replace_points = self.ax6.scatter(data_r_p[:, 0], data_r_p[:, 1], data_r_p[:, 2], color='purple', s=10, alpha=1) + + # print(f'canonical: {data_c_p}') + # print(f'world_iqr: {data_w_p_iqr}') + # print(f'replace: {data_r_p}') + # self.scatter_2 = self.ax2.scatter() + for i in range(len(intervals)): + start_idx = 0 if i == 0 else intervals[i - 1] + 1 + end_idx = intervals[i] + self.ax.plot(data[start_idx:end_idx + 1, 0], data[start_idx:end_idx + 1, 1], data[start_idx:end_idx + 1, 2], color=colors[i]) + self.ax2.plot(data_c_p[start_idx:end_idx + 1, 0], data_c_p[start_idx:end_idx + 1, 1], data_c_p[start_idx:end_idx + 1, 2], color='red') + self.ax2.plot(data_w_p[start_idx:end_idx + 1, 0], data_w_p[start_idx:end_idx + 1, 1], data_w_p[start_idx:end_idx + 1, 2], color='blue') + self.ax2.plot(data_w_p_iqr[start_idx:end_idx + 1, 0], data_w_p_iqr[start_idx:end_idx + 1, 1], data_w_p_iqr[start_idx:end_idx + 1, 2], color='green') + self.ax2.plot(data_r_p[start_idx:end_idx + 1, 0], data_r_p[start_idx:end_idx + 1, 1], data_r_p[start_idx:end_idx + 1, 2], color='purple') + + self.ax3.plot(data_r_p[start_idx:end_idx + 1, 0], data_r_p[start_idx:end_idx + 1, 1], data_r_p[start_idx:end_idx + 1, 2], color='purple') + # 벡터 그리기 + self.ax3.quiver(g_palm_center[0], g_palm_center[1], g_palm_center[2] , g_palm_normal_vector[0], g_palm_normal_vector[1], g_palm_normal_vector[2], color='r', length=150, normalize=False) + + self.ax4.plot(data_c_p[start_idx:end_idx + 1, 0], data_c_p[start_idx:end_idx + 1, 1], data_c_p[start_idx:end_idx + 1, 2], color='red') + self.ax4.quiver(g_palm_center_cano[0], g_palm_center_cano[1], g_palm_center_cano[2] , g_palm_normal_vector_cano[0], g_palm_normal_vector_cano[1], g_palm_normal_vector_cano[2], color='r', length=150, normalize=False) + + self.ax5.plot(data_w_p[start_idx:end_idx + 1, 0], data_w_p[start_idx:end_idx + 1, 1], data_w_p[start_idx:end_idx + 1, 2], color='blue') + + self.ax6.plot(data_w_p_iqr[start_idx:end_idx + 1, 0], data_w_p_iqr[start_idx:end_idx + 1, 1], data_w_p_iqr[start_idx:end_idx + 1, 2], color='green') + # self.ax6.plot(data_r_p[start_idx:end_idx + 1, 0], data_r_p[start_idx:end_idx + 1, 1], data_r_p[start_idx:end_idx + 1, 2], color='purple') + + return + # return self.scatter + + def start(self): + # 데이터 업데이트 쓰레드 시작 + self.update_thread.start() + self.ani = FuncAnimation(self.fig, self.update_data, frames=100, interval=30) + + +class HandLandmarks(): + def __init__(self): + self.keypoints = json.load(open("./handlandmark_keypoints.json")) + self.hand_landmarks = {} # tuple + self.hand_landmarks['index'] = None + self.hand_landmarks['score'] = None + self.hand_landmarks['label'] = None + self.hand_landmarks['landmarks'] = np.zeros((21, 3)) + self.hand_landmarks['world_landmarks'] = np.zeros((21, 3)) # calculate from camera instrinsic(Realsense) + # self.hand_landmarks['canonical_landmarks'] = None # calculate from camera instrinsic(Realsense) + # self.hand_landmarks['replace_landmarks'] = None # calculate from camera instrinsic(Realsense) + + + # if serveral hands is detected, hand_results will has objects of each hands. + # e.g. [{hand_landmarks#1}, {hand_landmarks#2}, ...] + self.hand_results = [] + + pass + + +class MediaPipeHandLandmarkDetector(HandLandmarks): + # pass + def __init__(self): + super().__init__() + self.camera_to_hand_vector = {'x': 0, 'y': 0, 'z': 0} + self.hand_data = np.zeros((21, 3)) + self.mp_drawing = mp.solutions.drawing_utils + self.mp_hands = mp.solutions.hands + self.hands = self.mp_hands.Hands(min_detection_confidence=0.8, + min_tracking_confidence=0.7) + self.canonical_points = np.zeros((21, 3)) + self.world_points = np.zeros((21, 3)) + self.world_points_iqr = np.zeros((21, 3)) + self.replace_point = np.zeros((21, 3)) + self.palm_vector = {'x', 'y', 'z', 'r','p','y'} + + # smoothing (LPF-low pass filter) + self.depth_intrinsics = None + self.finger_depth_prev = 0 + self.finger_depth_curr = 0 + self.filter_sensitivity = 0.3 + + self.image_width = 640 + self.image_height = 480 + + self.color_image = None + self.depth_image = None + self.depth_image_prev = None + self.depth_image_for_drawing = None + self.start_flag = False + + self.hand_thickness = 10 # mm + + self.pps = 0 + + def hand_detection(self, color_frame, depth_frame, depth_intrinsic=None): + global g_hand_data, g_canonical_points, g_world_points, g_world_points_iqr, g_replace_point + global g_palm_center, g_palm_normal_vector, g_palm_center_cano, g_palm_normal_vector_cano + ###################################################### + # Flip the image horizontally for a later selfie-view display, and convert + # the BGR image to RGB. + self.depth_intrinsics = depth_intrinsic + self.color_image = color_frame + self.color_image = cv2.flip(self.color_image, 1) + self.color_image = cv2.cvtColor(self.color_image, cv2.COLOR_BGR2RGB) + self.depth_image = depth_frame + + if self.start_flag == False: + self.depth_image_filtered = self.depth_image + else: + self.depth_image_filtered = self.filter_sensitivity * self.depth_image + ( + 1 - self.filter_sensitivity) * self.depth_image_prev + + self.depth_image_filtered = cv2.flip(self.depth_image_filtered, 1) + self.depth_image_prev = self.depth_image_filtered + # depth_norm_image = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.3), cv2.COLORMAP_JET) + + # To improve performance, optionally mark the image as not writeable to + # pass by reference. + self.color_image.flags.writeable = False + results = self.hands.process(self.color_image) + self.image_height, self.image_width, _ = self.color_image.shape + depth_image_height, depth_image_width = self.depth_image_filtered.shape + if self.image_height != depth_image_height or self.image_width != depth_image_width: + print(f'[mediapipe_hands.py | Warning] It does not match a size (H x W) of color & depth frame') + # Draw the hand annotations on the image. + self.color_image.flags.writeable = True + self.color_image = cv2.cvtColor(self.color_image, cv2.COLOR_RGB2BGR) + ###################################################### + + self.hand_results.clear() + + if results.multi_handedness: + + s_time = time.time() + + for handedness, hand_landmarks in zip(results.multi_handedness, results.multi_hand_landmarks): + # dictionary clear + self.hand_landmarks = {key: None for key in self.hand_landmarks} + + classification = handedness.classification[0] + index = classification.index + score = classification.score + label = classification.label + self.hand_landmarks['index'] = classification.index + self.hand_landmarks['score'] = classification.score + self.hand_landmarks['label'] = classification.label + + hand_data = np.zeros((21, 3)) + for idx, landmrk in enumerate(hand_landmarks.landmark): + cx, cy, cz = landmrk.x, landmrk.y, landmrk.z + hand_data[idx, 0] = cx + hand_data[idx, 1] = cy + hand_data[idx, 2] = cz + g_hand_data[idx, 0] = cx + g_hand_data[idx, 1] = cy + g_hand_data[idx, 2] = cz + pixel_x = int(cx * self.image_width) + pixel_y = int(cy * self.image_height) + + canonical_points, world_points, world_points_iqr, replace_point = self.compare_coordinate_canonical_with_world(hand_data) + g_canonical_points = canonical_points + g_world_points = world_points + g_world_points_iqr = world_points_iqr + g_replace_point = replace_point + self.canonical_points = canonical_points + self.world_points = world_points + self.world_points_iqr = world_points_iqr + self.replace_point = replace_point + + + self.hand_landmarks['landmarks'] = hand_data + # world_landmarks = self.conversion_hand_keypoint_pixel_to_point(hand_data, top_point_n=None) + # self.hand_landmarks['world_landmarks'] = world_landmarks + self.hand_landmarks['world_landmarks'] = self.get_hand_world_xyz() + c, n_v = self.get_palm_pose(coord='replace') + g_palm_center = c + g_palm_normal_vector = n_v + + c2, n_v2 = self.get_palm_pose(coord='canonical') + g_palm_center_cano = c2 + g_palm_normal_vector_cano = n_v2 + + # finally + self.hand_results.append(self.hand_landmarks) + + # drawing points on image + self.mp_drawing.draw_landmarks( + self.color_image, + hand_landmarks, + self.mp_hands.HAND_CONNECTIONS, + # mp_drawing_styles.get_default_hand_landmarks_style(), + # mp_drawing_styles.get_default_hand_connections_style() + ) + + # self.depth_image_for_drawing = np.zeros((self.image_height, self.image_width, 3), dtype=np.uint16) + # self.depth_image_for_drawing[:, :, 0] = self.depth_image_filtered + # self.depth_image_for_drawing = cv2.cvtColor(self.depth_image_for_drawing, cv2.COLOR_RGB2BGR) + + self.depth_image_for_drawing = self.depth_image_filtered + self.depth_image_for_drawing = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image_for_drawing, alpha=0.3), cv2.COLORMAP_JET) + + self.mp_drawing.draw_landmarks( + self.depth_image_for_drawing, + hand_landmarks, + self.mp_hands.HAND_CONNECTIONS, + # mp_drawing_styles.get_default_hand_landmarks_style(), + # mp_drawing_styles.get_default_hand_connections_style() + ) + + e_time = time.time() + self.pps = 1 / (e_time - s_time) + + def compare_coordinate_canonical_with_world(self, hand_landmarks_array, replace_th=50): + canonical_point = np.zeros((21, 3)) + hand_landmarks_array = np.asarray(hand_landmarks_array) + w, h = self.image_width, self.image_height + + # canonical_point[:, 0] = min(int(hand_landmarks_array[:, 0] * w), w - 1) + # canonical_point[:, 1] = min(int(hand_landmarks_array[:, 1] * h), h - 1) + # canonical_point[:, 2] = int(hand_landmarks_array[:, 2] * w) + canonical_point[:, 0] = [min(int(x * w), w - 1) for x in hand_landmarks_array[:, 0]] + canonical_point[:, 1] = [min(int(x * h), h - 1) for x in hand_landmarks_array[:, 1]] + canonical_point[:, 2] = [int(x * w) for x in hand_landmarks_array[:, 2]] + canonical_point = np.asarray(canonical_point, dtype=int) + + world_point = np.zeros((21, 3)) + world_point_iqr = np.zeros((21, 3)) + + # depth = np.zeros((1, 21)) + depth = self.depth_image[canonical_point[:, 1], canonical_point[:, 0]] + world_point[:, 0] = canonical_point[:, 0] + world_point[:, 1] = canonical_point[:, 1] + world_point[:, 2] = depth + world_point_iqr[:, 0] = canonical_point[:, 0] + world_point_iqr[:, 1] = canonical_point[:, 1] + world_point_iqr[:, 2] = self.replace_outliers_iqr_as_mean(depth, q1_rate=25, q3_rate=75, alpha=0) + + world_point = np.asarray(world_point, dtype=int) + + # depth_avg = np.mean(world_point[:, 2]) + depth_avg = np.mean(world_point_iqr[:, 2]) + canonical_point[:, 2] = canonical_point[:, 2] + depth_avg + self.hand_thickness + + replace_point = world_point_iqr + xyz_distances = np.linalg.norm(world_point_iqr-canonical_point, axis=1) + # print(f'canonical_point: {canonical_point}') + # print(f'world_point_iqr: {world_point_iqr}') + # print(f'replace_point(before): {replace_point}') + replace_point[xyz_distances >= replace_th] = canonical_point[xyz_distances >= replace_th] + # print(f'distances(th=20 mm): {xyz_distances} / {xyz_distances >= replace_th}') + # print(f'replace_point(after): {replace_point}') + return canonical_point, world_point, world_point_iqr, replace_point + pass + + @staticmethod + def vector_to_rpy(x, y, z): + # Yaw (ψ) + yaw = np.arctan2(y, x) + # Pitch (θ) + pitch = np.arctan2(-z, np.sqrt(x ** 2 + y ** 2)) + # Roll (φ) is typically set to zero for a single vector + roll = 0.0 + return roll, pitch, yaw + + @staticmethod + def remove_outliers_iqr(data, q1_rate=25., q3_rate=75., alpha=1.5): + """ + # IQR 방법으로 이상치 제거 + :return: + """ + q1 = np.percentile(data, q1_rate) + q3 = np.percentile(data, q3_rate) + iqr = q3 - q1 + lower_bound = q1 - (alpha * iqr) + upper_bound = q3 + (alpha * iqr) + return data[(data >= lower_bound) & (data <= upper_bound)] + + @staticmethod + def replace_outliers_iqr_as_mean(data, q1_rate=25., q3_rate=75., alpha=0.5): + """ + # IQR 방법으로 이상치 제거하고 평균값으로 대체하는 함수 + :return: + """ + q1 = np.percentile(data, q1_rate) + q3 = np.percentile(data, q3_rate) + iqr = q3 - q1 + lower_bound = q1 - (alpha * iqr) + upper_bound = q3 + (alpha * iqr) + + # 이상치의 인덱스를 저장 + outliers_indices = np.where((data < lower_bound) | (data > upper_bound))[0] + + # 이상치가 아닌 값들로 평균을 계산 + mean_value = np.mean(data[(data >= lower_bound) & (data <= upper_bound)]) + + # 이상치를 평균값으로 대체 + data[outliers_indices] = mean_value + + # print(f'IQR: q1:{q1}, q3:{q3}, iqr:{iqr}, l_b:{lower_bound}, u_b:{upper_bound}, indices:{outliers_indices}, mean:{mean_value}') + return data + + + def get_hand_keypoint_pixel_xyz(self, hand_index=0, keypoint='index_finger_tip', coord='replace'): + try: + keypoint_index = self.keypoints['keypoints'][keypoint] + + if coord == 'canonical': + landmarks = self.canonical_points + x = landmarks[keypoint_index, 0] + y = landmarks[keypoint_index, 1] + z = landmarks[keypoint_index, 2] + return np.array([x, y, z]) + + elif coord == 'replace': + landmarks = self.replace_point + x = landmarks[keypoint_index, 0] + y = landmarks[keypoint_index, 1] + z = landmarks[keypoint_index, 2] + return np.array([x, y, z]) + + elif coord == 'normalized': + landmarks = self.hand_results[hand_index]['landmarks'] + x = landmarks[keypoint_index, 0] + y = landmarks[keypoint_index, 1] + z = landmarks[keypoint_index, 2] + return np.array([x, y, z]) + + except Exception as e: + print(f'[mediapipe_hands.py] Exception error: {e}') + finally: + pass + + def get_hand_world_xyz(self): + xyz_world = [] + for idx, xyz in enumerate(self.replace_point): + coordinate_xyz = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [xyz[0], xyz[1]], xyz[2]) + xyz_world.append(coordinate_xyz) + + xyz_world = np.asarray(xyz_world, dtype=np.float64) + return xyz_world + + def get_palm_pose(self, coord='replace'): + p1 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='wrist', coord=coord) + p2 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='pinky_mcp', coord=coord) + p3 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='index_finger_mcp', coord=coord) + + v1 = p2 - p1 + v2 = p3 - p1 + center_point = (p1 + p2 + p3) / 3. + normal_vector = np.cross(v1, v2) + normal_unit_vector = normal_vector / np.linalg.norm(normal_vector, 2) + + return center_point, normal_unit_vector + + def conversion_hand_keypoint_pixel_to_point(self, keypoints_array, top_point_n=None): + """Algorithm for annotating pixel. + -- Not Used -- + Select 3(or more, optional) points closest to the camera. + And, calculate of scale of x,y and z (distance_pixel : distance_world) + Finally, obtain all 21 x,y and z dimension values of keypoints on real world + + Landmarks + There are 21 hand landmarks, each composed of x, y and z coordinates. + The x and y coordinates are normalized to [0.0, 1.0] by the image width and height, respectively. + The z coordinate represents the landmark depth, with the depth at the wrist being the origin. + The smaller the value, the closer the landmark is to the camera. + The magnitude of z uses roughly the same scale as x. + source: https://developers.google.com/mediapipe/solutions/vision/hand_landmarker/python#handle_and_display_results + + + Author: DY + Args: + keypoints_array (ndarray): (21, 3) array + + Returns: + ndarray: (21,3) world dx,dy,dz coordinates + """ + + try: + keypoint_arr = np.reshape(keypoints_array, (21, 3)) # must be check + + if top_point_n == None: + align_z_keypoint_world_arr = [] + h, w = self.depth_image_filtered.shape + for idx, pixel_xyz in enumerate(keypoint_arr): + x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow + y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow + if x <= 0 or x >= w or y <= 0 or y >= h: + ''' out of index ''' + return + + z = self.depth_image_filtered[y, x] + xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) + align_z_keypoint_world_arr.append(xyz_world) + + align_z_keypoint_world_arr = np.asarray(align_z_keypoint_world_arr, dtype=np.float64) + return align_z_keypoint_world_arr + + elif isinstance(top_point_n, int): + z_arr = keypoint_arr[:, 2] # depth values + min_z = np.min(z_arr) + min_z_index = np.argmin(z_arr) + ########################################################## + ## select top N values and obtain scale of x,y and z + # - start + b_ids, b_values = self.get_bottom_n_values(z_arr, n=top_point_n) + + selected_keypoint_arr = keypoint_arr[b_ids] + + selected_keypoint_world_arr = [] + offset_min_z = 0 + h, w = self.depth_image_filtered.shape + for idx, pixel_xyz in enumerate(selected_keypoint_arr): + x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow + y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow + if x <= 0 or x >= w or y <= 0 or y >= h: + ''' out of index ''' + return + + z = self.depth_image_filtered[y, x] + if idx == min_z_index: + offset_min_z = z + xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) + selected_keypoint_world_arr.append(xyz_world) + + s_x, s_y, s_z = self.get_scales_xyz_coordinate_to_world(selected_keypoint_arr=selected_keypoint_arr, + selected_keypoint_world_arr=selected_keypoint_world_arr, + sz_type='sx') + # obtan scale of x,y and z + # - end + ########################################################## + + # calculate world xyz of all keypoints + # There is the keypoint which the nearest keypoint from camera, we make its z-value as 0. + # cf) Originally, wrist point is 0 on mediapipe algorithm. + ''' + TODO + Apply scale of x,y and z + and offset from top distance !!! 2024.05.13 + ''' + align_z_keypoint_arr = keypoint_arr + align_z_keypoint_arr[:, 2] = keypoint_arr[:, 2] - min_z + align_z_keypoint_world_arr = [] + for idx, pixel_xyz in enumerate(align_z_keypoint_arr): + up_x = int(pixel_xyz[0] * w) + up_y = int(pixel_xyz[1] * h) + x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow + y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow + if x <= 0 or x >= w or y <= 0 or y >= h: + ''' out of index ''' + return + # z = self.depth_image_filtered[y, x] + z = pixel_xyz[2] * s_z + offset_min_z + + print(f'scale: {s_z} : pixel_xyz={pixel_xyz[2]} / z={z}') + xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) + align_z_keypoint_world_arr.append(xyz_world) + + align_z_keypoint_world_arr = np.asarray(align_z_keypoint_world_arr, dtype=np.float64) + return align_z_keypoint_world_arr + + except Exception as e: + print(f'[mediapipe_hands.py] Exception error: {e}') + finally: + pass + + def get_top_n_values(self, arr, n=3): + arr = np.array(arr) + max_indices = np.argpartition(arr, -n)[-n:] # 가장 큰 값의 인덱스를 찾습니다. + max_values = np.partition(arr, -n)[-n:] # 배열에서 가장 큰 값 3개를 찾습니다. + return max_indices, max_values + + def get_bottom_n_values(self, arr, n=3): + arr = np.array(arr) + min_indices = np.argpartition(arr, n)[:n] # 가장 작은 값의 인덱스를 찾습니다. + min_values = np.partition(arr, n)[:n] # 배열에서 가장 작은 값 3개를 찾습니다. + return min_indices, min_values + + def get_scales_xyz_coordinate_to_world(self, selected_keypoint_arr, selected_keypoint_world_arr, sz_type='sx'): + """Obtain scales of x,y and z + -- Not Used -- + scale = abs(real_distance / point_distance) + It is the average of values that have several points and are selected as a combination of two points. + (nC2) + + Args: + selected_keypoint_arr (_type_): _description_ + selected_keypoint_world_arr (_type_): _description_ + + Returns: + _type_: _description_ + """ + n_arr = np.array(selected_keypoint_arr) + w_arr = np.array(selected_keypoint_world_arr) + + scale_xyz = [] + # n = len(selected_keypoint_arr) + for idx, _ in enumerate(selected_keypoint_arr): + for i in range(idx + 1, len(selected_keypoint_arr)): + scales = abs((w_arr[idx] - w_arr[i]) / (n_arr[idx] - n_arr[i])) + scale_xyz.append(scales) + scale_xyz = np.asarray(scale_xyz) # convert to numpay array + scale_x = np.mean(scale_xyz[:, 0]) + scale_y = np.mean(scale_xyz[:, 1]) + if (sz_type == 'sx'): + scale_z = scale_x + else: + scale_z = np.mean(scale_xyz[:, 2]) + + return scale_x, scale_y, scale_z + + # def get_hand_keypoint_normalized_xyz(self, hand_index=0, keypoint='index_finger_tip'): + # try: + # keypoint_index = self.keypoints['keypoints'][keypoint] + # landmarks = self.hand_results[hand_index]['landmarks'] + # x = landmarks[keypoint_index,0] + # y = landmarks[keypoint_index,1] + # z = landmarks[keypoint_index,2] + + # return x,y,z + # except Exception as e: + # print(f'[mediapipe_hands.py] Exception error: {e}') + # finally: + # pass + + def rs_init(self, fps=30): + # Realsense 카메라 객체 생성 + self.pipeline = rs.pipeline() + self.config = rs.config() + # config.enable_stream(rs.stream.color, 1280, 720, rs.format.bgr8, 30) + # config.enable_stream(rs.stream.depth, 1280, 720, rs.format.z16, 30) + width = self.image_width + height = self.image_height + self.config.enable_stream(rs.stream.color, width, height, rs.format.bgr8, fps) + self.config.enable_stream(rs.stream.depth, width, height, rs.format.z16, fps) + + # 카메라 시작 + self.profile = self.pipeline.start(self.config) + # self.align = rs.align(rs.stream.color) + + self.color_intrinsics = self.profile.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() + self.depth_intrinsics = self.profile.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() + + # color_intrinsics = align.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() + # depth_intrinsics = align.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() + + print(f'intrinsics(color): {self.color_intrinsics}') + print(f'intrinsics(depth): {self.depth_intrinsics}') + + self.depth_sensor = self.profile.get_device().first_depth_sensor() + if self.depth_sensor.supports(rs.option.depth_units): + self.depth_sensor.set_option(rs.option.depth_units, 0.001) + print(f'depth sensor: {self.depth_sensor} - change depth_units to : 0.001') + self.pipeline.stop() + print(f'Reopen the camera...') + time.sleep(1) + + self.profile = self.pipeline.start(self.config) + self.align = rs.align(rs.stream.color) + else: + print('depth sensor doesn''t support changing depth_units.') + + def get_frames(self): + frames = self.pipeline.wait_for_frames() + align_frames = frames + # align_frames = self.align.process(frames) + + depth_to_disparity_transform = rs.disparity_transform(True) # True for depth to disparity + align_frames = depth_to_disparity_transform.process(align_frames) + + align_frames = rs.spatial_filter().process(align_frames) + align_frames = rs.temporal_filter().process(align_frames) + + disparity_to_depth_transform = rs.disparity_transform(False) + align_frames = disparity_to_depth_transform.process(align_frames).as_frameset() + + color_frame = align_frames.get_color_frame() + depth_frame = align_frames.get_depth_frame() + + if not depth_frame or not color_frame: + return depth_frame, color_frame + + self.color_image = np.asanyarray(color_frame.get_data()) + self.depth_image = np.asanyarray(depth_frame.get_data()) + + # return + return self.color_image, self.depth_image + + def realsense_demo(self): + global g_hand_data + try: + image_width = self.image_width + image_height = self.image_height + # mphand = MediaPipeHandLandmarkDetector() + self.rs_init() + + while True: + image_color, image_depth = self.get_frames() + + # if not image_color or not image_depth: + # continue + + self.hand_detection(image_color, image_depth, self.depth_intrinsics) + + index_finger_tip_image = self.hand_landmarks['landmarks'] + index_finger_tip_world = self.hand_landmarks['world_landmarks'] + + if index_finger_tip_image is None or index_finger_tip_world is None: + continue + xyz_idx = index_finger_tip_image[8] + x = min(int(xyz_idx[0] * image_width), image_width - 1) # prevent the index overflow + y = min(int(xyz_idx[1] * image_height), image_height - 1) # prevent the index overflow + # if x <= 0 or x >= w or y <= 0 or y >= h: + # ''' out of index ''' + # return + z = self.depth_image_filtered[y, x] + z2 = index_finger_tip_world[8][2] + + finger_depth = z + cv2.line(self.color_image, (int(image_width / 2), int(image_height / 2)), + (int(image_width / 2), int(image_height / 2)), (255, 0, 0), 5) + cv2.putText(self.color_image, f"(basic: {finger_depth:.1f} mm", + (x, y - 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + cv2.putText(self.color_image, f"(scale: {z2:.1f}) mm", + (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + cv2.putText(self.color_image, + f"{x:.1f}, {y:.1f}, {z:.1f} mm", + (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + cv2.line(self.depth_image_filtered, (x, y), (x, y), (0, 255, 0), 5) + cv2.putText(self.depth_image_filtered, f"{finger_depth:.1f} mm", + (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) + cv2.putText(self.depth_image_filtered, + f"{x:.1f}, {y:.1f}, {z:.1f} mm", + (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) + + + if self.color_image is None or self.depth_image_for_drawing is None: + continue + + cv2.imshow('MediaPipe Hands', self.color_image) + + depth_show_img = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image_filtered, alpha=0.3), cv2.COLORMAP_JET) + # cv2.imshow('depth image', depth_show_img) + + cv2.imshow('depth image2', self.depth_image_for_drawing) + + + + if cv2.waitKey(5) & 0xFF == 27: + break + except KeyboardInterrupt: + print(f'Keyboard Interrupt (SIGINT)') + finally: + pass + +def main(): + HLD = MediaPipeHandLandmarkDetector() + thread_mediapipe_hand = threading.Thread(target=HLD.realsense_demo) + thread_mediapipe_hand.daemon = True + thread_mediapipe_hand.start() + + print('RealTimePlot3D class is update...') + + real_time_plot = RealTimePlot3D() + real_time_plot.start() + + print('show start') + plt.show() + print('show end') + + # t = Process(target=HLD.realsense_demo(), args=(10,)) + # t.start() + # t.join() + +if __name__ == '__main__': + main() + From 29479ffac3636544303e5206add557aae5277081 Mon Sep 17 00:00:00 2001 From: Bigyuun Date: Wed, 26 Jun 2024 08:33:56 +0900 Subject: [PATCH 06/11] Realsense api(custom) upload --- .../RealSense_Utilities/.gitignore | 7 - .../MATLAB/depth_options.txt | 53 --- .../MATLAB/get_options_from_rosbag.m | 40 -- .../MATLAB/imu_options.txt | 6 - .../MATLAB/rgb_options.txt | 33 -- .../RealSense_Utilities/README.md | 1 - .../RealSense_Utilities/object_detection.py | 113 ------ .../RealSense_Utilities/opencv_stream.py | 179 --------- .../RealSense_Utilities/opencv_stream_test.py | 59 --- .../RealSense_Utilities/opencv_stream_v2.py | 99 ----- .../RealSense_Utilities/opencv_stream_v3.py | 80 ---- .../realsense_api/__init__.py | 1 - .../post_processing/decimation.py | 19 - .../post_processing/hole_filling.py | 19 - .../realsense_api/post_processing/option.py | 31 -- .../realsense_api/post_processing/options.py | 112 ------ .../realsense_api/post_processing/spatial.py | 64 ---- .../realsense_api/post_processing/temporal.py | 31 -- .../realsense_api/realsense_api.py | 344 ------------------ .../handpose_pkg/RealSense_Utilities/test.py | 4 - 20 files changed, 1295 deletions(-) delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/.gitignore delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/depth_options.txt delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/get_options_from_rosbag.m delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/imu_options.txt delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/rgb_options.txt delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/README.md delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/object_detection.py delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream.py delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_test.py delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_v2.py delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_v3.py delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/__init__.py delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/decimation.py delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/hole_filling.py delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/option.py delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/options.py delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/spatial.py delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/temporal.py delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/realsense_api.py delete mode 100644 src/handpose_pkg/handpose_pkg/RealSense_Utilities/test.py diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/.gitignore b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/.gitignore deleted file mode 100644 index d689163..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -__pycache__/ -*.pyc -*.pyo -.vscode/ -*.asv -test/ -options.txt \ No newline at end of file diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/depth_options.txt b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/depth_options.txt deleted file mode 100644 index 9b3c7a0..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/depth_options.txt +++ /dev/null @@ -1,53 +0,0 @@ -/device_0/sensor_0/option/Alternate_IR/description, Enable/Disable alternate IR -/device_0/sensor_0/option/Alternate_IR/value, 0.000000 -/device_0/sensor_0/option/Apd_Temperature/description, Avalanche Photo Diode temperature -/device_0/sensor_0/option/Apd_Temperature/value, 33.078812 -/device_0/sensor_0/option/Confidence_Threshold/description, The confidence level threshold to use to mark a pixel as valid by the depth algorithm -/device_0/sensor_0/option/Confidence_Threshold/value, 1.000000 -/device_0/sensor_0/option/Depth_Offset/description, Offset from sensor to depth origin in millimetrers -/device_0/sensor_0/option/Depth_Offset/value, 4.500000 -/device_0/sensor_0/option/Depth_Units/description, Number of meters represented by a single depth unit -/device_0/sensor_0/option/Depth_Units/value, 0.000250 -/device_0/sensor_0/option/Digital_Gain/description, Change the depth digital gain to: 1 for high gain and 2 for low gain -/device_0/sensor_0/option/Digital_Gain/value, 1.000000 -/device_0/sensor_0/option/Error_Polling_Enabled/description, Enable / disable polling of camera internal errors -/device_0/sensor_0/option/Error_Polling_Enabled/value, 1.000000 -/device_0/sensor_0/option/Frames_Queue_Size/description, Max number of frames you can hold at a given time. Increasing this number will reduce frame drops but increase latency, and vice versa -/device_0/sensor_0/option/Frames_Queue_Size/value, 16.000000 -/device_0/sensor_0/option/Freefall_Detection_Enabled/description, When enabled (default), the sensor will turn off if a free-fall is detected -/device_0/sensor_0/option/Freefall_Detection_Enabled/value, 1.000000 -/device_0/sensor_0/option/Global_Time_Enabled/description, Enable/Disable global timestamp -/device_0/sensor_0/option/Global_Time_Enabled/value, 0.000000 -/device_0/sensor_0/option/Host_Performance/description, Optimize based on host performance, low power low performance host or high power high performance host -/device_0/sensor_0/option/Host_Performance/value, 0.000000 -/device_0/sensor_0/option/Humidity_Temperature/description, Humidity temperature -/device_0/sensor_0/option/Humidity_Temperature/value, 35.964371 -/device_0/sensor_0/option/Inter_Cam_Sync_Mode/description, Enable multi-camera hardware synchronization mode (disabled on startup); not compatible with free-fall detection -/device_0/sensor_0/option/Inter_Cam_Sync_Mode/value, 0.000000 -/device_0/sensor_0/option/Invalidation_Bypass/description, Enable/disable pixel invalidation -/device_0/sensor_0/option/Invalidation_Bypass/value, 0.000000 -/device_0/sensor_0/option/LDD_temperature/description, Laser Driver temperature -/device_0/sensor_0/option/LDD_temperature/value, 41.458199 -/device_0/sensor_0/option/Laser_Power/description, Power of the laser emitter, with 0 meaning projector off -/device_0/sensor_0/option/Laser_Power/value, 100.000000 -/device_0/sensor_0/option/Ma_Temperature/description, DSP controller temperature -/device_0/sensor_0/option/Ma_Temperature/value, 35.222988 -/device_0/sensor_0/option/Mc_Temperature/description, Mems Controller temperature -/device_0/sensor_0/option/Mc_Temperature/value, 34.228119 -/device_0/sensor_0/option/Min_Distance/description, Minimal distance to the target (in mm) -/device_0/sensor_0/option/Min_Distance/value, 490.000000 -/device_0/sensor_0/option/Noise_Estimation/description, Noise estimation -/device_0/sensor_0/option/Noise_Estimation/value, 1242.000000 -/device_0/sensor_0/option/Noise_Filtering/description, Control edges and background noise -/device_0/sensor_0/option/Noise_Filtering/value, 4.000000 -/device_0/sensor_0/option/Post_Processing_Sharpening/description, Changes the amount of sharpening in the post-processed image -/device_0/sensor_0/option/Post_Processing_Sharpening/value, 1.000000 -/device_0/sensor_0/option/Pre_Processing_Sharpening/description, Changes the amount of sharpening in the pre-processed image -/device_0/sensor_0/option/Pre_Processing_Sharpening/value, 0.000000 -/device_0/sensor_0/option/Receiver_Gain/description, Changes the exposure time of Avalanche Photo Diode in the receiver -/device_0/sensor_0/option/Receiver_Gain/value, 9.000000 -/device_0/sensor_0/option/Sensor_Mode/description, Notify the sensor about the intended streaming mode. Required for preset -/device_0/sensor_0/option/Sensor_Mode/value, 2.000000 -/device_0/sensor_0/option/Visual_Preset/description, Preset to calibrate the camera to environment ambient, no ambient or low ambient. -/device_0/sensor_0/option/Visual_Preset/value, 4.000000 -/device_0/sensor_0/post_processing, Temporal Filter diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/get_options_from_rosbag.m b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/get_options_from_rosbag.m deleted file mode 100644 index 11182dd..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/get_options_from_rosbag.m +++ /dev/null @@ -1,40 +0,0 @@ -bag = rosbag("C:\Users\35840\Documents\20211217_204044.bag"); -topics = bag.AvailableTopics; - -% Get only the option topics -depth_sensor_option_topics = topics(14:66,:).Properties.RowNames; -rgb_sensor_option_topics = topics(73:105,:).Properties.RowNames; -imu_sensor_option_topics = topics(117:122,:).Properties.RowNames; - -% Put options data in cells -depth_options = options_to_cell(bag, depth_sensor_option_topics) -rgb_options = options_to_cell(bag, rgb_sensor_option_topics) -imu_options = options_to_cell(bag, imu_sensor_option_topics) - -cell_to_file(depth_options, 'depth_options.txt') -cell_to_file(rgb_options, 'rgb_options.txt') -cell_to_file(imu_options, 'imu_options.txt') -function cell_to_file(cell, file_name) - file = fopen(file_name,'w') - for index = 1 : numel(cell) / 2 - disp(index) - if mod(index,2) == 0 - fprintf(file,'%s, %f\n',cell{index,1},cell{index,2}); - else - fprintf(file,'%s, %s\n',cell{index,1},cell{index,2}); - end - end - fclose(file); -end - -function options = options_to_cell(bag, topics) - for index = 1 : numel(topics) - m = readMessages(select(bag,'Topic',topics{index}),'DataFormat','struct'); - options{index,1} = topics{index}; - if mod(index,2) == 0 - options{index,2} = m{1,1}.Data; - else - options{index,2} = m{1,1}.Data; - end - end -end \ No newline at end of file diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/imu_options.txt b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/imu_options.txt deleted file mode 100644 index 81a93f1..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/imu_options.txt +++ /dev/null @@ -1,6 +0,0 @@ -/device_0/sensor_2/option/Enable_Motion_Correction/description, Enable/Disable Automatic Motion Data Correction -/device_0/sensor_2/option/Enable_Motion_Correction/value, 1.000000 -/device_0/sensor_2/option/Frames_Queue_Size/description, Max number of frames you can hold at a given time. Increasing this number will reduce frame drops but increase latency, and vice versa -/device_0/sensor_2/option/Frames_Queue_Size/value, 16.000000 -/device_0/sensor_2/option/Global_Time_Enabled/description, Enable/Disable global timestamp -/device_0/sensor_2/option/Global_Time_Enabled/value, 0.000000 diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/rgb_options.txt b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/rgb_options.txt deleted file mode 100644 index 88f1a50..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/MATLAB/rgb_options.txt +++ /dev/null @@ -1,33 +0,0 @@ -/device_0/sensor_1/option/Auto_Exposure_Priority/description, Restrict Auto-Exposure to enforce constant FPS rate. Turn ON to remove the restrictions (may result in FPS drop) -/device_0/sensor_1/option/Auto_Exposure_Priority/value, 1.000000 -/device_0/sensor_1/option/Backlight_Compensation/description, Enable / disable backlight compensation -/device_0/sensor_1/option/Backlight_Compensation/value, 128.000000 -/device_0/sensor_1/option/Brightness/description, UVC image brightness -/device_0/sensor_1/option/Brightness/value, 0.000000 -/device_0/sensor_1/option/Contrast/description, UVC image contrast -/device_0/sensor_1/option/Contrast/value, 50.000000 -/device_0/sensor_1/option/Enable_Auto_Exposure/description, Enable / disable auto-exposure -/device_0/sensor_1/option/Enable_Auto_Exposure/value, 1.000000 -/device_0/sensor_1/option/Enable_Auto_White_Balance/description, Enable / disable auto-white-balance -/device_0/sensor_1/option/Enable_Auto_White_Balance/value, 1.000000 -/device_0/sensor_1/option/Exposure/description, Controls exposure time of color camera. Setting any value will disable auto exposure -/device_0/sensor_1/option/Exposure/value, 156.000000 -/device_0/sensor_1/option/Frames_Queue_Size/description, Max number of frames you can hold at a given time. Increasing this number will reduce frame drops but increase latency, and vice versa -/device_0/sensor_1/option/Frames_Queue_Size/value, 16.000000 -/device_0/sensor_1/option/Gain/description, UVC image gain -/device_0/sensor_1/option/Gain/value, 256.000000 -/device_0/sensor_1/option/Global_Time_Enabled/description, Enable/Disable global timestamp -/device_0/sensor_1/option/Global_Time_Enabled/value, 0.000000 -/device_0/sensor_1/option/Host_Performance/description, Optimize based on host performance, low power low performance host or high power high performance host -/device_0/sensor_1/option/Host_Performance/value, 0.000000 -/device_0/sensor_1/option/Hue/description, UVC image hue -/device_0/sensor_1/option/Hue/value, 0.000000 -/device_0/sensor_1/option/Power_Line_Frequency/description, Power Line Frequency -/device_0/sensor_1/option/Power_Line_Frequency/value, 1.000000 -/device_0/sensor_1/option/Saturation/description, UVC image saturation setting -/device_0/sensor_1/option/Saturation/value, 50.000000 -/device_0/sensor_1/option/Sharpness/description, UVC image sharpness setting -/device_0/sensor_1/option/Sharpness/value, 50.000000 -/device_0/sensor_1/option/White_Balance/description, Controls white balance of color image. Setting any value will disable auto white balance -/device_0/sensor_1/option/White_Balance/value, 4600.000000 -/device_0/sensor_1/post_processing, Decimation Filter diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/README.md b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/README.md deleted file mode 100644 index 0e2b188..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/README.md +++ /dev/null @@ -1 +0,0 @@ -# RealSense_Utilities diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/object_detection.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/object_detection.py deleted file mode 100644 index f6afe29..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/object_detection.py +++ /dev/null @@ -1,113 +0,0 @@ -'''Program is using this code with modifications: -https://github.com/IntelRealSense/librealsense/blob/jupyter/notebooks/distance_to_object.ipynb''' -# TODO: -# - -# - -# - -# - - - -import cv2 - -# Color constant for opencv -WHITE = (255, 255, 255) - -class ObjectDetect: - - def __init__(self, color_frame, depth_frame, depth_scale): - self.color_frame = color_frame - self.depth_frame = depth_frame - self.depth_scale = depth_scale - #self.color_intrinsics = color_intrin - - self.confidence: float - - # Rectangle that is drawn around the detected object - self.rectangle_xmin = None - self.rectangle_ymin = None - self.rectangle_xmax = None - self.rectangle_ymax = None - - - def detect(self): - # Standard OpenCV boilerplate for running the net: - height, width = self.color_frame.shape[:2] - expected = 300 - aspect = width / height - resized_image = cv2.resize(self.color_frame, (round(expected * aspect), expected)) - crop_start = round(expected * (aspect - 1) / 2) - crop_img = resized_image[0:expected, crop_start:crop_start+expected] - - net = cv2.dnn.readNetFromCaffe("C:\\Users\\35840\\Downloads\\MobileNetSSD\\MobileNetSSD\\MobileNetSSD_deploy.prototxt", "C:\\Users\\35840\\Downloads\\MobileNetSSD\\MobileNetSSD\\MobileNetSSD_deploy.caffemodel") - inScaleFactor = 0.007843 - meanVal = 127.53 - class_names = ("background", "aeroplane", "bicycle", "bird", "boat", - "bottle", "bus", "car", "cat", "chair", - "cow", "diningtable", "dog", "horse", - "motorbike", "person", "pottedplant", - "sheep", "sofa", "train", "tvmonitor") - #class_names = ("bottle", "chair", "diningtable", "person", "pottedplant", "tvmonitor") - blob = cv2.dnn.blobFromImage(crop_img, inScaleFactor, (expected, expected), meanVal, False) - net.setInput(blob, "data") - detections = net.forward("detection_out") - - label = detections[0,0,0,1] - conf = detections[0,0,0,2] - xmin = detections[0,0,0,3] - ymin = detections[0,0,0,4] - xmax = detections[0,0,0,5] - ymax = detections[0,0,0,6] - - class_name = class_names[int(label)] - - confidence = str(round(conf,2))[0:4] - - # cv2.rectangle(crop_img, (int(xmin * expected), int(ymin * expected)), - # (int(xmax * expected), int(ymax * expected)), (255, 255, 255), 2) - - scale = height / expected - xmin_depth = int((xmin * expected + crop_start) * scale) - ymin_depth = int((ymin * expected) * scale) - xmax_depth = int((xmax * expected + crop_start) * scale) - ymax_depth = int((ymax * expected) * scale) - - # Crop depth data: - depth = self.depth_frame[xmin_depth:xmax_depth,ymin_depth:ymax_depth].astype(float) - - # Get data scale from the device and convert to meters - depth = depth * self.depth_scale - distance,_,_,_ = cv2.mean(depth) - - # if class_name not in ["bottle", "chair", "diningtable", "person", "pottedplant", "tvmonitor"]: - # class_name = "unknown" - - self.rectangle_xmin = xmin_depth - self.rectangle_ymin = ymin_depth - self.rectangle_xmax = xmax_depth - self.rectangle_ymax = ymax_depth - self.confidence = confidence - self.class_name = class_name - self.distance = distance - - def draw_rectangle(self, image): - - # Rectangle variables - top_left_corner = (self.rectangle_xmin, self.rectangle_ymin) - bottom_right_corner = (self.rectangle_xmax, self.rectangle_ymax) - rectangle_color = WHITE - rectangle_thickness = 2 - - # Text variables - text = f'{self.class_name} {self.distance:.2f} meters away' - text_location = (self.rectangle_xmin, self.rectangle_ymin - 5) - text_font = cv2.FONT_HERSHEY_COMPLEX - text_color = WHITE - text_scale = 0.5 - - cv2.rectangle(image, - top_left_corner, bottom_right_corner, - rectangle_color, rectangle_thickness) - - cv2.putText(self.color_frame, text, - text_location, text_font, - text_scale, text_color) \ No newline at end of file diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream.py deleted file mode 100644 index bb5a2f5..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream.py +++ /dev/null @@ -1,179 +0,0 @@ -import cv2 -from object_detection import ObjectDetect -import math -import numpy as np - -from realsense_api import RealSenseCamera - -top = 100 -bottom = 100 -left = 100 -right = 100 - -BLUE = [255,0,0] - -ros_bag = "C:\\Users\\35840\\Documents\\20211217_204044.bag" - -def measure_dimensions(points): - - height = {'ix': points[0], - 'iy': points[2], - 'x' : points[0], - 'y' : points[3]} - - width = {'ix': points[0], - 'iy': points[2], - 'x' : points[1], - 'y' : points[2]} - - #dimensions = [height, width] - - #print(points) - global color_intrin - - # Height - udist_height = camera.depth_frame.get_distance(height['ix'],height['iy']) - vdist_height = camera.depth_frame.get_distance(height['x'], height['y']) - #print(udist,vdist) - - point1_height = rs.rs2_deproject_pixel_to_point(color_intrin, [height['ix'],height['iy']], udist_height) - point2_height = rs.rs2_deproject_pixel_to_point(color_intrin, [height['x'], height['y']], vdist_height) - #print(str(point1)+ ' ' +str(point2)) - - height = math.sqrt( - math.pow(point1_height[0] - point2_height[0], 2) + math.pow(point1_height[1] - point2_height[1],2) + - math.pow(point1_height[2] - point2_height[2], 2) - ) - - # Width - udist_width = camera.depth_frame.get_distance(width['ix'],width['iy']) - vdist_width = camera.depth_frame.get_distance(width['x'], width['y']) - #print(udist,vdist) - - point1_width = rs.rs2_deproject_pixel_to_point(color_intrin, [width['ix'],width['iy']], udist_width) - point2_width = rs.rs2_deproject_pixel_to_point(color_intrin, [width['x'], width['y']], vdist_width) - #print(str(point1)+ ' ' +str(point2)) - - width = math.sqrt( - math.pow(point1_width[0] - point2_width[0], 2) + math.pow(point1_width[1] - point2_width[1],2) + - math.pow(point1_width[2] - point2_width[2], 2) - ) - - return height, width - -# Initialize the camera -camera = RealSenseCamera(ros_bag) - -display_dimensions = False -show_filtered_distance = False -show_filtered = False -apply_filter = True - -try: - while True: - # try: - camera.get_data() # Load the object's variables with data - depth_frame = camera.depth_frame - color_frame = camera.color_frame - infrared_frame = camera.infrared_frame - color_intrin = camera.color_intrinsics - - # apply filtering to depth data - if apply_filter: - camera.filter_depth_data(enable_decimation = True, - enable_spatial = False, - enable_temporal = True, - enable_hole_filling = False) - - depth_frame = camera.processed_depth_frame - print('filters applied') - #processed_depth_image = camera.frame_to_np_array(processed_depth_frame, colorize_depth=True) - - depth_image = frame_to_np_array(depth_frame, colorize_depth=True) - color_image = frame_to_np_array(color_frame) - infrared_image = frame_to_np_array(infrared_frame) - - ########################################### - ##---------- IMAGE TO BE SHOWN ----------## - ########################################### - image_to_be_shown = depth_image - image_name = 'filtered depth' - - # cv2.imshow('color 640x480', color_image) - # cv2.imshow('depth 320x240', depth_image) - # cv2.imshow('IR 320x240', infrared_image) - a = cv2.resize(image_to_be_shown, (640, 480)) - cv2.imshow(image_name, a) - - - # size = cv2.getWindowImageRect('color 640x480') - # print(size) - - # ret, depth_frame, color_frame, colorized_depth, color_intrin, filtered_depth_colored, filtered_depth = camera.get_frame() - # nn = ObjectDetect(color_frame, colorized_depth, depth_frame, camera.depth_scale, filtered_depth_colored, filtered_depth) - #crop_img, depth_img, text, text_filt, text_location, points, confidence = nn.detect() - - #cv2.namedWindow('Both Streams', cv2.WINDOW_NORMAL) - #cv2.setWindowProperty('Both Strams', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) - #bordered = cv2.copyMakeBorder(stretched, top, bottom, left, right, cv2.BORDER_CONSTANT, value=BLUE) - - # if show_filtered_distance: - # cv2.putText(color_frame, text_filt, text_location, - # cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255)) - # else: - # print(confidence) - # cv2.putText(color_frame, text, text_location, - # cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255)) - # cv2.putText(colorized_depth, text, text_location, - # cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255)) - - # if display_dimensions: - # height, width = measure_dimensions(points) - # print(height, width) - - # if height != 0.0 or width != 0.0: - # width = f'width = {str(round(width, 3))} meters' - # height = f'height = {str(round(height, 3))} meters' - # text_height_location = (points[1], (int((points[3] + points[2]) / 2))) - # text_width_location = (points[0], points[3] + 20) - # cv2.putText(color_frame, height, text_height_location, - # cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255)) - # cv2.putText(color_frame, width, text_width_location, - # cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255)) - - #images = np.hstack((color_frame, colorized_depth)) - #images_filtered = np.hstack((color_frame, filtered_depth_colored)) - #stretched = cv2.resize(images, (2560, 1440)) - - #cv2.imshow("Filtered", images_filtered) - - if show_filtered: - cv2.imshow('Filtered', filtered_depth_colored) - key = cv2.waitKey(1) - - # Press esc or 'q' to close the image window - if key & 0xFF == ord('q') or key == 27: - cv2.destroyAllWindows() - break - elif key & 0xFF == ord('m'): #enable dimensions measurements - display_dimensions = True - elif key & 0xFF == ord('o'): #turn off dimensions measurements - display_dimensions = False - elif key & 0xFF == ord('f'): - show_filtered_distance = True - elif key & 0xFF == ord('g'): - show_filtered_distance = False - elif key & 0xFF == ord('a'): - show_filtered = True - elif key & 0xFF == ord('s'): - show_filtered = False - cv2.destroyWindow('Filtered') - # elif key & 0xFF == ord('v'): - # camera.spatial_magnitude = - - # except RuntimeError as e: - # print(f'{(e).__class__.__name__}: {e}') #error message - # continue - -finally: - camera.stop() \ No newline at end of file diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_test.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_test.py deleted file mode 100644 index a57f411..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_test.py +++ /dev/null @@ -1,59 +0,0 @@ -import numpy as np # fundamental package for scientific computing -import matplotlib.pyplot as plt # 2D plotting library producing publication quality figures -import pyrealsense2 as rs # Intel RealSense cross-platform open-source API -print("Environment Ready") -import cv2 - -# Setup: -pipe = rs.pipeline() -cfg = rs.config() -cfg.enable_device_from_file("C:\\Users\\35840\\Documents\\20211217_204044.bag") -profile = pipe.start(cfg) - -try: - while True: - # decimate = rs.decimation_filter(8) - # align_to = rs.stream.color - # align = rs.align(align_to) - - # # Get frameset of color and depth - # frames = pipeline.wait_for_frames() - # decimated = decimate.process(frames).as_frameset() - # # Align the depth frame to color frame - # aligned_frames = align.process(decimated) - frameset = pipe.wait_for_frames() - frame = frameset.get_depth_frame() - - depth_to_disparity = rs.disparity_transform(True) - disparity_to_depth = rs.disparity_transform(False) - - colorizer = rs.colorizer() - spatial = rs.spatial_filter() - spatial.set_option(rs.option.holes_fill, 3) - - temporal = rs.temporal_filter(0.4,40,8) - hole_filling = rs.hole_filling_filter() - - # frame = depth_to_disparity.process(frame) - # frame = spatial.process(frame) - frame = temporal.process(frameset).as_frameset() - # frame = frame.get_depth_frame() - - # frame = disparity_to_depth.process(frame) - # frame = hole_filling.process(frame) - align = rs.align(rs.stream.color) - frame = align.process(frame) - frame = frame.get_depth_frame() - colorized_depth = np.asanyarray(colorizer.colorize(frame).get_data()) - - cv2.imshow('o', colorized_depth) - - key = cv2.waitKey(1) - - # Press esc or 'q' to close the image window - if key & 0xFF == ord('q') or key == 27: - cv2.destroyAllWindows() - break - -finally: - pipe.stop() diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_v2.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_v2.py deleted file mode 100644 index 701e100..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_v2.py +++ /dev/null @@ -1,99 +0,0 @@ -from object_detection import ObjectDetect -import cv2 -from realsense_api import RealSenseCamera - -# TODO: -# - Restore the object detection functionality -# - Create a dictionary to hold multiple rosbag file paths that can be the -# key while the value can be a camera instantiation. This would be for -# when we want to view multiple rosbags at the same time. -# - Add the ability to change filter values using key presses while viewing -# the opencv Stream -# - Add the ability to save the current filter configuration to a text file -# or json - -#ros_bag = "C:\\Users\\35840\\Documents\\20211217_204044.bag" -# ros_bag = "C:\\Users\\35840\\Documents\\20211220_124541.bag" -ros_bag = "C:\\Users\\35840\\Documents\\20211220_132508.bag" -ros_bag2 = "C:\\Users\\35840\\Documents\\20211221_120843_2d.bag" -ros_bag3 = "C:\\Users\\35840\\Documents\\20211221_121055_3d.bag" - -# Initialize the camera -# camera = RealSenseCamera(ros_bag2) -# camera2 = RealSenseCamera(ros_bag3) -camera = RealSenseCamera() - - -apply_filter = True - -try: - while True: - camera.get_data() # Load the object's variables with data - # camera2.get_data() # Load the object's variables with data - - # apply filtering to depth data - if apply_filter: - camera.filter_depth_data(enable_decimation=True, - enable_spatial=True, - enable_temporal=True, - enable_hole_filling=True) - filtered_frameset = camera.filtered_frameset - - # camera2.filter_depth_data(enable_decimation=True, - # enable_spatial=True, - # enable_temporal=True, - # enable_hole_filling=False) - # filtered_depth_frame2 = camera2.filtered_frameset.get_depth_frame() - - camera.get_aligned_frames(filtered_frameset, aligned_to_color=True) - - #depth_frame = camera.depth_frame - filtered_depth_frame = camera.depth_frame_aligned - - color_frame = camera.color_frame_aligned - # infrared_frame = camera.infrared_frame - # color_intrin = camera.color_intrinsics - - # depth_frame = camera.depth_frame - # color_frame = camera.color_frame - # infrared_frame = camera.infrared_frame - # color_intrin = camera.color_intrinsics - - # depth_frame2 = camera2.depth_frame - # color_frame2 = camera2.color_frame - # infrared_frame2 = camera2.infrared_frame - # color_intrin2 = camera2.color_intrinsics - - color_img = frame_to_np_array(color_frame) - colored_depth_image = frame_to_np_array(filtered_depth_frame, colorize_depth=True) - depth_image = frame_to_np_array(filtered_depth_frame) - - #depth_image = camera.frame_to_np_array(depth_frame, colorize_depth=True) - - detector = ObjectDetect(color_img, depth_image, camera.depth_scale) - detector.detect() - detector.draw_rectangle(color_img) - - image_name = 'filtered depth' - # proc_depth_image2 = camera2.frame_to_np_array(filtered_depth_frame2, colorize_depth=True) - - # depth_image2 = camera2.frame_to_np_array(depth_frame2, colorize_depth=True) - - # img2 = proc_depth_image2 - # image_name2 = 'filtered depth2' - #img = cv2.resize(image_to_be_shown, (640, 480)) - #depth_image = cv2.resize(depth_image, (640, 480)) - - cv2.imshow(image_name, colored_depth_image) - #cv2.imshow('o', depth_image) - # cv2.imshow(image_name2, img2) - cv2.imshow('o2', color_img) - key = cv2.waitKey(1) - - # Press esc or 'q' to close the image window - if key & 0xFF == ord('q') or key == 27: - cv2.destroyAllWindows() - break - -finally: - camera.stop() \ No newline at end of file diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_v3.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_v3.py deleted file mode 100644 index adf8894..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/opencv_stream_v3.py +++ /dev/null @@ -1,80 +0,0 @@ -import cv2 -import pyrealsense2 as rs -from RealSense_Utilities.realsense_api.realsense_api import RealSenseCamera -from RealSense_Utilities.realsense_api.realsense_api import find_realsense -from RealSense_Utilities.realsense_api.realsense_api import frame_to_np_array -from RealSense_Utilities.realsense_api.post_processing.option import OptionType - -# TODO: -# - Create a dictionary to hold multiple rosbag file paths that can be the -# key while the value can be a camera instantiation. This would be for -# when we want to view multiple rosbags at the same time. -# - Add the ability to change filter values using key presses while viewing -# the opencv Stream -# - Add the ability to save the current filter configuration to a text file -# or json - - -# Initialize the camera -cameras = [] -realsense_device = find_realsense() - -for i in realsense_device: - cameras.append(RealSenseCamera(device=i, adv_mode_flag=True)) - -apply_filter = False -apply_align = True - -try: - while True: - # Get the frameset and other data to be loaded into the class attributes - for i in range(len(cameras)): - cameras[i].get_data() - - if apply_filter: - cameras[i].filter_depth_data(enable_decimation=False, - enable_spatial=True, - enable_temporal=True, - enable_hole_filling=False) - frameset = cameras[i].filtered_frameset - else: - frameset = cameras[i].frameset - - # filtering block - # frameset = cameras[i].decimation_filter.process(frameset).as_frameset() - frameset = cameras[i].depth_to_disparity.process(frameset).as_frameset() - frameset = cameras[i].spatial_filter.process(frameset).as_frameset() - frameset = cameras[i].temporal_filter.process(frameset).as_frameset() - frameset = cameras[i].disparity_to_depth.process(frameset).as_frameset() - # frameset = cameras[i].hole_filling_filter.process(frameset).as_frameset() - - if apply_align: - cameras[i].get_aligned_frames(frameset, aligned_to_color=True) - depth_frame = cameras[i].depth_frame_aligned - color_frame = cameras[i].color_frame_aligned - else: - depth_frame = frameset.get_depth_frame() - color_frame = frameset.get_color_frame() - - cameras[i].color_image = frame_to_np_array(color_frame) - cameras[i].colored_depthmap = frame_to_np_array(depth_frame, colorize_depth=True) - cameras[i].depth_image = frame_to_np_array(depth_frame) - - # Show image - for i in cameras: - image_name = '{}_filtered depth'.format(i.device.get_info(rs.camera_info.serial_number)) - cv2.imshow(image_name, i.colored_depthmap) - - key = cv2.waitKey(1) - - # Press esc or 'q' to close the image window - if key & 0xFF == ord('q') or key == 27: - cv2.destroyAllWindows() - break - - # if key & 0xFF == ord('d'): - # decimation_magnitude = cameras[0].decimation.options[OptionType.MAGNITUDE] - # cameras[0].decimation.increment(decimation_magnitude) -finally: - for i in cameras: - i.stop() diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/__init__.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/__init__.py deleted file mode 100644 index 56acdb5..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__all__ = ['realsense_api'] diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/decimation.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/decimation.py deleted file mode 100644 index 0984414..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/decimation.py +++ /dev/null @@ -1,19 +0,0 @@ -# https://dev.intelrealsense.com/docs/post-processing-filters -from option import OptionValues, OptionType, FilterOptions - - -class DecimationOptions(FilterOptions): - def __init__(self) -> None: - self.options: OptionDict = { - OptionType.MAGNITUDE: OptionValues( - option_value=2, - option_value_increment=1, - option_min_value=1, - option_max_value=8 - ) - } - - def increment(self, option: OptionValues) -> None: - option.option_value += option.option_value_increment - if option.option_value > option.option_max_value: - option.option_value = option.option_min_value diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/hole_filling.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/hole_filling.py deleted file mode 100644 index 7de60fa..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/hole_filling.py +++ /dev/null @@ -1,19 +0,0 @@ -# https://dev.intelrealsense.com/docs/post-processing-filters -from option import OptionValues, OptionType, FilterOptions - - -class HoleFillingOptions(FilterOptions): - def __init__(self) -> None: - self.options: OptionDict = { - OptionType.MAGNITUDE: OptionValues( - option_value=1, - option_value_increment=1, - option_min_value=0, - option_max_value=2 - ) - } - - def increment(self, option: OptionValues) -> None: - option.option_value += option.option_value_increment - if option.option_value > option.option_max_value: - option.option_value = option.option_min_value diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/option.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/option.py deleted file mode 100644 index 73aa770..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/option.py +++ /dev/null @@ -1,31 +0,0 @@ -from typing import TypedDict -from dataclasses import dataclass -from enum import Enum, auto -from abc import ABC, abstractmethod - - -class OptionType(Enum): - MAGNITUDE = auto() - SMOOTH_ALPHA = auto() - SMOOTH_DELTA = auto() - HOLE_FILLING = auto() - PERSISTENCY_INDEX = auto() - - -@dataclass -class OptionValues: - option_value: float - option_value_increment: float - option_min_value: float - option_max_value: float - - -# class OptionDict(TypedDict): -# option: OptionType -# properties: OptionValues - - -class FilterOptions(ABC): - @abstractmethod - def increment(self, option: OptionValues) -> None: - pass diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/options.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/options.py deleted file mode 100644 index 219759b..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/options.py +++ /dev/null @@ -1,112 +0,0 @@ -# https://dev.intelrealsense.com/docs/post-processing-filters -from RealSense_Utilities.realsense_api.post_processing.option import OptionValues, OptionType, FilterOptions - - -############################################################# -# -------------------- DECIMATION OPTIONS -------------------# -############################################################# -class DecimationOptions(FilterOptions): - def __init__(self) -> None: - self.options: dict = { - OptionType.MAGNITUDE: OptionValues( - option_value=2, - option_value_increment=1, - option_min_value=1, - option_max_value=8 - ) - } - - def increment(self, option: OptionValues) -> None: - option.option_value += option.option_value_increment - if option.option_value > option.option_max_value: - option.option_value = option.option_min_value - - -############################################################# -# --------------------- SPATIAL OPTIONS ---------------------# -############################################################# -class SpatialOptions(FilterOptions): - def __init__(self) -> None: - self.options: dict = { - OptionType.MAGNITUDE: OptionValues( - option_value=2, - option_value_increment=1, - option_min_value=0, - option_max_value=5 - ), - OptionType.SMOOTH_ALPHA: OptionValues( - option_value=0.5, - option_value_increment=0.25, - option_min_value=0.0, - option_max_value=1.0 - ), - OptionType.SMOOTH_DELTA: OptionValues( - option_value=2, - option_value_increment=1, - option_min_value=0, - option_max_value=5 - ), - OptionType.HOLE_FILLING: OptionValues( - option_value=0, - option_value_increment=1, - option_min_value=0, - option_max_value=5 - ) - } - - def increment(self, option: OptionValues): - option.option_value += option.option_value_increment - if option.option_value > option.option_max_value: - option.option_value = option.option_min_value - - -############################################################# -# --------------------- TEMPORAL OPTIONS --------------------# -############################################################# -class TemporalOptions(FilterOptions): - def __init__(self) -> None: - self.options: dict = { - OptionType.SMOOTH_ALPHA: OptionValues( - option_value=0.4, - option_value_increment=0.1, - option_min_value=0.0, - option_max_value=1.0 - ), - OptionType.SMOOTH_DELTA: OptionValues( - option_value=20, - option_value_increment=10, - option_min_value=0, - option_max_value=100 - ), - OptionType.PERSISTENCY_INDEX: OptionValues( - option_value=3, - option_value_increment=1, - option_min_value=0, - option_max_value=8 - ) - } - - def increment(self, option: OptionValues) -> None: - option.option_value += option.option_value_increment - if option.option_value > option.option_max_value: - option.option_value = option.option_min_value - - -############################################################# -# ------------------- HOLE FILLING OPTIONS ------------------# -############################################################# -class HoleFillingOptions(FilterOptions): - def __init__(self) -> None: - self.options: dict = { - OptionType.HOLE_FILLING: OptionValues( - option_value=1, - option_value_increment=1, - option_min_value=0, - option_max_value=2 - ) - } - - def increment(self, option: OptionValues) -> None: - option.option_value += option.option_value_increment - if option.option_value > option.option_max_value: - option.option_value = option.option_min_value diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/spatial.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/spatial.py deleted file mode 100644 index b6f73d3..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/spatial.py +++ /dev/null @@ -1,64 +0,0 @@ -# https://dev.intelrealsense.com/docs/post-processing-filters -from dataclasses import asdict, dataclass, field -from option import OptionValues, OptionType, OptionDict, FilterOptions - - -class SpatialOptions(FilterOptions): - def __init__(self) -> None: - self.options: OptionDict = { - OptionType.MAGNITUDE: OptionValues( - option_value=2, - option_value_increment=1, - option_min_value=0, - option_max_value=5 - ), - OptionType.SMOOTH_ALPHA: OptionValues( - option_value=0.5, - option_value_increment=0.25, - option_min_value=0.0, - option_max_value=1.0 - ), - OptionType.SMOOTH_DELTA: OptionValues( - option_value=2, - option_value_increment=1, - option_min_value=0, - option_max_value=5 - ), - OptionType.HOLE_FILLING: OptionValues( - option_value=0, - option_value_increment=1, - option_min_value=0, - option_max_value=5 - ) - } - - def increment(self, option: OptionValues): - option.option_value += option.option_value_increment - if option.option_value > option.option_max_value: - option.option_value = option.option_min_value - -# spatial_filter = SpatialOptions() -# spatial_filter2 = SpatialOptions() - -# # # spatial_options = asdict(spatial_filter.options) -# spatial_filter.options[OptionType.SMOOTH_ALPHA].option_value_increment = 0.1 -# spatial_filter2.options[OptionType.SMOOTH_ALPHA].option_value_increment = 0.25 - -# spatial_filter_hole_filling = spatial_filter.options[OptionType.SMOOTH_ALPHA] -# spatial_filter_hole_filling2 = spatial_filter2.options[OptionType.SMOOTH_ALPHA] - -# for i in range(20): -# print(f'{spatial_filter_hole_filling.option_value} {spatial_filter_hole_filling2.option_value}') -# spatial_filter.increment(spatial_filter_hole_filling) -# spatial_filter2.increment(spatial_filter_hole_filling2) - -# print(type(spatial_filter)) -# for i,v in spatial_options.items(): -# print(i,v) - -# =a.hole_filling -# print(o.option_value) -# for i in range(7): -# a.increment(o) -# for i in spatial_filter.options: -# print(i) diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/temporal.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/temporal.py deleted file mode 100644 index c6ae54c..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/post_processing/temporal.py +++ /dev/null @@ -1,31 +0,0 @@ -# https://dev.intelrealsense.com/docs/post-processing-filters -from option import OptionValues, OptionType, OptionDict, FilterOptions - - -class TemporalOptions(FilterOptions): - def __init__(self) -> None: - self.options: OptionDict = { - OptionType.SMOOTH_ALPHA: OptionValues( - option_value=0.4, - option_value_increment=0.1, - option_min_value=0.0, - option_max_value=1.0 - ), - OptionType.SMOOTH_DELTA: OptionValues( - option_value=20, - option_value_increment=10, - option_min_value=0, - option_max_value=100 - ), - OptionType.HOLE_FILLING: OptionValues( - option_value=3, - option_value_increment=1, - option_min_value=0, - option_max_value=8 - ) - } - - def increment(self, option: OptionValues) -> None: - option.option_value += option.option_value_increment - if option.option_value > option.option_max_value: - option.option_value = option.option_min_value diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/realsense_api.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/realsense_api.py deleted file mode 100644 index 902d26a..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/realsense_api/realsense_api.py +++ /dev/null @@ -1,344 +0,0 @@ -import numpy as np -import pyrealsense2 as rs -import json -import cv2 -from threading import Thread -from multiprocessing.pool import ThreadPool -# from realsense_api.post_processing.option import OptionType -from RealSense_Utilities.realsense_api.post_processing.options import \ - DecimationOptions, SpatialOptions, TemporalOptions, HoleFillingOptions, OptionType - - -# TODO: -# - Create a method for loading the json options that are generated by the realsense viewer -# - Create a method for displaying the options that are currently set -# - Add any remaining stream types into the get data method such as confidence -# - Add any other post processing filters that are missing - -# Links that I thought would be useful later: -# https://intelrealsense.github.io/librealsense/python_docs/_generated/pyrealsense2.threshold_filter.html?highlight=process -# https://github.com/IntelRealSense/librealsense/issues/6902 -# https://github.com/IntelRealSense/librealsense/issues/10078 - -def frame_to_np_array(frame, colorize_depth=False): - # Create colorized depth frame - if colorize_depth: - colorizer = rs.colorizer() - frame_as_image = np.asanyarray(colorizer.colorize(frame).get_data()) - return frame_as_image - frame_as_image = np.asanyarray(frame.get_data()) - return frame_as_image - - -def find_realsense(): - realsense_ctx = rs.context() - connected_devices = [] - serial_number = [] - for i in range(len(realsense_ctx.devices)): - detected_camera = realsense_ctx.devices[i] - connected_devices.append(detected_camera) - serial_number.append(detected_camera.get_info(rs.camera_info.serial_number)) - - return zip(serial_number, connected_devices) - - -def mediapipe_detection(image, model): - image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # COLOR CONVERSION BGR 2 RGB - image.flags.writeable = False # Image is no longer writeable - results = model.process(image) # Make prediction - image.flags.writeable = True # Image is now writeable - image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # COLOR CONVERSION RGB 2 BGR - return image, results - - -class RealSenseCamera: - def __init__(self, - depth_stream_width=848, depth_stream_height=480, - color_stream_width=640, color_stream_height=480, - depth_stream_fps=90, color_stream_fps=60, - device=None, adv_mode_flag=False, device_type='d455', - mp_lock=None, disable_color_auto_exposure=False): - - self.device = device - self.device_type = device_type - - self.current_timestamp = 0 - - self.colored_depthmap = None - self.color_image = None - self.depth_image = None - - # Resolution attributes - self.depth_stream_width = depth_stream_width - self.depth_stream_height = depth_stream_height - self.color_stream_width = color_stream_width - self.color_stream_height = color_stream_height - - self.depth_stream_fps = depth_stream_fps - self.color_stream_fps = color_stream_fps - - # Data attributes that will be set with get_data() - self.frameset = None - self.depth_frame = None - self.color_frame = None - self.infrared_frame = None - self.color_intrinsics = None - self.depth_intrinsics = None - self.depth_scale = None - self.camera_matrix = None - self.dist_coeffs = None - - # Holds the frameset after it has undergone filtering - self.filtered_frameset = None - - # Aligned frame holders - self.depth_frame_aligned = None - self.color_frame_aligned = None - - # Post Processing Filter attributes with default values - # https://dev.intelrealsense.com/docs/post-processing-filters - - self.decimation: DecimationOptions = DecimationOptions() - self.spatial: SpatialOptions = SpatialOptions() - self.temporal: TemporalOptions = TemporalOptions() - self.hole_filling: HoleFillingOptions = HoleFillingOptions() - - # Decimation filter attribute - self.decimation_magnitude = 3 - - # Spatial filter attributes - self.spatial_magnitude = 2 - self.spatial_smooth_alpha = 0.4 - self.spatial_smooth_delta = 4 - self.spatial_holes_fill = 0 - - # Temporal filter attributes - self.temporal_smooth_alpha = 0.1 - self.temporal_smooth_delta = 20 - self.persistency_index = 5 - - # Holes Filling filter attribute - self.hole_filling_param = 1 - - self.decimation_filter = rs.decimation_filter() - self.decimation_filter.set_option( - rs.option.filter_magnitude, - self.decimation_magnitude - ) - - self.spatial_filter = rs.spatial_filter() - self.spatial_filter.set_option( - rs.option.filter_magnitude, - self.spatial_magnitude - ) - self.spatial_filter.set_option( - rs.option.filter_smooth_alpha, - self.spatial_smooth_alpha - ) - self.spatial_filter.set_option( - rs.option.filter_smooth_delta, - self.spatial_smooth_delta - ) - self.spatial_filter.set_option( - rs.option.holes_fill, - self.spatial_holes_fill - ) - - self.temporal_filter = rs.temporal_filter() - self.temporal_filter.set_option( - rs.option.filter_smooth_alpha, - self.temporal_smooth_alpha - ) - self.temporal_filter.set_option( - rs.option.filter_smooth_delta, - self.temporal_smooth_delta - ) - self.temporal_filter.set_option( - rs.option.holes_fill, - self.persistency_index - ) - - self.hole_filling_filter = rs.hole_filling_filter() - self.hole_filling_filter.set_option( - rs.option.holes_fill, - self.hole_filling_param - ) - - self.depth_to_disparity = rs.disparity_transform(True) - self.disparity_to_depth = rs.disparity_transform(False) - - # json profile - if self.device_type == 'd455': - self.jsonObj = json.load(open("./d455_0321.json")) - elif self.device_type == 'd405': - self.jsonObj = json.load(open("./d405.json")) - elif self.device_type == 'd415': - self.jsonObj = json.load(open("./d415_0131.json")) - - self.pipeline = rs.pipeline() - config = rs.config() - - config.enable_device(self.device.get_info(rs.camera_info.serial_number)) - - config.enable_stream(rs.stream.depth, - self.depth_stream_width, self.depth_stream_height, - rs.format.z16, self.depth_stream_fps) - - config.enable_stream(rs.stream.color, - self.color_stream_width, self.color_stream_height, - rs.format.bgr8, self.color_stream_fps) - - config.enable_stream(rs.stream.infrared, - rs.format.y8, - self.depth_stream_fps) - - self.profile = self.pipeline.start(config) - - self.sensor = self.device.query_sensors() - - self.mp_lock = mp_lock - - # Get depth scale - depth_sensor = self.profile.get_device().first_depth_sensor() - depth_sensor.set_option(rs.option.emitter_enabled, 1) - self.depth_scale = depth_sensor.get_depth_scale() - - self.color_intrinsics = self.profile.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() - self.depth_intrinsics = self.profile.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() - self.camera_matrix = np.array( - [[self.color_intrinsics.fx, 0, self.color_intrinsics.ppx], - [0, self.color_intrinsics.fy, self.color_intrinsics.ppy], - [0, 0, 1]], - dtype=np.float64) - self.dist_coeffs = np.array([self.color_intrinsics.coeffs], dtype=np.float64) - - if adv_mode_flag: - self.adv_mode() - - if disable_color_auto_exposure: - color_sensor = self.sensor[1] - color_sensor.set_option(rs.option.auto_exposure_priority, 0) - color_sensor.set_option(rs.option.enable_auto_exposure, 0) - - def __iter__(self): - return self.device.get_info(rs.camera_info.serial_number) - - # def get_options(self): - def get_data(self): - if self.mp_lock is not None: - self.mp_lock.acquire() - - frameset = self.pipeline.wait_for_frames() - try: - self.current_timestamp = frameset.get_timestamp() - # self.frameset.keep() - self.depth_frame = frameset.get_depth_frame() - self.color_frame = frameset.get_color_frame() - self.infrared_frame = frameset.first(rs.stream.infrared) - - self.frameset = frameset - - except RuntimeError as e: - print(str(self.device.get_info(rs.camera_info.serial_number)) + " camera can't polling frame") - - if self.mp_lock is not None: - self.mp_lock.release() - - def get_aligned_frames(self, frameset, aligned_to_color=False, aligned_to_depth=False): - if aligned_to_color: - align_to = rs.stream.color - align = rs.align(align_to) - frameset = align.process(frameset) - - if aligned_to_depth: - align_to = rs.stream.depth - align = rs.align(align_to) - frameset = align.process(frameset) - - self.depth_frame_aligned = frameset.get_depth_frame() - self.color_frame_aligned = frameset.get_color_frame() - self.frameset = frameset - - def filter_depth_data(self, - enable_decimation=False, - enable_spatial=False, - enable_temporal=False, - enable_hole_filling=False): - - """Apply a cascade of filters on the depth frame""" - depth_to_disparity = rs.disparity_transform(True) - disparity_to_depth = rs.disparity_transform(False) - - frameset = self.frameset - # DECIMATION FILTER - if enable_decimation: - decimation = rs.decimation_filter() - decimation.set_option( - rs.option.filter_magnitude, - self.decimation.options[OptionType.MAGNITUDE].option_value - ) - frameset = decimation.process(frameset).as_frameset() - - # depth to disparity - frameset = depth_to_disparity.process(frameset).as_frameset() - - # SPATIAL FILTER - if enable_spatial: - spatial = rs.spatial_filter() - spatial.set_option( - rs.option.filter_magnitude, - self.spatial.options[OptionType.MAGNITUDE].option_value - ) - spatial.set_option( - rs.option.filter_smooth_alpha, - self.spatial.options[OptionType.SMOOTH_ALPHA].option_value - ) - spatial.set_option( - rs.option.filter_smooth_delta, - self.spatial.options[OptionType.SMOOTH_DELTA].option_value - ) - spatial.set_option( - rs.option.holes_fill, - self.spatial.options[OptionType.HOLE_FILLING].option_value - ) - frameset = spatial.process(frameset).as_frameset() - - # TEMPORAL FILTER - if enable_temporal: - temporal = rs.temporal_filter() - temporal.set_option( - rs.option.filter_smooth_alpha, - self.temporal.options[OptionType.SMOOTH_ALPHA].option_value - ) - temporal.set_option( - rs.option.filter_smooth_delta, - self.temporal.options[OptionType.SMOOTH_DELTA].option_value - ) - temporal.set_option( - rs.option.holes_fill, - self.temporal.options[OptionType.PERSISTENCY_INDEX].option_value - ) - frameset = temporal.process(frameset).as_frameset() - - # disparity to depth - frameset = disparity_to_depth.process(frameset).as_frameset() - - # HOLE FILLING - if enable_hole_filling: - hole_filling = rs.hole_filling_filter() - hole_filling.set_option( - rs.option.holes_fill, - self.hole_filling.options[OptionType.HOLE_FILLING].option_value - ) - frameset = hole_filling.process(frameset).as_frameset() - - self.filtered_frameset = frameset - - def adv_mode(self): - json_string = str(self.jsonObj).replace("'", '\"') - - advnc_mode_arg = rs.rs400_advanced_mode(self.device) - advnc_mode_arg.load_json(json_string) - - def stop(self): - self.pipeline.stop() diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/test.py b/src/handpose_pkg/handpose_pkg/RealSense_Utilities/test.py deleted file mode 100644 index d6f77c3..0000000 --- a/src/handpose_pkg/handpose_pkg/RealSense_Utilities/test.py +++ /dev/null @@ -1,4 +0,0 @@ -from realsense_api.post_processing.decimation import DecimationOptions -from realsense_api.post_processing.spatial import SpatialOptions -from realsense_api.post_processing.temporal import TemporalOptions -from realsense_api.post_processing.hole_filling import HoleFillingOptions \ No newline at end of file From 288d987db0cdfa0f3f27ed6af97099280841640d Mon Sep 17 00:00:00 2001 From: Bigyuun Date: Wed, 26 Jun 2024 08:34:37 +0900 Subject: [PATCH 07/11] script update using multiprocessing --- .../RealSense_Utilities.zip | Bin .../MATLAB/depth_options.txt | 53 ++ .../MATLAB/get_options_from_rosbag.m | 40 + .../MATLAB/imu_options.txt | 6 + .../MATLAB/rgb_options.txt | 33 + common/RealSense_Utilities/README.md | 1 + .../RealSense_Utilities/object_detection.py | 113 +++ common/RealSense_Utilities/opencv_stream.py | 179 ++++ .../RealSense_Utilities/opencv_stream_test.py | 59 ++ .../RealSense_Utilities/opencv_stream_v2.py | 99 ++ .../RealSense_Utilities/opencv_stream_v3.py | 80 ++ .../realsense_api/__init__.py | 1 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 206 bytes .../__pycache__/realsense_api.cpython-38.pyc | Bin 0 -> 7455 bytes .../realsense_api}/d405.json | 10 +- .../realsense_api/d455.json | 0 .../__pycache__/option.cpython-38.pyc | Bin 0 -> 1251 bytes .../__pycache__/options.cpython-38.pyc | Bin 0 -> 2835 bytes .../post_processing/decimation.py | 19 + .../post_processing/hole_filling.py | 19 + .../realsense_api/post_processing/option.py | 31 + .../realsense_api/post_processing/options.py | 112 +++ .../realsense_api/post_processing/spatial.py | 64 ++ .../realsense_api/post_processing/temporal.py | 31 + .../realsense_api/realsense_api.py | 355 ++++++++ common/RealSense_Utilities/test.py | 4 + common/__init__.py | 0 .../mediapipe_api/handlandmarks/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 222 bytes .../__pycache__/handlandmarks.cpython-38.pyc | Bin 0 -> 9986 bytes .../handlandmark_keypoints.json | 0 .../handlandmarks/handlandmarks.py | 327 +++++++ common/mediapipe_api/handlandmarks/hsh.jpg | Bin 0 -> 380541 bytes .../mediapipe_hands_realsense_demo_legacy.py | 144 +-- common/mediapipe_api/handlandmarks/test.py | 97 ++ common/mediapipe_api/handlandmarks/wja1.png | Bin 0 -> 204151 bytes common/mediapipe_api/handlandmarks/yj.jpg | Bin 0 -> 275900 bytes scripts/__init__.py | 0 .../handlandmarks_show_plot.cpython-38.pyc | Bin 0 -> 3317 bytes ...andlandmarks_with_realsense.cpython-38.pyc | Bin 0 -> 3048 bytes scripts/__pycache__/tcp_server.cpython-38.pyc | Bin 0 -> 3443 bytes scripts/handlandmarks_show_plot.py | 116 +++ scripts/handlandmarks_with_realsense.py | 115 +++ scripts/main.py | 25 + scripts/main_legacy.py | 18 + scripts/tcp_client.py | 48 + scripts/tcp_client2.py | 48 + scripts/tcp_client3.py | 48 + scripts/tcp_config.json | 5 + scripts/tcp_server.py | 111 +++ .../handpose_pkg/D455_preset_default.json | 104 --- .../__pycache__/handpose3Dshow.cpython-38.pyc | Bin 4050 -> 4186 bytes src/handpose_pkg/handpose_pkg/demo.py | 32 + .../handpose_pkg/mediapipe_hands.py | 848 ------------------ .../mediapipe_hands_3D_realsense_demo.py | 354 -------- .../mediapipe_hands_developing.py | 848 ------------------ 56 files changed, 2382 insertions(+), 2215 deletions(-) rename {src/handpose_pkg/handpose_pkg => common}/RealSense_Utilities.zip (100%) create mode 100644 common/RealSense_Utilities/MATLAB/depth_options.txt create mode 100644 common/RealSense_Utilities/MATLAB/get_options_from_rosbag.m create mode 100644 common/RealSense_Utilities/MATLAB/imu_options.txt create mode 100644 common/RealSense_Utilities/MATLAB/rgb_options.txt create mode 100644 common/RealSense_Utilities/README.md create mode 100644 common/RealSense_Utilities/object_detection.py create mode 100644 common/RealSense_Utilities/opencv_stream.py create mode 100644 common/RealSense_Utilities/opencv_stream_test.py create mode 100644 common/RealSense_Utilities/opencv_stream_v2.py create mode 100644 common/RealSense_Utilities/opencv_stream_v3.py create mode 100644 common/RealSense_Utilities/realsense_api/__init__.py create mode 100644 common/RealSense_Utilities/realsense_api/__pycache__/__init__.cpython-38.pyc create mode 100644 common/RealSense_Utilities/realsense_api/__pycache__/realsense_api.cpython-38.pyc rename {src/handpose_pkg/handpose_pkg => common/RealSense_Utilities/realsense_api}/d405.json (94%) rename src/handpose_pkg/handpose_pkg/d455_0321.json => common/RealSense_Utilities/realsense_api/d455.json (100%) create mode 100644 common/RealSense_Utilities/realsense_api/post_processing/__pycache__/option.cpython-38.pyc create mode 100644 common/RealSense_Utilities/realsense_api/post_processing/__pycache__/options.cpython-38.pyc create mode 100644 common/RealSense_Utilities/realsense_api/post_processing/decimation.py create mode 100644 common/RealSense_Utilities/realsense_api/post_processing/hole_filling.py create mode 100644 common/RealSense_Utilities/realsense_api/post_processing/option.py create mode 100644 common/RealSense_Utilities/realsense_api/post_processing/options.py create mode 100644 common/RealSense_Utilities/realsense_api/post_processing/spatial.py create mode 100644 common/RealSense_Utilities/realsense_api/post_processing/temporal.py create mode 100644 common/RealSense_Utilities/realsense_api/realsense_api.py create mode 100644 common/RealSense_Utilities/test.py create mode 100644 common/__init__.py create mode 100644 common/mediapipe_api/handlandmarks/__init__.py create mode 100644 common/mediapipe_api/handlandmarks/__pycache__/__init__.cpython-38.pyc create mode 100644 common/mediapipe_api/handlandmarks/__pycache__/handlandmarks.cpython-38.pyc rename {src/handpose_pkg/handpose_pkg => common/mediapipe_api/handlandmarks}/handlandmark_keypoints.json (100%) create mode 100644 common/mediapipe_api/handlandmarks/handlandmarks.py create mode 100644 common/mediapipe_api/handlandmarks/hsh.jpg rename src/handpose_pkg/handpose_pkg/mediapipe_hands_legacy.py => common/mediapipe_api/handlandmarks/mediapipe_hands_realsense_demo_legacy.py (86%) create mode 100644 common/mediapipe_api/handlandmarks/test.py create mode 100644 common/mediapipe_api/handlandmarks/wja1.png create mode 100644 common/mediapipe_api/handlandmarks/yj.jpg create mode 100644 scripts/__init__.py create mode 100644 scripts/__pycache__/handlandmarks_show_plot.cpython-38.pyc create mode 100644 scripts/__pycache__/handlandmarks_with_realsense.cpython-38.pyc create mode 100644 scripts/__pycache__/tcp_server.cpython-38.pyc create mode 100644 scripts/handlandmarks_show_plot.py create mode 100644 scripts/handlandmarks_with_realsense.py create mode 100644 scripts/main.py create mode 100644 scripts/main_legacy.py create mode 100644 scripts/tcp_client.py create mode 100644 scripts/tcp_client2.py create mode 100644 scripts/tcp_client3.py create mode 100644 scripts/tcp_config.json create mode 100644 scripts/tcp_server.py delete mode 100644 src/handpose_pkg/handpose_pkg/D455_preset_default.json create mode 100644 src/handpose_pkg/handpose_pkg/demo.py delete mode 100644 src/handpose_pkg/handpose_pkg/mediapipe_hands.py delete mode 100644 src/handpose_pkg/handpose_pkg/mediapipe_hands_3D_realsense_demo.py delete mode 100644 src/handpose_pkg/handpose_pkg/mediapipe_hands_developing.py diff --git a/src/handpose_pkg/handpose_pkg/RealSense_Utilities.zip b/common/RealSense_Utilities.zip similarity index 100% rename from src/handpose_pkg/handpose_pkg/RealSense_Utilities.zip rename to common/RealSense_Utilities.zip diff --git a/common/RealSense_Utilities/MATLAB/depth_options.txt b/common/RealSense_Utilities/MATLAB/depth_options.txt new file mode 100644 index 0000000..9b3c7a0 --- /dev/null +++ b/common/RealSense_Utilities/MATLAB/depth_options.txt @@ -0,0 +1,53 @@ +/device_0/sensor_0/option/Alternate_IR/description, Enable/Disable alternate IR +/device_0/sensor_0/option/Alternate_IR/value, 0.000000 +/device_0/sensor_0/option/Apd_Temperature/description, Avalanche Photo Diode temperature +/device_0/sensor_0/option/Apd_Temperature/value, 33.078812 +/device_0/sensor_0/option/Confidence_Threshold/description, The confidence level threshold to use to mark a pixel as valid by the depth algorithm +/device_0/sensor_0/option/Confidence_Threshold/value, 1.000000 +/device_0/sensor_0/option/Depth_Offset/description, Offset from sensor to depth origin in millimetrers +/device_0/sensor_0/option/Depth_Offset/value, 4.500000 +/device_0/sensor_0/option/Depth_Units/description, Number of meters represented by a single depth unit +/device_0/sensor_0/option/Depth_Units/value, 0.000250 +/device_0/sensor_0/option/Digital_Gain/description, Change the depth digital gain to: 1 for high gain and 2 for low gain +/device_0/sensor_0/option/Digital_Gain/value, 1.000000 +/device_0/sensor_0/option/Error_Polling_Enabled/description, Enable / disable polling of camera internal errors +/device_0/sensor_0/option/Error_Polling_Enabled/value, 1.000000 +/device_0/sensor_0/option/Frames_Queue_Size/description, Max number of frames you can hold at a given time. Increasing this number will reduce frame drops but increase latency, and vice versa +/device_0/sensor_0/option/Frames_Queue_Size/value, 16.000000 +/device_0/sensor_0/option/Freefall_Detection_Enabled/description, When enabled (default), the sensor will turn off if a free-fall is detected +/device_0/sensor_0/option/Freefall_Detection_Enabled/value, 1.000000 +/device_0/sensor_0/option/Global_Time_Enabled/description, Enable/Disable global timestamp +/device_0/sensor_0/option/Global_Time_Enabled/value, 0.000000 +/device_0/sensor_0/option/Host_Performance/description, Optimize based on host performance, low power low performance host or high power high performance host +/device_0/sensor_0/option/Host_Performance/value, 0.000000 +/device_0/sensor_0/option/Humidity_Temperature/description, Humidity temperature +/device_0/sensor_0/option/Humidity_Temperature/value, 35.964371 +/device_0/sensor_0/option/Inter_Cam_Sync_Mode/description, Enable multi-camera hardware synchronization mode (disabled on startup); not compatible with free-fall detection +/device_0/sensor_0/option/Inter_Cam_Sync_Mode/value, 0.000000 +/device_0/sensor_0/option/Invalidation_Bypass/description, Enable/disable pixel invalidation +/device_0/sensor_0/option/Invalidation_Bypass/value, 0.000000 +/device_0/sensor_0/option/LDD_temperature/description, Laser Driver temperature +/device_0/sensor_0/option/LDD_temperature/value, 41.458199 +/device_0/sensor_0/option/Laser_Power/description, Power of the laser emitter, with 0 meaning projector off +/device_0/sensor_0/option/Laser_Power/value, 100.000000 +/device_0/sensor_0/option/Ma_Temperature/description, DSP controller temperature +/device_0/sensor_0/option/Ma_Temperature/value, 35.222988 +/device_0/sensor_0/option/Mc_Temperature/description, Mems Controller temperature +/device_0/sensor_0/option/Mc_Temperature/value, 34.228119 +/device_0/sensor_0/option/Min_Distance/description, Minimal distance to the target (in mm) +/device_0/sensor_0/option/Min_Distance/value, 490.000000 +/device_0/sensor_0/option/Noise_Estimation/description, Noise estimation +/device_0/sensor_0/option/Noise_Estimation/value, 1242.000000 +/device_0/sensor_0/option/Noise_Filtering/description, Control edges and background noise +/device_0/sensor_0/option/Noise_Filtering/value, 4.000000 +/device_0/sensor_0/option/Post_Processing_Sharpening/description, Changes the amount of sharpening in the post-processed image +/device_0/sensor_0/option/Post_Processing_Sharpening/value, 1.000000 +/device_0/sensor_0/option/Pre_Processing_Sharpening/description, Changes the amount of sharpening in the pre-processed image +/device_0/sensor_0/option/Pre_Processing_Sharpening/value, 0.000000 +/device_0/sensor_0/option/Receiver_Gain/description, Changes the exposure time of Avalanche Photo Diode in the receiver +/device_0/sensor_0/option/Receiver_Gain/value, 9.000000 +/device_0/sensor_0/option/Sensor_Mode/description, Notify the sensor about the intended streaming mode. Required for preset +/device_0/sensor_0/option/Sensor_Mode/value, 2.000000 +/device_0/sensor_0/option/Visual_Preset/description, Preset to calibrate the camera to environment ambient, no ambient or low ambient. +/device_0/sensor_0/option/Visual_Preset/value, 4.000000 +/device_0/sensor_0/post_processing, Temporal Filter diff --git a/common/RealSense_Utilities/MATLAB/get_options_from_rosbag.m b/common/RealSense_Utilities/MATLAB/get_options_from_rosbag.m new file mode 100644 index 0000000..11182dd --- /dev/null +++ b/common/RealSense_Utilities/MATLAB/get_options_from_rosbag.m @@ -0,0 +1,40 @@ +bag = rosbag("C:\Users\35840\Documents\20211217_204044.bag"); +topics = bag.AvailableTopics; + +% Get only the option topics +depth_sensor_option_topics = topics(14:66,:).Properties.RowNames; +rgb_sensor_option_topics = topics(73:105,:).Properties.RowNames; +imu_sensor_option_topics = topics(117:122,:).Properties.RowNames; + +% Put options data in cells +depth_options = options_to_cell(bag, depth_sensor_option_topics) +rgb_options = options_to_cell(bag, rgb_sensor_option_topics) +imu_options = options_to_cell(bag, imu_sensor_option_topics) + +cell_to_file(depth_options, 'depth_options.txt') +cell_to_file(rgb_options, 'rgb_options.txt') +cell_to_file(imu_options, 'imu_options.txt') +function cell_to_file(cell, file_name) + file = fopen(file_name,'w') + for index = 1 : numel(cell) / 2 + disp(index) + if mod(index,2) == 0 + fprintf(file,'%s, %f\n',cell{index,1},cell{index,2}); + else + fprintf(file,'%s, %s\n',cell{index,1},cell{index,2}); + end + end + fclose(file); +end + +function options = options_to_cell(bag, topics) + for index = 1 : numel(topics) + m = readMessages(select(bag,'Topic',topics{index}),'DataFormat','struct'); + options{index,1} = topics{index}; + if mod(index,2) == 0 + options{index,2} = m{1,1}.Data; + else + options{index,2} = m{1,1}.Data; + end + end +end \ No newline at end of file diff --git a/common/RealSense_Utilities/MATLAB/imu_options.txt b/common/RealSense_Utilities/MATLAB/imu_options.txt new file mode 100644 index 0000000..81a93f1 --- /dev/null +++ b/common/RealSense_Utilities/MATLAB/imu_options.txt @@ -0,0 +1,6 @@ +/device_0/sensor_2/option/Enable_Motion_Correction/description, Enable/Disable Automatic Motion Data Correction +/device_0/sensor_2/option/Enable_Motion_Correction/value, 1.000000 +/device_0/sensor_2/option/Frames_Queue_Size/description, Max number of frames you can hold at a given time. Increasing this number will reduce frame drops but increase latency, and vice versa +/device_0/sensor_2/option/Frames_Queue_Size/value, 16.000000 +/device_0/sensor_2/option/Global_Time_Enabled/description, Enable/Disable global timestamp +/device_0/sensor_2/option/Global_Time_Enabled/value, 0.000000 diff --git a/common/RealSense_Utilities/MATLAB/rgb_options.txt b/common/RealSense_Utilities/MATLAB/rgb_options.txt new file mode 100644 index 0000000..88f1a50 --- /dev/null +++ b/common/RealSense_Utilities/MATLAB/rgb_options.txt @@ -0,0 +1,33 @@ +/device_0/sensor_1/option/Auto_Exposure_Priority/description, Restrict Auto-Exposure to enforce constant FPS rate. Turn ON to remove the restrictions (may result in FPS drop) +/device_0/sensor_1/option/Auto_Exposure_Priority/value, 1.000000 +/device_0/sensor_1/option/Backlight_Compensation/description, Enable / disable backlight compensation +/device_0/sensor_1/option/Backlight_Compensation/value, 128.000000 +/device_0/sensor_1/option/Brightness/description, UVC image brightness +/device_0/sensor_1/option/Brightness/value, 0.000000 +/device_0/sensor_1/option/Contrast/description, UVC image contrast +/device_0/sensor_1/option/Contrast/value, 50.000000 +/device_0/sensor_1/option/Enable_Auto_Exposure/description, Enable / disable auto-exposure +/device_0/sensor_1/option/Enable_Auto_Exposure/value, 1.000000 +/device_0/sensor_1/option/Enable_Auto_White_Balance/description, Enable / disable auto-white-balance +/device_0/sensor_1/option/Enable_Auto_White_Balance/value, 1.000000 +/device_0/sensor_1/option/Exposure/description, Controls exposure time of color camera. Setting any value will disable auto exposure +/device_0/sensor_1/option/Exposure/value, 156.000000 +/device_0/sensor_1/option/Frames_Queue_Size/description, Max number of frames you can hold at a given time. Increasing this number will reduce frame drops but increase latency, and vice versa +/device_0/sensor_1/option/Frames_Queue_Size/value, 16.000000 +/device_0/sensor_1/option/Gain/description, UVC image gain +/device_0/sensor_1/option/Gain/value, 256.000000 +/device_0/sensor_1/option/Global_Time_Enabled/description, Enable/Disable global timestamp +/device_0/sensor_1/option/Global_Time_Enabled/value, 0.000000 +/device_0/sensor_1/option/Host_Performance/description, Optimize based on host performance, low power low performance host or high power high performance host +/device_0/sensor_1/option/Host_Performance/value, 0.000000 +/device_0/sensor_1/option/Hue/description, UVC image hue +/device_0/sensor_1/option/Hue/value, 0.000000 +/device_0/sensor_1/option/Power_Line_Frequency/description, Power Line Frequency +/device_0/sensor_1/option/Power_Line_Frequency/value, 1.000000 +/device_0/sensor_1/option/Saturation/description, UVC image saturation setting +/device_0/sensor_1/option/Saturation/value, 50.000000 +/device_0/sensor_1/option/Sharpness/description, UVC image sharpness setting +/device_0/sensor_1/option/Sharpness/value, 50.000000 +/device_0/sensor_1/option/White_Balance/description, Controls white balance of color image. Setting any value will disable auto white balance +/device_0/sensor_1/option/White_Balance/value, 4600.000000 +/device_0/sensor_1/post_processing, Decimation Filter diff --git a/common/RealSense_Utilities/README.md b/common/RealSense_Utilities/README.md new file mode 100644 index 0000000..0e2b188 --- /dev/null +++ b/common/RealSense_Utilities/README.md @@ -0,0 +1 @@ +# RealSense_Utilities diff --git a/common/RealSense_Utilities/object_detection.py b/common/RealSense_Utilities/object_detection.py new file mode 100644 index 0000000..f6afe29 --- /dev/null +++ b/common/RealSense_Utilities/object_detection.py @@ -0,0 +1,113 @@ +'''Program is using this code with modifications: +https://github.com/IntelRealSense/librealsense/blob/jupyter/notebooks/distance_to_object.ipynb''' +# TODO: +# - +# - +# - +# - + + +import cv2 + +# Color constant for opencv +WHITE = (255, 255, 255) + +class ObjectDetect: + + def __init__(self, color_frame, depth_frame, depth_scale): + self.color_frame = color_frame + self.depth_frame = depth_frame + self.depth_scale = depth_scale + #self.color_intrinsics = color_intrin + + self.confidence: float + + # Rectangle that is drawn around the detected object + self.rectangle_xmin = None + self.rectangle_ymin = None + self.rectangle_xmax = None + self.rectangle_ymax = None + + + def detect(self): + # Standard OpenCV boilerplate for running the net: + height, width = self.color_frame.shape[:2] + expected = 300 + aspect = width / height + resized_image = cv2.resize(self.color_frame, (round(expected * aspect), expected)) + crop_start = round(expected * (aspect - 1) / 2) + crop_img = resized_image[0:expected, crop_start:crop_start+expected] + + net = cv2.dnn.readNetFromCaffe("C:\\Users\\35840\\Downloads\\MobileNetSSD\\MobileNetSSD\\MobileNetSSD_deploy.prototxt", "C:\\Users\\35840\\Downloads\\MobileNetSSD\\MobileNetSSD\\MobileNetSSD_deploy.caffemodel") + inScaleFactor = 0.007843 + meanVal = 127.53 + class_names = ("background", "aeroplane", "bicycle", "bird", "boat", + "bottle", "bus", "car", "cat", "chair", + "cow", "diningtable", "dog", "horse", + "motorbike", "person", "pottedplant", + "sheep", "sofa", "train", "tvmonitor") + #class_names = ("bottle", "chair", "diningtable", "person", "pottedplant", "tvmonitor") + blob = cv2.dnn.blobFromImage(crop_img, inScaleFactor, (expected, expected), meanVal, False) + net.setInput(blob, "data") + detections = net.forward("detection_out") + + label = detections[0,0,0,1] + conf = detections[0,0,0,2] + xmin = detections[0,0,0,3] + ymin = detections[0,0,0,4] + xmax = detections[0,0,0,5] + ymax = detections[0,0,0,6] + + class_name = class_names[int(label)] + + confidence = str(round(conf,2))[0:4] + + # cv2.rectangle(crop_img, (int(xmin * expected), int(ymin * expected)), + # (int(xmax * expected), int(ymax * expected)), (255, 255, 255), 2) + + scale = height / expected + xmin_depth = int((xmin * expected + crop_start) * scale) + ymin_depth = int((ymin * expected) * scale) + xmax_depth = int((xmax * expected + crop_start) * scale) + ymax_depth = int((ymax * expected) * scale) + + # Crop depth data: + depth = self.depth_frame[xmin_depth:xmax_depth,ymin_depth:ymax_depth].astype(float) + + # Get data scale from the device and convert to meters + depth = depth * self.depth_scale + distance,_,_,_ = cv2.mean(depth) + + # if class_name not in ["bottle", "chair", "diningtable", "person", "pottedplant", "tvmonitor"]: + # class_name = "unknown" + + self.rectangle_xmin = xmin_depth + self.rectangle_ymin = ymin_depth + self.rectangle_xmax = xmax_depth + self.rectangle_ymax = ymax_depth + self.confidence = confidence + self.class_name = class_name + self.distance = distance + + def draw_rectangle(self, image): + + # Rectangle variables + top_left_corner = (self.rectangle_xmin, self.rectangle_ymin) + bottom_right_corner = (self.rectangle_xmax, self.rectangle_ymax) + rectangle_color = WHITE + rectangle_thickness = 2 + + # Text variables + text = f'{self.class_name} {self.distance:.2f} meters away' + text_location = (self.rectangle_xmin, self.rectangle_ymin - 5) + text_font = cv2.FONT_HERSHEY_COMPLEX + text_color = WHITE + text_scale = 0.5 + + cv2.rectangle(image, + top_left_corner, bottom_right_corner, + rectangle_color, rectangle_thickness) + + cv2.putText(self.color_frame, text, + text_location, text_font, + text_scale, text_color) \ No newline at end of file diff --git a/common/RealSense_Utilities/opencv_stream.py b/common/RealSense_Utilities/opencv_stream.py new file mode 100644 index 0000000..bb5a2f5 --- /dev/null +++ b/common/RealSense_Utilities/opencv_stream.py @@ -0,0 +1,179 @@ +import cv2 +from object_detection import ObjectDetect +import math +import numpy as np + +from realsense_api import RealSenseCamera + +top = 100 +bottom = 100 +left = 100 +right = 100 + +BLUE = [255,0,0] + +ros_bag = "C:\\Users\\35840\\Documents\\20211217_204044.bag" + +def measure_dimensions(points): + + height = {'ix': points[0], + 'iy': points[2], + 'x' : points[0], + 'y' : points[3]} + + width = {'ix': points[0], + 'iy': points[2], + 'x' : points[1], + 'y' : points[2]} + + #dimensions = [height, width] + + #print(points) + global color_intrin + + # Height + udist_height = camera.depth_frame.get_distance(height['ix'],height['iy']) + vdist_height = camera.depth_frame.get_distance(height['x'], height['y']) + #print(udist,vdist) + + point1_height = rs.rs2_deproject_pixel_to_point(color_intrin, [height['ix'],height['iy']], udist_height) + point2_height = rs.rs2_deproject_pixel_to_point(color_intrin, [height['x'], height['y']], vdist_height) + #print(str(point1)+ ' ' +str(point2)) + + height = math.sqrt( + math.pow(point1_height[0] - point2_height[0], 2) + math.pow(point1_height[1] - point2_height[1],2) + + math.pow(point1_height[2] - point2_height[2], 2) + ) + + # Width + udist_width = camera.depth_frame.get_distance(width['ix'],width['iy']) + vdist_width = camera.depth_frame.get_distance(width['x'], width['y']) + #print(udist,vdist) + + point1_width = rs.rs2_deproject_pixel_to_point(color_intrin, [width['ix'],width['iy']], udist_width) + point2_width = rs.rs2_deproject_pixel_to_point(color_intrin, [width['x'], width['y']], vdist_width) + #print(str(point1)+ ' ' +str(point2)) + + width = math.sqrt( + math.pow(point1_width[0] - point2_width[0], 2) + math.pow(point1_width[1] - point2_width[1],2) + + math.pow(point1_width[2] - point2_width[2], 2) + ) + + return height, width + +# Initialize the camera +camera = RealSenseCamera(ros_bag) + +display_dimensions = False +show_filtered_distance = False +show_filtered = False +apply_filter = True + +try: + while True: + # try: + camera.get_data() # Load the object's variables with data + depth_frame = camera.depth_frame + color_frame = camera.color_frame + infrared_frame = camera.infrared_frame + color_intrin = camera.color_intrinsics + + # apply filtering to depth data + if apply_filter: + camera.filter_depth_data(enable_decimation = True, + enable_spatial = False, + enable_temporal = True, + enable_hole_filling = False) + + depth_frame = camera.processed_depth_frame + print('filters applied') + #processed_depth_image = camera.frame_to_np_array(processed_depth_frame, colorize_depth=True) + + depth_image = frame_to_np_array(depth_frame, colorize_depth=True) + color_image = frame_to_np_array(color_frame) + infrared_image = frame_to_np_array(infrared_frame) + + ########################################### + ##---------- IMAGE TO BE SHOWN ----------## + ########################################### + image_to_be_shown = depth_image + image_name = 'filtered depth' + + # cv2.imshow('color 640x480', color_image) + # cv2.imshow('depth 320x240', depth_image) + # cv2.imshow('IR 320x240', infrared_image) + a = cv2.resize(image_to_be_shown, (640, 480)) + cv2.imshow(image_name, a) + + + # size = cv2.getWindowImageRect('color 640x480') + # print(size) + + # ret, depth_frame, color_frame, colorized_depth, color_intrin, filtered_depth_colored, filtered_depth = camera.get_frame() + # nn = ObjectDetect(color_frame, colorized_depth, depth_frame, camera.depth_scale, filtered_depth_colored, filtered_depth) + #crop_img, depth_img, text, text_filt, text_location, points, confidence = nn.detect() + + #cv2.namedWindow('Both Streams', cv2.WINDOW_NORMAL) + #cv2.setWindowProperty('Both Strams', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) + #bordered = cv2.copyMakeBorder(stretched, top, bottom, left, right, cv2.BORDER_CONSTANT, value=BLUE) + + # if show_filtered_distance: + # cv2.putText(color_frame, text_filt, text_location, + # cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255)) + # else: + # print(confidence) + # cv2.putText(color_frame, text, text_location, + # cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255)) + # cv2.putText(colorized_depth, text, text_location, + # cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255)) + + # if display_dimensions: + # height, width = measure_dimensions(points) + # print(height, width) + + # if height != 0.0 or width != 0.0: + # width = f'width = {str(round(width, 3))} meters' + # height = f'height = {str(round(height, 3))} meters' + # text_height_location = (points[1], (int((points[3] + points[2]) / 2))) + # text_width_location = (points[0], points[3] + 20) + # cv2.putText(color_frame, height, text_height_location, + # cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255)) + # cv2.putText(color_frame, width, text_width_location, + # cv2.FONT_HERSHEY_COMPLEX, 0.5, (255,255,255)) + + #images = np.hstack((color_frame, colorized_depth)) + #images_filtered = np.hstack((color_frame, filtered_depth_colored)) + #stretched = cv2.resize(images, (2560, 1440)) + + #cv2.imshow("Filtered", images_filtered) + + if show_filtered: + cv2.imshow('Filtered', filtered_depth_colored) + key = cv2.waitKey(1) + + # Press esc or 'q' to close the image window + if key & 0xFF == ord('q') or key == 27: + cv2.destroyAllWindows() + break + elif key & 0xFF == ord('m'): #enable dimensions measurements + display_dimensions = True + elif key & 0xFF == ord('o'): #turn off dimensions measurements + display_dimensions = False + elif key & 0xFF == ord('f'): + show_filtered_distance = True + elif key & 0xFF == ord('g'): + show_filtered_distance = False + elif key & 0xFF == ord('a'): + show_filtered = True + elif key & 0xFF == ord('s'): + show_filtered = False + cv2.destroyWindow('Filtered') + # elif key & 0xFF == ord('v'): + # camera.spatial_magnitude = + + # except RuntimeError as e: + # print(f'{(e).__class__.__name__}: {e}') #error message + # continue + +finally: + camera.stop() \ No newline at end of file diff --git a/common/RealSense_Utilities/opencv_stream_test.py b/common/RealSense_Utilities/opencv_stream_test.py new file mode 100644 index 0000000..a57f411 --- /dev/null +++ b/common/RealSense_Utilities/opencv_stream_test.py @@ -0,0 +1,59 @@ +import numpy as np # fundamental package for scientific computing +import matplotlib.pyplot as plt # 2D plotting library producing publication quality figures +import pyrealsense2 as rs # Intel RealSense cross-platform open-source API +print("Environment Ready") +import cv2 + +# Setup: +pipe = rs.pipeline() +cfg = rs.config() +cfg.enable_device_from_file("C:\\Users\\35840\\Documents\\20211217_204044.bag") +profile = pipe.start(cfg) + +try: + while True: + # decimate = rs.decimation_filter(8) + # align_to = rs.stream.color + # align = rs.align(align_to) + + # # Get frameset of color and depth + # frames = pipeline.wait_for_frames() + # decimated = decimate.process(frames).as_frameset() + # # Align the depth frame to color frame + # aligned_frames = align.process(decimated) + frameset = pipe.wait_for_frames() + frame = frameset.get_depth_frame() + + depth_to_disparity = rs.disparity_transform(True) + disparity_to_depth = rs.disparity_transform(False) + + colorizer = rs.colorizer() + spatial = rs.spatial_filter() + spatial.set_option(rs.option.holes_fill, 3) + + temporal = rs.temporal_filter(0.4,40,8) + hole_filling = rs.hole_filling_filter() + + # frame = depth_to_disparity.process(frame) + # frame = spatial.process(frame) + frame = temporal.process(frameset).as_frameset() + # frame = frame.get_depth_frame() + + # frame = disparity_to_depth.process(frame) + # frame = hole_filling.process(frame) + align = rs.align(rs.stream.color) + frame = align.process(frame) + frame = frame.get_depth_frame() + colorized_depth = np.asanyarray(colorizer.colorize(frame).get_data()) + + cv2.imshow('o', colorized_depth) + + key = cv2.waitKey(1) + + # Press esc or 'q' to close the image window + if key & 0xFF == ord('q') or key == 27: + cv2.destroyAllWindows() + break + +finally: + pipe.stop() diff --git a/common/RealSense_Utilities/opencv_stream_v2.py b/common/RealSense_Utilities/opencv_stream_v2.py new file mode 100644 index 0000000..701e100 --- /dev/null +++ b/common/RealSense_Utilities/opencv_stream_v2.py @@ -0,0 +1,99 @@ +from object_detection import ObjectDetect +import cv2 +from realsense_api import RealSenseCamera + +# TODO: +# - Restore the object detection functionality +# - Create a dictionary to hold multiple rosbag file paths that can be the +# key while the value can be a camera instantiation. This would be for +# when we want to view multiple rosbags at the same time. +# - Add the ability to change filter values using key presses while viewing +# the opencv Stream +# - Add the ability to save the current filter configuration to a text file +# or json + +#ros_bag = "C:\\Users\\35840\\Documents\\20211217_204044.bag" +# ros_bag = "C:\\Users\\35840\\Documents\\20211220_124541.bag" +ros_bag = "C:\\Users\\35840\\Documents\\20211220_132508.bag" +ros_bag2 = "C:\\Users\\35840\\Documents\\20211221_120843_2d.bag" +ros_bag3 = "C:\\Users\\35840\\Documents\\20211221_121055_3d.bag" + +# Initialize the camera +# camera = RealSenseCamera(ros_bag2) +# camera2 = RealSenseCamera(ros_bag3) +camera = RealSenseCamera() + + +apply_filter = True + +try: + while True: + camera.get_data() # Load the object's variables with data + # camera2.get_data() # Load the object's variables with data + + # apply filtering to depth data + if apply_filter: + camera.filter_depth_data(enable_decimation=True, + enable_spatial=True, + enable_temporal=True, + enable_hole_filling=True) + filtered_frameset = camera.filtered_frameset + + # camera2.filter_depth_data(enable_decimation=True, + # enable_spatial=True, + # enable_temporal=True, + # enable_hole_filling=False) + # filtered_depth_frame2 = camera2.filtered_frameset.get_depth_frame() + + camera.get_aligned_frames(filtered_frameset, aligned_to_color=True) + + #depth_frame = camera.depth_frame + filtered_depth_frame = camera.depth_frame_aligned + + color_frame = camera.color_frame_aligned + # infrared_frame = camera.infrared_frame + # color_intrin = camera.color_intrinsics + + # depth_frame = camera.depth_frame + # color_frame = camera.color_frame + # infrared_frame = camera.infrared_frame + # color_intrin = camera.color_intrinsics + + # depth_frame2 = camera2.depth_frame + # color_frame2 = camera2.color_frame + # infrared_frame2 = camera2.infrared_frame + # color_intrin2 = camera2.color_intrinsics + + color_img = frame_to_np_array(color_frame) + colored_depth_image = frame_to_np_array(filtered_depth_frame, colorize_depth=True) + depth_image = frame_to_np_array(filtered_depth_frame) + + #depth_image = camera.frame_to_np_array(depth_frame, colorize_depth=True) + + detector = ObjectDetect(color_img, depth_image, camera.depth_scale) + detector.detect() + detector.draw_rectangle(color_img) + + image_name = 'filtered depth' + # proc_depth_image2 = camera2.frame_to_np_array(filtered_depth_frame2, colorize_depth=True) + + # depth_image2 = camera2.frame_to_np_array(depth_frame2, colorize_depth=True) + + # img2 = proc_depth_image2 + # image_name2 = 'filtered depth2' + #img = cv2.resize(image_to_be_shown, (640, 480)) + #depth_image = cv2.resize(depth_image, (640, 480)) + + cv2.imshow(image_name, colored_depth_image) + #cv2.imshow('o', depth_image) + # cv2.imshow(image_name2, img2) + cv2.imshow('o2', color_img) + key = cv2.waitKey(1) + + # Press esc or 'q' to close the image window + if key & 0xFF == ord('q') or key == 27: + cv2.destroyAllWindows() + break + +finally: + camera.stop() \ No newline at end of file diff --git a/common/RealSense_Utilities/opencv_stream_v3.py b/common/RealSense_Utilities/opencv_stream_v3.py new file mode 100644 index 0000000..adf8894 --- /dev/null +++ b/common/RealSense_Utilities/opencv_stream_v3.py @@ -0,0 +1,80 @@ +import cv2 +import pyrealsense2 as rs +from RealSense_Utilities.realsense_api.realsense_api import RealSenseCamera +from RealSense_Utilities.realsense_api.realsense_api import find_realsense +from RealSense_Utilities.realsense_api.realsense_api import frame_to_np_array +from RealSense_Utilities.realsense_api.post_processing.option import OptionType + +# TODO: +# - Create a dictionary to hold multiple rosbag file paths that can be the +# key while the value can be a camera instantiation. This would be for +# when we want to view multiple rosbags at the same time. +# - Add the ability to change filter values using key presses while viewing +# the opencv Stream +# - Add the ability to save the current filter configuration to a text file +# or json + + +# Initialize the camera +cameras = [] +realsense_device = find_realsense() + +for i in realsense_device: + cameras.append(RealSenseCamera(device=i, adv_mode_flag=True)) + +apply_filter = False +apply_align = True + +try: + while True: + # Get the frameset and other data to be loaded into the class attributes + for i in range(len(cameras)): + cameras[i].get_data() + + if apply_filter: + cameras[i].filter_depth_data(enable_decimation=False, + enable_spatial=True, + enable_temporal=True, + enable_hole_filling=False) + frameset = cameras[i].filtered_frameset + else: + frameset = cameras[i].frameset + + # filtering block + # frameset = cameras[i].decimation_filter.process(frameset).as_frameset() + frameset = cameras[i].depth_to_disparity.process(frameset).as_frameset() + frameset = cameras[i].spatial_filter.process(frameset).as_frameset() + frameset = cameras[i].temporal_filter.process(frameset).as_frameset() + frameset = cameras[i].disparity_to_depth.process(frameset).as_frameset() + # frameset = cameras[i].hole_filling_filter.process(frameset).as_frameset() + + if apply_align: + cameras[i].get_aligned_frames(frameset, aligned_to_color=True) + depth_frame = cameras[i].depth_frame_aligned + color_frame = cameras[i].color_frame_aligned + else: + depth_frame = frameset.get_depth_frame() + color_frame = frameset.get_color_frame() + + cameras[i].color_image = frame_to_np_array(color_frame) + cameras[i].colored_depthmap = frame_to_np_array(depth_frame, colorize_depth=True) + cameras[i].depth_image = frame_to_np_array(depth_frame) + + # Show image + for i in cameras: + image_name = '{}_filtered depth'.format(i.device.get_info(rs.camera_info.serial_number)) + cv2.imshow(image_name, i.colored_depthmap) + + key = cv2.waitKey(1) + + # Press esc or 'q' to close the image window + if key & 0xFF == ord('q') or key == 27: + cv2.destroyAllWindows() + break + + # if key & 0xFF == ord('d'): + # decimation_magnitude = cameras[0].decimation.options[OptionType.MAGNITUDE] + # cameras[0].decimation.increment(decimation_magnitude) +finally: + for i in cameras: + i.stop() diff --git a/common/RealSense_Utilities/realsense_api/__init__.py b/common/RealSense_Utilities/realsense_api/__init__.py new file mode 100644 index 0000000..56acdb5 --- /dev/null +++ b/common/RealSense_Utilities/realsense_api/__init__.py @@ -0,0 +1 @@ +__all__ = ['realsense_api'] diff --git a/common/RealSense_Utilities/realsense_api/__pycache__/__init__.cpython-38.pyc b/common/RealSense_Utilities/realsense_api/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9976041473e08616501b3fd5656998a5624267c GIT binary patch literal 206 zcmWIL<>g`kf-1-I6j>ns7{oyaj6jY95Ep}#r7)y3Mlqx?1~X_fMe!D;Cgv2U<`t*L zCl+M-X)@kokB?8x$%&6&$xy@uR1GG6ML1i<6jUZ>Bo^hy7Zl}Zr6!le6qgpIXC^1+ z#Fymf=ftO^mH-7a^YdbYfF=fmO$;r`%*iatOf8NTZl OX-=vg$c>+Ym;nHc(>lih literal 0 HcmV?d00001 diff --git a/common/RealSense_Utilities/realsense_api/__pycache__/realsense_api.cpython-38.pyc b/common/RealSense_Utilities/realsense_api/__pycache__/realsense_api.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b52f02c7067480e652f723b7da12bfbe18559b5 GIT binary patch literal 7455 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 literal 0 HcmV?d00001 diff --git a/src/handpose_pkg/handpose_pkg/d405.json b/common/RealSense_Utilities/realsense_api/d405.json similarity index 94% rename from src/handpose_pkg/handpose_pkg/d405.json rename to common/RealSense_Utilities/realsense_api/d405.json index 2667648..4df7aa4 100644 --- a/src/handpose_pkg/handpose_pkg/d405.json +++ b/common/RealSense_Utilities/realsense_api/d405.json @@ -21,8 +21,8 @@ "aux-param-depthclampmax": "65536", "aux-param-depthclampmin": "0", "aux-param-disparityshift": "0", - "controls-autoexposure-auto": "False", - "controls-autoexposure-manual": "8500", + "controls-autoexposure-auto": "True", + "controls-autoexposure-manual": "33000", "controls-depth-gain": "16", "controls-depth-white-balance-auto": "True", "ignoreSAD": "0", @@ -34,7 +34,7 @@ "param-censusvsize": "9", "param-depthclampmax": "65536", "param-depthclampmin": "0", - "param-depthunits": "1000", + "param-depthunits": "100", "param-disableraucolor": "0", "param-disablesadcolor": "0", "param-disablesadnormalize": "0", @@ -78,13 +78,13 @@ "param-texturecountthresh": "0", "param-texturedifferencethresh": "0", "param-usersm": "1", - "param-zunits": "1000" + "param-zunits": "100" }, "schema version": 1, "viewer": { "stream-depth-format": "Z16", "stream-fps": "30", "stream-height": "480", - "stream-width": "848" + "stream-width": "640" } } \ No newline at end of file diff --git a/src/handpose_pkg/handpose_pkg/d455_0321.json b/common/RealSense_Utilities/realsense_api/d455.json similarity index 100% rename from src/handpose_pkg/handpose_pkg/d455_0321.json rename to common/RealSense_Utilities/realsense_api/d455.json diff --git a/common/RealSense_Utilities/realsense_api/post_processing/__pycache__/option.cpython-38.pyc b/common/RealSense_Utilities/realsense_api/post_processing/__pycache__/option.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1474fad70ff337c103c30c12ed34184d626db8cc GIT binary patch literal 1251 zcmZWo%We}f6dlhilVsYaAc4e7Y{Q}-fGX6Gq-~^hQZ*@pQ6$S9yX~NP1ls}9ZTcDg z0e;C_R{R1hu03f;!6RS$T-*0?=HBzIt%e2Trt^*7*_QQFgU#UrIDjb%5Y(b5vvL$8 zr1y4a=T7XHy_31Q7kjxM`v$vNEf3-#ug7&{9a+?){;frQ<}IDL!5q-kXaJgEX)jUS z1YD;Lzzr6_jgU6SRy+I!KCL!V^~qw!XfI8q29!vWWJHLzt=xVw&y`E&vIOLG-gnhD zxe$_*MCMFhmo(8fHU|Q508_jH!K@fjE4G=lv|`st&q&|MnvnrT5RI)GqnS+0LI)GI z>ngywAUVTWH89RgI?wbz#Q4jcWYr1xz=x`zbdI9Ix0u6RiuSA3Uaih*b@!n-fL>pP6}=xw zHfKVGRSfv6hU&>C!fBCkma{^t)=HnJ#p>o-L%vs|Io$t|2G-)R}Zb5ax^SGgM$~^xDG5pHsV?nwYQWn7c(d+ zuD!<1b?-94b+ss$K?8IBs_GSoTqNAr(0J9PSFW|ajl|ZjRj^<6-aAc>*ai`z5VcUt KX$3ZFg?|8)l5Z}E&{ueuSN=VZtNK}-95%McgA(D`|Nu=~r#SUsMODl7`mvUb!bEB#n0_;gd5y^Lbxf+ug$szvc+wXZ7tg% zr+6CVw3bsKXLuImtd`R}S0$x|Ay_9RGs+)!L$A~RsOk5FigK}3JMD_7aNqMoA!Chl zar|U6LD+<@-U1>>opMq)IOWDO%1v%PvFfIaM#JsjEMIhQ?R7~`N*G@)`HO;SLP05nzag=?qwd?HHj&~{&7mL#IR0SSb zO8B1)h+GE!AFb_sjqa)YX;TKQD?2B`4I8Q_Tb|qWS=j0LjEfMI5QN5&X!=#rR)QUe zp6`X8Pz?z>rFG4&*XVXsh-O@&l-F)Gl10ni(3=H`a@~cQNOfh*GxF|b54jiIVKnN|;JngSt-2Qm%AcX;FHv_>~ zlw&OD@Scx+p0Uq+O+Wr3SHPG)FNr9cSXyra*OxXB1dYN3%+ST0*0>-{H4MlmbcF$V zF6?bc0!+el&@WcIfcU0=sPU*Ai4I->JBCY#`v{l`umjY&{nP@D3GfHYn9_;HN)qCH zj13wyP7oa9S&$+rogz6$qK^`>B6Xgi+j0R&3p%tPHxlOijbCC7Aqn%_Mk%e6KqAUw z_~)w+4i9U4Z0q3R-c~e{b}9!okoFD_D(wFL!NI<>E0=K2btKaVug~Tc(5rhuX0V%@ zLh@zOul*a-5gtRlL^a<29cas&=)o-{Ye;5%L3F(beGhFBnDbaE6;6g6V;Ln#$w@O9MU6(#QiiIyH#j;j0BTE*FZ%=Vp~ z%A?B>r`>uRW?lhtzxP*X;x-1EyaAT}Gl)Hg#U>$kb9P%VfHAzkK14goeYYY}<3gWm z82nA>S1+)MK4fgeUOqFU;P{1{5QG) literal 0 HcmV?d00001 diff --git a/common/RealSense_Utilities/realsense_api/post_processing/decimation.py b/common/RealSense_Utilities/realsense_api/post_processing/decimation.py new file mode 100644 index 0000000..0984414 --- /dev/null +++ b/common/RealSense_Utilities/realsense_api/post_processing/decimation.py @@ -0,0 +1,19 @@ +# https://dev.intelrealsense.com/docs/post-processing-filters +from option import OptionValues, OptionType, FilterOptions + + +class DecimationOptions(FilterOptions): + def __init__(self) -> None: + self.options: OptionDict = { + OptionType.MAGNITUDE: OptionValues( + option_value=2, + option_value_increment=1, + option_min_value=1, + option_max_value=8 + ) + } + + def increment(self, option: OptionValues) -> None: + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value diff --git a/common/RealSense_Utilities/realsense_api/post_processing/hole_filling.py b/common/RealSense_Utilities/realsense_api/post_processing/hole_filling.py new file mode 100644 index 0000000..7de60fa --- /dev/null +++ b/common/RealSense_Utilities/realsense_api/post_processing/hole_filling.py @@ -0,0 +1,19 @@ +# https://dev.intelrealsense.com/docs/post-processing-filters +from option import OptionValues, OptionType, FilterOptions + + +class HoleFillingOptions(FilterOptions): + def __init__(self) -> None: + self.options: OptionDict = { + OptionType.MAGNITUDE: OptionValues( + option_value=1, + option_value_increment=1, + option_min_value=0, + option_max_value=2 + ) + } + + def increment(self, option: OptionValues) -> None: + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value diff --git a/common/RealSense_Utilities/realsense_api/post_processing/option.py b/common/RealSense_Utilities/realsense_api/post_processing/option.py new file mode 100644 index 0000000..73aa770 --- /dev/null +++ b/common/RealSense_Utilities/realsense_api/post_processing/option.py @@ -0,0 +1,31 @@ +from typing import TypedDict +from dataclasses import dataclass +from enum import Enum, auto +from abc import ABC, abstractmethod + + +class OptionType(Enum): + MAGNITUDE = auto() + SMOOTH_ALPHA = auto() + SMOOTH_DELTA = auto() + HOLE_FILLING = auto() + PERSISTENCY_INDEX = auto() + + +@dataclass +class OptionValues: + option_value: float + option_value_increment: float + option_min_value: float + option_max_value: float + + +# class OptionDict(TypedDict): +# option: OptionType +# properties: OptionValues + + +class FilterOptions(ABC): + @abstractmethod + def increment(self, option: OptionValues) -> None: + pass diff --git a/common/RealSense_Utilities/realsense_api/post_processing/options.py b/common/RealSense_Utilities/realsense_api/post_processing/options.py new file mode 100644 index 0000000..219759b --- /dev/null +++ b/common/RealSense_Utilities/realsense_api/post_processing/options.py @@ -0,0 +1,112 @@ +# https://dev.intelrealsense.com/docs/post-processing-filters +from RealSense_Utilities.realsense_api.post_processing.option import OptionValues, OptionType, FilterOptions + + +############################################################# +# -------------------- DECIMATION OPTIONS -------------------# +############################################################# +class DecimationOptions(FilterOptions): + def __init__(self) -> None: + self.options: dict = { + OptionType.MAGNITUDE: OptionValues( + option_value=2, + option_value_increment=1, + option_min_value=1, + option_max_value=8 + ) + } + + def increment(self, option: OptionValues) -> None: + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value + + +############################################################# +# --------------------- SPATIAL OPTIONS ---------------------# +############################################################# +class SpatialOptions(FilterOptions): + def __init__(self) -> None: + self.options: dict = { + OptionType.MAGNITUDE: OptionValues( + option_value=2, + option_value_increment=1, + option_min_value=0, + option_max_value=5 + ), + OptionType.SMOOTH_ALPHA: OptionValues( + option_value=0.5, + option_value_increment=0.25, + option_min_value=0.0, + option_max_value=1.0 + ), + OptionType.SMOOTH_DELTA: OptionValues( + option_value=2, + option_value_increment=1, + option_min_value=0, + option_max_value=5 + ), + OptionType.HOLE_FILLING: OptionValues( + option_value=0, + option_value_increment=1, + option_min_value=0, + option_max_value=5 + ) + } + + def increment(self, option: OptionValues): + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value + + +############################################################# +# --------------------- TEMPORAL OPTIONS --------------------# +############################################################# +class TemporalOptions(FilterOptions): + def __init__(self) -> None: + self.options: dict = { + OptionType.SMOOTH_ALPHA: OptionValues( + option_value=0.4, + option_value_increment=0.1, + option_min_value=0.0, + option_max_value=1.0 + ), + OptionType.SMOOTH_DELTA: OptionValues( + option_value=20, + option_value_increment=10, + option_min_value=0, + option_max_value=100 + ), + OptionType.PERSISTENCY_INDEX: OptionValues( + option_value=3, + option_value_increment=1, + option_min_value=0, + option_max_value=8 + ) + } + + def increment(self, option: OptionValues) -> None: + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value + + +############################################################# +# ------------------- HOLE FILLING OPTIONS ------------------# +############################################################# +class HoleFillingOptions(FilterOptions): + def __init__(self) -> None: + self.options: dict = { + OptionType.HOLE_FILLING: OptionValues( + option_value=1, + option_value_increment=1, + option_min_value=0, + option_max_value=2 + ) + } + + def increment(self, option: OptionValues) -> None: + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value diff --git a/common/RealSense_Utilities/realsense_api/post_processing/spatial.py b/common/RealSense_Utilities/realsense_api/post_processing/spatial.py new file mode 100644 index 0000000..b6f73d3 --- /dev/null +++ b/common/RealSense_Utilities/realsense_api/post_processing/spatial.py @@ -0,0 +1,64 @@ +# https://dev.intelrealsense.com/docs/post-processing-filters +from dataclasses import asdict, dataclass, field +from option import OptionValues, OptionType, OptionDict, FilterOptions + + +class SpatialOptions(FilterOptions): + def __init__(self) -> None: + self.options: OptionDict = { + OptionType.MAGNITUDE: OptionValues( + option_value=2, + option_value_increment=1, + option_min_value=0, + option_max_value=5 + ), + OptionType.SMOOTH_ALPHA: OptionValues( + option_value=0.5, + option_value_increment=0.25, + option_min_value=0.0, + option_max_value=1.0 + ), + OptionType.SMOOTH_DELTA: OptionValues( + option_value=2, + option_value_increment=1, + option_min_value=0, + option_max_value=5 + ), + OptionType.HOLE_FILLING: OptionValues( + option_value=0, + option_value_increment=1, + option_min_value=0, + option_max_value=5 + ) + } + + def increment(self, option: OptionValues): + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value + +# spatial_filter = SpatialOptions() +# spatial_filter2 = SpatialOptions() + +# # # spatial_options = asdict(spatial_filter.options) +# spatial_filter.options[OptionType.SMOOTH_ALPHA].option_value_increment = 0.1 +# spatial_filter2.options[OptionType.SMOOTH_ALPHA].option_value_increment = 0.25 + +# spatial_filter_hole_filling = spatial_filter.options[OptionType.SMOOTH_ALPHA] +# spatial_filter_hole_filling2 = spatial_filter2.options[OptionType.SMOOTH_ALPHA] + +# for i in range(20): +# print(f'{spatial_filter_hole_filling.option_value} {spatial_filter_hole_filling2.option_value}') +# spatial_filter.increment(spatial_filter_hole_filling) +# spatial_filter2.increment(spatial_filter_hole_filling2) + +# print(type(spatial_filter)) +# for i,v in spatial_options.items(): +# print(i,v) + +# =a.hole_filling +# print(o.option_value) +# for i in range(7): +# a.increment(o) +# for i in spatial_filter.options: +# print(i) diff --git a/common/RealSense_Utilities/realsense_api/post_processing/temporal.py b/common/RealSense_Utilities/realsense_api/post_processing/temporal.py new file mode 100644 index 0000000..c6ae54c --- /dev/null +++ b/common/RealSense_Utilities/realsense_api/post_processing/temporal.py @@ -0,0 +1,31 @@ +# https://dev.intelrealsense.com/docs/post-processing-filters +from option import OptionValues, OptionType, OptionDict, FilterOptions + + +class TemporalOptions(FilterOptions): + def __init__(self) -> None: + self.options: OptionDict = { + OptionType.SMOOTH_ALPHA: OptionValues( + option_value=0.4, + option_value_increment=0.1, + option_min_value=0.0, + option_max_value=1.0 + ), + OptionType.SMOOTH_DELTA: OptionValues( + option_value=20, + option_value_increment=10, + option_min_value=0, + option_max_value=100 + ), + OptionType.HOLE_FILLING: OptionValues( + option_value=3, + option_value_increment=1, + option_min_value=0, + option_max_value=8 + ) + } + + def increment(self, option: OptionValues) -> None: + option.option_value += option.option_value_increment + if option.option_value > option.option_max_value: + option.option_value = option.option_min_value diff --git a/common/RealSense_Utilities/realsense_api/realsense_api.py b/common/RealSense_Utilities/realsense_api/realsense_api.py new file mode 100644 index 0000000..1aa8ee0 --- /dev/null +++ b/common/RealSense_Utilities/realsense_api/realsense_api.py @@ -0,0 +1,355 @@ +import numpy as np +import pyrealsense2 as rs +import json +import cv2 +from threading import Thread +from multiprocessing.pool import ThreadPool +# from realsense_api.post_processing.option import OptionType +from RealSense_Utilities.realsense_api.post_processing.options import \ + DecimationOptions, SpatialOptions, TemporalOptions, HoleFillingOptions, OptionType + +import os, sys + +# TODO: +# - Create a method for loading the json options that are generated by the realsense viewer +# - Create a method for displaying the options that are currently set +# - Add any remaining stream types into the get data method such as confidence +# - Add any other post processing filters that are missing + +# Links that I thought would be useful later: +# https://intelrealsense.github.io/librealsense/python_docs/_generated/pyrealsense2.threshold_filter.html?highlight=process +# https://github.com/IntelRealSense/librealsense/issues/6902 +# https://github.com/IntelRealSense/librealsense/issues/10078 + +def frame_to_np_array(frame, colorize_depth=False): + # Create colorized depth frame + if colorize_depth: + colorizer = rs.colorizer() + frame_as_image = np.asanyarray(colorizer.colorize(frame).get_data()) + return frame_as_image + frame_as_image = np.asanyarray(frame.get_data()) + return frame_as_image + + +def find_realsense(): + realsense_ctx = rs.context() + connected_devices = [] + serial_number = [] + for i in range(len(realsense_ctx.devices)): + detected_camera = realsense_ctx.devices[i] + connected_devices.append(detected_camera) + serial_number.append(detected_camera.get_info(rs.camera_info.serial_number)) + + return zip(serial_number, connected_devices) + + +def mediapipe_detection(image, model): + image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # COLOR CONVERSION BGR 2 RGB + image.flags.writeable = False # Image is no longer writeable + results = model.process(image) # Make prediction + image.flags.writeable = True # Image is now writeable + image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # COLOR CONVERSION RGB 2 BGR + return image, results + + +class RealSenseCamera: + def __init__(self, + depth_stream_width=848, depth_stream_height=480, + color_stream_width=640, color_stream_height=480, + depth_stream_fps=90, color_stream_fps=60, + device=None, adv_mode_flag=False, device_type='d455', + mp_lock=None, disable_color_auto_exposure=False): + + self.device = device + self.device_type = device_type + + self.current_timestamp = 0 + + self.colored_depthmap = None + self.color_image = None + self.depth_image = None + + # Resolution attributes + self.depth_stream_width = depth_stream_width + self.depth_stream_height = depth_stream_height + self.color_stream_width = color_stream_width + self.color_stream_height = color_stream_height + + self.depth_stream_fps = depth_stream_fps + self.color_stream_fps = color_stream_fps + + # Data attributes that will be set with get_data() + self.frameset = None + self.depth_frame = None + self.color_frame = None + self.infrared_frame = None + self.color_intrinsics = None + self.depth_intrinsics = None + self.depth_scale = None + self.camera_matrix = None + self.dist_coeffs = None + + # Holds the frameset after it has undergone filtering + self.filtered_frameset = None + + # Aligned frame holders + self.depth_frame_aligned = None + self.color_frame_aligned = None + + # Post Processing Filter attributes with default values + # https://dev.intelrealsense.com/docs/post-processing-filters + + self.decimation: DecimationOptions = DecimationOptions() + self.spatial: SpatialOptions = SpatialOptions() + self.temporal: TemporalOptions = TemporalOptions() + self.hole_filling: HoleFillingOptions = HoleFillingOptions() + + # Decimation filter attribute + self.decimation_magnitude = 3 + + # Spatial filter attributes + self.spatial_magnitude = 2 + self.spatial_smooth_alpha = 0.4 + self.spatial_smooth_delta = 4 + self.spatial_holes_fill = 0 + + # Temporal filter attributes + self.temporal_smooth_alpha = 0.1 + self.temporal_smooth_delta = 20 + self.persistency_index = 5 + + # Holes Filling filter attribute + self.hole_filling_param = 1 + + self.decimation_filter = rs.decimation_filter() + self.decimation_filter.set_option( + rs.option.filter_magnitude, + self.decimation_magnitude + ) + + self.spatial_filter = rs.spatial_filter() + self.spatial_filter.set_option( + rs.option.filter_magnitude, + self.spatial_magnitude + ) + self.spatial_filter.set_option( + rs.option.filter_smooth_alpha, + self.spatial_smooth_alpha + ) + self.spatial_filter.set_option( + rs.option.filter_smooth_delta, + self.spatial_smooth_delta + ) + self.spatial_filter.set_option( + rs.option.holes_fill, + self.spatial_holes_fill + ) + + self.temporal_filter = rs.temporal_filter() + self.temporal_filter.set_option( + rs.option.filter_smooth_alpha, + self.temporal_smooth_alpha + ) + self.temporal_filter.set_option( + rs.option.filter_smooth_delta, + self.temporal_smooth_delta + ) + self.temporal_filter.set_option( + rs.option.holes_fill, + self.persistency_index + ) + + self.hole_filling_filter = rs.hole_filling_filter() + self.hole_filling_filter.set_option( + rs.option.holes_fill, + self.hole_filling_param + ) + + self.depth_to_disparity = rs.disparity_transform(True) + self.disparity_to_depth = rs.disparity_transform(False) + + # json profile + script_dir = os.path.dirname(os.path.abspath(__file__)) + if self.device_type == 'd455': + config_file_path = os.path.join(script_dir, 'd455.json') + self.jsonObj = json.load(open(config_file_path)) + # self.jsonObj = json.load(open("./d455.json")) + elif self.device_type == 'd405': + config_file_path = os.path.join(script_dir, 'd405.json') + self.jsonObj = json.load(open(config_file_path)) + # self.jsonObj = json.load(open("./d405_0321.json")) + elif self.device_type == 'd415': + self.jsonObj = json.load(open("./d415_0131.json")) + + print(f"{self.device_type} is selected...") + + self.pipeline = rs.pipeline() + config = rs.config() + config.enable_device(self.device.get_info(rs.camera_info.serial_number)) + + config.enable_stream(rs.stream.depth, + self.depth_stream_width, self.depth_stream_height, + rs.format.z16, self.depth_stream_fps) + + config.enable_stream(rs.stream.color, + self.color_stream_width, self.color_stream_height, + rs.format.bgr8, self.color_stream_fps) + + config.enable_stream(rs.stream.infrared, + rs.format.y8, + self.depth_stream_fps) + + self.profile = self.pipeline.start(config) + + self.sensor = self.device.query_sensors() + + self.mp_lock = mp_lock + + # Get depth scale + depth_sensor = self.profile.get_device().first_depth_sensor() + depth_sensor.set_option(rs.option.emitter_enabled, 1) + self.depth_scale = depth_sensor.get_depth_scale() + + self.color_intrinsics = self.profile.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() + self.depth_intrinsics = self.profile.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() + self.camera_matrix = np.array( + [[self.color_intrinsics.fx, 0, self.color_intrinsics.ppx], + [0, self.color_intrinsics.fy, self.color_intrinsics.ppy], + [0, 0, 1]], + dtype=np.float64) + self.dist_coeffs = np.array([self.color_intrinsics.coeffs], dtype=np.float64) + + if adv_mode_flag: + self.adv_mode() + + if disable_color_auto_exposure: + color_sensor = self.sensor[1] + color_sensor.set_option(rs.option.auto_exposure_priority, 0) + color_sensor.set_option(rs.option.enable_auto_exposure, 0) + + def __iter__(self): + return self.device.get_info(rs.camera_info.serial_number) + + def __del__(self): + # self.stop() + pass + + # def get_options(self): + def get_data(self): + if self.mp_lock is not None: + self.mp_lock.acquire() + + frameset = self.pipeline.wait_for_frames() + try: + self.current_timestamp = frameset.get_timestamp() + # self.frameset.keep() + self.depth_frame = frameset.get_depth_frame() + self.color_frame = frameset.get_color_frame() + self.infrared_frame = frameset.first(rs.stream.infrared) + + self.frameset = frameset + + except RuntimeError as e: + print(str(self.device.get_info(rs.camera_info.serial_number)) + " camera can't polling frame") + + if self.mp_lock is not None: + self.mp_lock.release() + + def get_aligned_frames(self, frameset, aligned_to_color=False, aligned_to_depth=False): + if aligned_to_color: + align_to = rs.stream.color + align = rs.align(align_to) + frameset = align.process(frameset) + + if aligned_to_depth: + align_to = rs.stream.depth + align = rs.align(align_to) + frameset = align.process(frameset) + + self.depth_frame_aligned = frameset.get_depth_frame() + self.color_frame_aligned = frameset.get_color_frame() + self.frameset = frameset + + def filter_depth_data(self, + enable_decimation=False, + enable_spatial=False, + enable_temporal=False, + enable_hole_filling=False): + + """Apply a cascade of filters on the depth frame""" + depth_to_disparity = rs.disparity_transform(True) + disparity_to_depth = rs.disparity_transform(False) + + frameset = self.frameset + # DECIMATION FILTER + if enable_decimation: + decimation = rs.decimation_filter() + decimation.set_option( + rs.option.filter_magnitude, + self.decimation.options[OptionType.MAGNITUDE].option_value + ) + frameset = decimation.process(frameset).as_frameset() + + # depth to disparity + frameset = depth_to_disparity.process(frameset).as_frameset() + + # SPATIAL FILTER + if enable_spatial: + spatial = rs.spatial_filter() + spatial.set_option( + rs.option.filter_magnitude, + self.spatial.options[OptionType.MAGNITUDE].option_value + ) + spatial.set_option( + rs.option.filter_smooth_alpha, + self.spatial.options[OptionType.SMOOTH_ALPHA].option_value + ) + spatial.set_option( + rs.option.filter_smooth_delta, + self.spatial.options[OptionType.SMOOTH_DELTA].option_value + ) + spatial.set_option( + rs.option.holes_fill, + self.spatial.options[OptionType.HOLE_FILLING].option_value + ) + frameset = spatial.process(frameset).as_frameset() + + # TEMPORAL FILTER + if enable_temporal: + temporal = rs.temporal_filter() + temporal.set_option( + rs.option.filter_smooth_alpha, + self.temporal.options[OptionType.SMOOTH_ALPHA].option_value + ) + temporal.set_option( + rs.option.filter_smooth_delta, + self.temporal.options[OptionType.SMOOTH_DELTA].option_value + ) + temporal.set_option( + rs.option.holes_fill, + self.temporal.options[OptionType.PERSISTENCY_INDEX].option_value + ) + frameset = temporal.process(frameset).as_frameset() + + # disparity to depth + frameset = disparity_to_depth.process(frameset).as_frameset() + + # HOLE FILLING + if enable_hole_filling: + hole_filling = rs.hole_filling_filter() + hole_filling.set_option( + rs.option.holes_fill, + self.hole_filling.options[OptionType.HOLE_FILLING].option_value + ) + frameset = hole_filling.process(frameset).as_frameset() + + self.filtered_frameset = frameset + + def adv_mode(self): + json_string = str(self.jsonObj).replace("'", '\"') + + advnc_mode_arg = rs.rs400_advanced_mode(self.device) + advnc_mode_arg.load_json(json_string) + + def stop(self): + self.pipeline.stop() diff --git a/common/RealSense_Utilities/test.py b/common/RealSense_Utilities/test.py new file mode 100644 index 0000000..d6f77c3 --- /dev/null +++ b/common/RealSense_Utilities/test.py @@ -0,0 +1,4 @@ +from realsense_api.post_processing.decimation import DecimationOptions +from realsense_api.post_processing.spatial import SpatialOptions +from realsense_api.post_processing.temporal import TemporalOptions +from realsense_api.post_processing.hole_filling import HoleFillingOptions \ No newline at end of file diff --git a/common/__init__.py b/common/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/common/mediapipe_api/handlandmarks/__init__.py b/common/mediapipe_api/handlandmarks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/common/mediapipe_api/handlandmarks/__pycache__/__init__.cpython-38.pyc b/common/mediapipe_api/handlandmarks/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90c24e6302cc4215b87cbba594138d76c22728f5 GIT binary patch literal 222 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 literal 0 HcmV?d00001 diff --git a/src/handpose_pkg/handpose_pkg/handlandmark_keypoints.json b/common/mediapipe_api/handlandmarks/handlandmark_keypoints.json similarity index 100% rename from src/handpose_pkg/handpose_pkg/handlandmark_keypoints.json rename to common/mediapipe_api/handlandmarks/handlandmark_keypoints.json diff --git a/common/mediapipe_api/handlandmarks/handlandmarks.py b/common/mediapipe_api/handlandmarks/handlandmarks.py new file mode 100644 index 0000000..f1b5b61 --- /dev/null +++ b/common/mediapipe_api/handlandmarks/handlandmarks.py @@ -0,0 +1,327 @@ +import mediapipe as mp +import cv2 +import numpy as np +import pyrealsense2 as rs +import time +import os +import sys +import json +import queue +queue = queue.Queue() + +class HandLandmarks(): + def __init__(self): + script_dir = os.path.dirname(__file__) # 현재 스크립트의 디렉토리 경로 + file_path = os.path.join(script_dir, 'handlandmark_keypoints.json') + self.keypoints = json.load(open(file_path)) + # self.keypoints = json.load(open("handlandmark_keypoints.json")) + self.hand_pose = {} # tuple + self.hand_pose['index'] = None + self.hand_pose['score'] = None + self.hand_pose['label'] = None + self.hand_pose['landmarks'] = np.zeros((21, 3)) + self.hand_pose['world_landmarks'] = np.zeros((21, 3)) # calculate from camera instrinsic(Realsense) + self.hand_results = [] + pass + +class MediaPipeHandLandmarkDetector(HandLandmarks): + # pass + def __init__(self, image_width=640, image_height=480, replace_threshold=50): + super().__init__() + self.camera_to_hand_vector = {'x': 0, 'y': 0, 'z': 0} + self.hand_landmarks = np.zeros((21, 3)) + self.mp_drawing = mp.solutions.drawing_utils + self.mp_hands = mp.solutions.hands + self.hands = self.mp_hands.Hands(min_detection_confidence=0.8, + min_tracking_confidence=0.7) + self.canonical_points = np.zeros((21, 3)) + self.world_points = np.zeros((21, 3)) + self.world_points_iqr = np.zeros((21, 3)) + self.replace_points = np.zeros((21, 3)) + self.replace_threshold = replace_threshold + + self.palm_vector = {'x', 'y', 'z', 'r', 'p', 'y'} + + self.depth_intrinsics = None + + self.image_width = image_width + self.image_height = image_height + + self.color_image = np.zeros((image_height, image_width, 3)) + self.depth_image = np.zeros((image_height, image_width)) + self.drawing_image = np.zeros((image_height, image_width, 3)) # show mediapipe algorithm image + + self.hand_thickness = 10 # mm + self.pps = 0 + + def __del__(self): + pass + + def hand_detection(self, color_frame, depth_frame, depth_intrinsic=None): + ###################################################### + # Flip the image horizontally for a later selfie-view display, and convert + # the BGR image to RGB. + self.depth_intrinsics = depth_intrinsic + self.color_image = color_frame + self.color_image = cv2.flip(self.color_image, 1) + self.color_image = cv2.cvtColor(self.color_image, cv2.COLOR_BGR2RGB) + self.depth_image = depth_frame + + # To improve performance, optionally mark the image as not writeable to + # pass by reference. + self.color_image.flags.writeable = False + results = self.hands.process(self.color_image) + + # Draw the hand annotations on the image. + self.color_image.flags.writeable = True + self.color_image = cv2.cvtColor(self.color_image, cv2.COLOR_RGB2BGR) + self.drawing_image = self.color_image + self.hand_results.clear() + self.hand_pose = {key: None for key in self.hand_pose} + + s_time = time.time() + if results.multi_handedness: + for handedness, hand_landmarks in zip(results.multi_handedness, results.multi_hand_landmarks): + # dictionary clear + + classification = handedness.classification[0] + self.hand_pose['index'] = classification.index + self.hand_pose['score'] = classification.score + self.hand_pose['label'] = classification.label + + self.hand_landmarks = np.zeros((21, 3)) + for idx, landmrk in enumerate(hand_landmarks.landmark): + cx, cy, cz = landmrk.x, landmrk.y, landmrk.z + self.hand_landmarks[idx, 0] = cx + self.hand_landmarks[idx, 1] = cy + self.hand_landmarks[idx, 2] = cz + + canonical_points, world_points, world_points_iqr, replace_points = ( + self.compare_coordinate_canonical_with_world(self.hand_landmarks)) + + self.canonical_points = canonical_points + self.world_points = world_points + self.world_points_iqr = world_points_iqr + self.replace_points = replace_points + + self.hand_pose['landmarks'] = self.hand_landmarks + if self.depth_intrinsics != None: + self.hand_pose['world_landmarks'] = self.get_hand_world_xyz() + c, n_v = self.get_palm_pose(coord='replace') + c2, n_v2 = self.get_palm_pose(coord='canonical') + + # finally + self.hand_results.append(self.hand_pose) + + # drawing points on image + drawing_image = self.color_image + self.mp_drawing.draw_landmarks( + drawing_image, + hand_landmarks, + self.mp_hands.HAND_CONNECTIONS, + # mp_drawing_styles.get_default_hand_landmarks_style(), + # mp_drawing_styles.get_default_hand_connections_style() + ) + self.drawing_image = drawing_image + + e_time = time.time() + self.pps = 1 / (e_time - s_time) + + def compare_coordinate_canonical_with_world(self, hand_landmarks): + """ + Comparing world points(from camera depth frame) to canonical points(from mediapipe values) + :param hand_landmarks: (21,3) numpy array + :param replace_th: threshold for replacing point to canonical values + :return: list of values of all coordinates + """ + canonical_point = np.zeros((21, 3)) + hand_landmarks = np.asarray(hand_landmarks) + w, h = self.image_width, self.image_height + + canonical_point[:, 0] = [min(int(x * w), w - 1) for x in hand_landmarks[:, 0]] + canonical_point[:, 1] = [min(int(x * h), h - 1) for x in hand_landmarks[:, 1]] + canonical_point[:, 2] = [int(x * w) for x in hand_landmarks[:, 2]] + canonical_point = np.asarray(canonical_point, dtype=int) + + world_point = np.zeros((21, 3)) + world_point_iqr = np.zeros((21, 3)) + + # depth = np.zeros((1, 21)) + depth = self.depth_image[canonical_point[:, 1], canonical_point[:, 0]] + world_point[:, 0] = canonical_point[:, 0] + world_point[:, 1] = canonical_point[:, 1] + world_point[:, 2] = depth + world_point_iqr[:, 0] = canonical_point[:, 0] + world_point_iqr[:, 1] = canonical_point[:, 1] + world_point_iqr[:, 2] = self.replace_outliers_iqr_as_mean(depth, q1_rate=25, q3_rate=75, alpha=0) + + # world_point = np.asarray(world_point, dtype=int) + world_point = np.asarray(world_point) + + # depth_avg = np.mean(world_point[:, 2]) + depth_avg = np.mean(world_point_iqr[:, 2]) + canonical_point[:, 2] = canonical_point[:, 2] + depth_avg + self.hand_thickness + + replace_points = world_point_iqr + xyz_distances = np.linalg.norm(world_point_iqr - canonical_point, axis=1) + replace_points[xyz_distances >= self.replace_threshold] = canonical_point[xyz_distances >= self.replace_threshold] + return canonical_point, world_point, world_point_iqr, replace_points + pass + + @staticmethod + def vector_to_rpy(x, y, z): + # Yaw (ψ) + yaw = np.arctan2(y, x) + # Pitch (θ) + pitch = np.arctan2(-z, np.sqrt(x ** 2 + y ** 2)) + # Roll (φ) is typically set to zero for a single vector + roll = 0.0 + return roll, pitch, yaw + + @staticmethod + def remove_outliers_iqr(data, q1_rate=25., q3_rate=75., alpha=1.5): + """ + # IQR 방법으로 이상치 제거 + :return: + """ + q1 = np.percentile(data, q1_rate) + q3 = np.percentile(data, q3_rate) + iqr = q3 - q1 + lower_bound = q1 - (alpha * iqr) + upper_bound = q3 + (alpha * iqr) + return data[(data >= lower_bound) & (data <= upper_bound)] + + @staticmethod + def replace_outliers_iqr_as_mean(data, q1_rate=25., q3_rate=75., alpha=0.5): + """ + # IQR 방법으로 이상치 제거하고 평균값으로 대체하는 함수 + :return: + """ + q1 = np.percentile(data, q1_rate) + q3 = np.percentile(data, q3_rate) + iqr = q3 - q1 + lower_bound = q1 - (alpha * iqr) + upper_bound = q3 + (alpha * iqr) + + # 이상치의 인덱스를 저장 + outliers_indices = np.where((data < lower_bound) | (data > upper_bound))[0] + + # 이상치가 아닌 값들로 평균을 계산 + mean_value = np.mean(data[(data >= lower_bound) & (data <= upper_bound)]) + + # 이상치를 평균값으로 대체 + data[outliers_indices] = mean_value + + # print(f'IQR: q1:{q1}, q3:{q3}, iqr:{iqr}, l_b:{lower_bound}, u_b:{upper_bound}, indices:{outliers_indices}, mean:{mean_value}') + return data + + def get_hand_keypoint_pixel_xyz(self, hand_index=0, keypoint='index_finger_tip', coord='replace'): + try: + keypoint_index = self.keypoints['keypoints'][keypoint] + + if coord == 'canonical': + landmarks = self.canonical_points + x = landmarks[keypoint_index, 0] + y = landmarks[keypoint_index, 1] + z = landmarks[keypoint_index, 2] + return np.array([x, y, z]) + + elif coord == 'replace': + landmarks = self.replace_points + x = landmarks[keypoint_index, 0] + y = landmarks[keypoint_index, 1] + z = landmarks[keypoint_index, 2] + return np.array([x, y, z]) + + elif coord == 'normalized': + landmarks = self.hand_results[hand_index]['landmarks'] + x = landmarks[keypoint_index, 0] + y = landmarks[keypoint_index, 1] + z = landmarks[keypoint_index, 2] + return np.array([x, y, z]) + + except Exception as e: + print(f'[mediapipe_hands.py] Exception error: {e}') + finally: + pass + + def get_hand_world_xyz(self): + """ + Obtain real distances x, y, z of each points from the camera in the world coordinate. + :unit: mm + :return: x, y, z values between each point and camera + """ + xyz_world = [] + for idx, xyz in enumerate(self.replace_points): + coordinate_xyz = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [xyz[0], xyz[1]], xyz[2]) + xyz_world.append(coordinate_xyz) + + xyz_world = np.asarray(xyz_world, dtype=np.float64) + return xyz_world + + def get_palm_pose(self, coord='replace'): + """ + Find some points of hand landmarks + :param keypoint: handlandmark_keypoints.json + :param coord: canonical, replace, landmarks(normalized) + :return: x, y, z values + """ + p1 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='wrist', coord=coord) + p2 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='pinky_mcp', coord=coord) + p3 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='index_finger_mcp', coord=coord) + + v1 = p2 - p1 + v2 = p3 - p1 + center_point = (p1 + p2 + p3) / 3. + normal_vector = np.cross(v1, v2) + normal_unit_vector = normal_vector / np.linalg.norm(normal_vector, 2) + + return center_point, normal_unit_vector + + @staticmethod + def get_top_n_values(self, arr, n=3): + arr = np.array(arr) + max_indices = np.argpartition(arr, -n)[-n:] # 가장 큰 값의 인덱스를 찾습니다. + max_values = np.partition(arr, -n)[-n:] # 배열에서 가장 큰 값 3개를 찾습니다. + return max_indices, max_values + + @staticmethod + def get_bottom_n_values(self, arr, n=3): + arr = np.array(arr) + min_indices = np.argpartition(arr, n)[:n] # 가장 작은 값의 인덱스를 찾습니다. + min_values = np.partition(arr, n)[:n] # 배열에서 가장 작은 값 3개를 찾습니다. + return min_indices, min_values + +def main(): + HLD = MediaPipeHandLandmarkDetector() + print(f"Created class: {HLD}") + test_image = cv2.imread("hsh.jpg") + + arbitrary_depth_image = np.random.randint(0, 601, (480, 640)) + HLD.hand_detection(test_image, arbitrary_depth_image,) + # cv2.imshow('test_image', test_image) + cv2.imshow('mp_image', HLD.drawing_image) + + test_image = cv2.imread("wja1.png") + + arbitrary_depth_image = np.random.randint(0, 601, (480, 640)) + HLD.hand_detection(test_image, arbitrary_depth_image, ) + # cv2.imshow('test_image', test_image) + cv2.imshow('mp2_image', HLD.drawing_image) + + test_image = cv2.imread("yj.png") + + arbitrary_depth_image = np.random.randint(0, 601, (480, 640)) + HLD.hand_detection(test_image, arbitrary_depth_image, ) + # cv2.imshow('test_image', test_image) + cv2.imshow('mp3_image', HLD.drawing_image) + + + cv2.waitKey(0) + cv2.destroyAllWindows() + + sys.exit() + +if __name__ == '__main__': + main() + diff --git a/common/mediapipe_api/handlandmarks/hsh.jpg b/common/mediapipe_api/handlandmarks/hsh.jpg new file mode 100644 index 0000000000000000000000000000000000000000..519006c947fde3b26a05953c876c35c0a6839cf0 GIT binary patch literal 380541 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%0A2u?`OdIRfw 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 literal 0 HcmV?d00001 diff --git a/src/handpose_pkg/handpose_pkg/mediapipe_hands_legacy.py b/common/mediapipe_api/handlandmarks/mediapipe_hands_realsense_demo_legacy.py similarity index 86% rename from src/handpose_pkg/handpose_pkg/mediapipe_hands_legacy.py rename to common/mediapipe_api/handlandmarks/mediapipe_hands_realsense_demo_legacy.py index 075b7f0..f7cbd0a 100644 --- a/src/handpose_pkg/handpose_pkg/mediapipe_hands_legacy.py +++ b/common/mediapipe_api/handlandmarks/mediapipe_hands_realsense_demo_legacy.py @@ -7,19 +7,15 @@ import time import matplotlib import matplotlib.pyplot as plt +matplotlib.use('TkAgg') from mpl_toolkits.mplot3d import Axes3D from matplotlib.animation import FuncAnimation + from functools import partial import threading from multiprocessing import Process # matplotlib.use('Agg') - import json - -from RealSense_Utilities.realsense_api.realsense_api import RealSenseCamera -from RealSense_Utilities.realsense_api.realsense_api import find_realsense -from RealSense_Utilities.realsense_api.realsense_api import frame_to_np_array - import queue queue = queue.Queue() @@ -189,10 +185,10 @@ def update_data(self, frames): self.ax3.plot(data_r_p[start_idx:end_idx + 1, 0], data_r_p[start_idx:end_idx + 1, 1], data_r_p[start_idx:end_idx + 1, 2], color='purple') # 벡터 그리기 - self.ax3.quiver(g_palm_center[0], g_palm_center[1], g_palm_center[2] , g_palm_normal_vector[0], g_palm_normal_vector[1], g_palm_normal_vector[2], color='r', length=150, normalize=False) + self.ax3.quiver(g_palm_center[0], g_palm_center[1], g_palm_center[2] , g_palm_normal_vector[0], g_palm_normal_vector[1], g_palm_normal_vector[2], color='black', length=150, normalize=False) self.ax4.plot(data_c_p[start_idx:end_idx + 1, 0], data_c_p[start_idx:end_idx + 1, 1], data_c_p[start_idx:end_idx + 1, 2], color='red') - self.ax4.quiver(g_palm_center_cano[0], g_palm_center_cano[1], g_palm_center_cano[2] , g_palm_normal_vector_cano[0], g_palm_normal_vector_cano[1], g_palm_normal_vector_cano[2], color='r', length=150, normalize=False) + self.ax4.quiver(g_palm_center_cano[0], g_palm_center_cano[1], g_palm_center_cano[2] , g_palm_normal_vector_cano[0], g_palm_normal_vector_cano[1], g_palm_normal_vector_cano[2], color='black', length=150, normalize=False) self.ax5.plot(data_w_p[start_idx:end_idx + 1, 0], data_w_p[start_idx:end_idx + 1, 1], data_w_p[start_idx:end_idx + 1, 2], color='blue') @@ -210,7 +206,7 @@ def start(self): class HandLandmarks(): def __init__(self): - self.keypoints = json.load(open("./handlandmark_keypoints.json")) + self.keypoints = json.load(open("handlandmark_keypoints.json")) self.hand_landmarks = {} # tuple self.hand_landmarks['index'] = None self.hand_landmarks['score'] = None @@ -256,7 +252,8 @@ def __init__(self): self.color_image = None self.depth_image = None self.depth_image_prev = None - self.depth_image_for_drawing = None + self.depth_colormap = None + self.blended_image = None self.start_flag = False self.hand_thickness = 10 # mm @@ -363,20 +360,27 @@ def hand_detection(self, color_frame, depth_frame, depth_intrinsic=None): # mp_drawing_styles.get_default_hand_connections_style() ) - # self.depth_image_for_drawing = np.zeros((self.image_height, self.image_width, 3), dtype=np.uint16) - # self.depth_image_for_drawing[:, :, 0] = self.depth_image_filtered - # self.depth_image_for_drawing = cv2.cvtColor(self.depth_image_for_drawing, cv2.COLOR_RGB2BGR) + # self.depth_colormap = np.zeros((self.image_height, self.image_width, 3), dtype=np.uint16) + # self.depth_colormap[:, :, 0] = self.depth_image_filtered + # self.depth_colormap = cv2.cvtColor(self.depth_colormap, cv2.COLOR_RGB2BGR) - self.depth_image_for_drawing = self.depth_image_filtered - self.depth_image_for_drawing = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image_for_drawing, alpha=0.3), cv2.COLORMAP_JET) + self.depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image_filtered, alpha=0.3), cv2.COLORMAP_JET) + # self.depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_colormap, alpha=0.3), cv2.COLORMAP_JET) - self.mp_drawing.draw_landmarks( - self.depth_image_for_drawing, - hand_landmarks, - self.mp_hands.HAND_CONNECTIONS, - # mp_drawing_styles.get_default_hand_landmarks_style(), - # mp_drawing_styles.get_default_hand_connections_style() - ) + # 이미지 블렌딩 + alpha = 0.3 # 컬러 이미지의 투명도 + beta = 1 - alpha # 깊이 이미지의 투명도 + gamma = 0 # 추가적인 밝기 조절 + self.blended_image = cv2.addWeighted(self.color_image, alpha, self.depth_colormap, beta, gamma) + + + # self.mp_drawing.draw_landmarks( + # self.depth_colormap, + # hand_landmarks, + # self.mp_hands.HAND_CONNECTIONS, + # # mp_drawing_styles.get_default_hand_landmarks_style(), + # # mp_drawing_styles.get_default_hand_connections_style() + # ) e_time = time.time() self.pps = 1 / (e_time - s_time) @@ -398,7 +402,7 @@ def compare_coordinate_canonical_with_world(self, hand_landmarks_array, replace_ world_point_iqr = np.zeros((21, 3)) # depth = np.zeros((1, 21)) - depth = self.depth_image[canonical_point[:, 1], canonical_point[:, 0]] + depth = self.depth_image_filtered[canonical_point[:, 1], canonical_point[:, 0]] world_point[:, 0] = canonical_point[:, 0] world_point[:, 1] = canonical_point[:, 1] world_point[:, 2] = depth @@ -406,7 +410,8 @@ def compare_coordinate_canonical_with_world(self, hand_landmarks_array, replace_ world_point_iqr[:, 1] = canonical_point[:, 1] world_point_iqr[:, 2] = self.replace_outliers_iqr_as_mean(depth, q1_rate=25, q3_rate=75, alpha=0) - world_point = np.asarray(world_point, dtype=int) + # world_point = np.asarray(world_point, dtype=int) + world_point = np.asarray(world_point) # depth_avg = np.mean(world_point[:, 2]) depth_avg = np.mean(world_point_iqr[:, 2]) @@ -702,8 +707,8 @@ def rs_init(self, fps=30): # config.enable_stream(rs.stream.depth, 1280, 720, rs.format.z16, 30) width = self.image_width height = self.image_height - self.config.enable_stream(rs.stream.color, width, height, rs.format.bgr8, fps) self.config.enable_stream(rs.stream.depth, width, height, rs.format.z16, fps) + self.config.enable_stream(rs.stream.color, width, height, rs.format.bgr8, fps) # 카메라 시작 self.profile = self.pipeline.start(self.config) @@ -733,26 +738,38 @@ def rs_init(self, fps=30): def get_frames(self): frames = self.pipeline.wait_for_frames() - align_frames = frames - # align_frames = self.align.process(frames) - depth_to_disparity_transform = rs.disparity_transform(True) # True for depth to disparity - align_frames = depth_to_disparity_transform.process(align_frames) + # Align the depth frame to color frame + align = rs.align(rs.stream.color) + frames = align.process(frames) - align_frames = rs.spatial_filter().process(align_frames) - align_frames = rs.temporal_filter().process(align_frames) + # Get aligned frames + aligned_depth_frame = frames.get_depth_frame() + color_frame = frames.get_color_frame() - disparity_to_depth_transform = rs.disparity_transform(False) - align_frames = disparity_to_depth_transform.process(align_frames).as_frameset() + # Validate that both frames are valid + if not aligned_depth_frame or not color_frame: + raise RuntimeError("Could not acquire aligned frames.") - color_frame = align_frames.get_color_frame() - depth_frame = align_frames.get_depth_frame() + ''' + TODO depth scale - D400: 0 L515: /4 + ''' + # self.depth_image = np.asanyarray(aligned_depth_frame.get_data()) / 4 + self.depth_image = np.asanyarray(aligned_depth_frame.get_data()) + self.color_image = np.asanyarray(color_frame.get_data()) - if not depth_frame or not color_frame: - return depth_frame, color_frame + # self.color_image = np.asanyarray(color_frame.get_data()) + # self.depth_image = np.asanyarray(depth_frame.get_data()) + + # depth_to_disparity_transform = rs.disparity_transform(True) # True for depth to disparity + # align_frames = depth_to_disparity_transform.process(align_frames) + # + # align_frames = rs.spatial_filter().process(align_frames) + # align_frames = rs.temporal_filter().process(align_frames) + # + # disparity_to_depth_transform = rs.disparity_transform(False) + # align_frames = disparity_to_depth_transform.process(align_frames).as_frameset() - self.color_image = np.asanyarray(color_frame.get_data()) - self.depth_image = np.asanyarray(depth_frame.get_data()) # return return self.color_image, self.depth_image @@ -768,9 +785,6 @@ def realsense_demo(self): while True: image_color, image_depth = self.get_frames() - # if not image_color or not image_depth: - # continue - self.hand_detection(image_color, image_depth, self.depth_intrinsics) index_finger_tip_image = self.hand_landmarks['landmarks'] @@ -788,32 +802,50 @@ def realsense_demo(self): z2 = index_finger_tip_world[8][2] finger_depth = z + + try: + m_f = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='middle_finger_tip', coord='canonical') + m_f_z = self.depth_image_filtered[m_f[1], m_f[0]] + cv2.putText(self.color_image, f"{m_f_z:.1f}", (m_f[0], m_f[1] - 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + m_f = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='ring_finger_tip', coord='canonical') + m_f_z = self.depth_image_filtered[m_f[1], m_f[0]] + cv2.putText(self.color_image, f"{m_f_z:.1f}", (m_f[0], m_f[1] - 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + m_f = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='pinky_tip', coord='canonical') + m_f_z = self.depth_image_filtered[m_f[1], m_f[0]] + cv2.putText(self.color_image, f"{m_f_z:.1f}", (m_f[0], m_f[1] - 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + except Exception as e: + continue + pass + + cv2.line(self.color_image, (int(image_width / 2), int(image_height / 2)), (int(image_width / 2), int(image_height / 2)), (255, 0, 0), 5) - cv2.putText(self.color_image, f"(basic: {finger_depth:.1f} mm", + cv2.putText(self.color_image, f"{finger_depth:.1f} mm", (x, y - 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) - cv2.putText(self.color_image, f"(scale: {z2:.1f}) mm", - (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) - cv2.putText(self.color_image, - f"{x:.1f}, {y:.1f}, {z:.1f} mm", - (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + # cv2.putText(self.color_image, f"(scale: {z2:.1f}) mm", + # (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) + # cv2.putText(self.color_image, + # f"{x:.1f}, {y:.1f}, {z:.1f} mm", + # (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) cv2.line(self.depth_image_filtered, (x, y), (x, y), (0, 255, 0), 5) cv2.putText(self.depth_image_filtered, f"{finger_depth:.1f} mm", (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) - cv2.putText(self.depth_image_filtered, - f"{x:.1f}, {y:.1f}, {z:.1f} mm", - (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) - + # cv2.putText(self.depth_image_filtered, + # f"{x:.1f}, {y:.1f}, {z:.1f} mm", + # (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) + + + - if self.color_image is None or self.depth_image_for_drawing is None: - continue + # if self.color_image is None or self.depth_colormap is None: + # continue cv2.imshow('MediaPipe Hands', self.color_image) - depth_show_img = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image_filtered, alpha=0.3), cv2.COLORMAP_JET) # cv2.imshow('depth image', depth_show_img) - cv2.imshow('depth image2', self.depth_image_for_drawing) + cv2.imshow('depth image2', self.depth_colormap) + cv2.imshow('depth image3', self.blended_image) diff --git a/common/mediapipe_api/handlandmarks/test.py b/common/mediapipe_api/handlandmarks/test.py new file mode 100644 index 0000000..64749fb --- /dev/null +++ b/common/mediapipe_api/handlandmarks/test.py @@ -0,0 +1,97 @@ +import cv2 #영상처리를 위한 라이브러리 +import numpy as np # 백터 및 행렬 연산 라이브러리 +import pyrealsense2 as rs # realsense 카메라를 파이선으로 제어 가능 모듈 +import time #시간관련 +import os #운영체제 관련 모듈 operating system +import matplotlib.pyplot as plt + + + +from RealSense_Utilities.realsense_api.realsense_api import RealSenseCamera +from RealSense_Utilities.realsense_api.realsense_api import find_realsense +from RealSense_Utilities.realsense_api.realsense_api import frame_to_np_array +from mpl_toolkits.mplot3d import Axes3D +from PIL import Image + +DEVICE = "cuda" # 그래픽카드 할당 사용 + +#realsense sdk사용하여 딥스 카메라 픽셀좌표에서 물리좌표로 변환하는 함수 x:가로 y:세로 d:깊이 intr: 카메라 내부 특성(렌즈 초점거리, 광학중심등) +def convert_depth_to_phys_coord(xp, yp, depth, intr): + result = rs.rs2_deproject_pixel_to_point(intr, [int(xp), int(yp)], depth) + + return result[0], result[1], result[2] # 반환된 xyz좌표 + +def main(): + # camera environment setup/카메라 초기화 및 설정 + frame_height, frame_width, channels = (480, 640, 3) # (이미지 픽셀 수,픽셀수 , 채널 수) + + cameras = {} # 빈 딕셔너리 생성 파이썬에서 키-쌍을 저장하는 자료구조 + realsense_device = find_realsense() + widths = [] + heights = [] + # If using several cameras, detecting camera's individual serial. + for serial, devices in realsense_device: #반복문 realsenss_device에서 시리얼 번호와 장치 정보를 가져와 초기화 후 재설정 , cameras 딕셔너리에 저장 + cameras[serial] = RealSenseCamera(device=devices, adv_mode_flag=True, device_type='d455', + color_stream_fps=30, depth_stream_fps=30, + color_stream_height=frame_height, color_stream_width=frame_width, + depth_stream_height=frame_height, depth_stream_width=frame_width, + disable_color_auto_exposure=False) + time.sleep(5) # 카메라 초기화 후 5초 대기 + + _, rs_main = cameras.popitem() # 마지막 키 값을 제거 후 반환 rs_main에 저장 , 하나의 realsense 카메라를 사용하기 위함 + + if rs_main is None: + print("can't initialize realsense cameras") + + # main streaming part + while True: #while 루프문으 사용하여 실시간 프레임 캡쳐 및 처리 + try: + # To get real-time frame, using get_data() function to capturing frame. 실시간 프레임 캡쳐 + rs_main.get_data() + + # captured every frameset includes RGB frame and depth frame. + frameset = rs_main.frameset + + # required to align depth frame to RGB frame. + rs_main.get_aligned_frames(frameset, aligned_to_color=True) + + # applying filters in depth frame. + frameset = rs_main.depth_to_disparity.process(rs_main.frameset) + frameset = rs_main.spatial_filter.process(frameset) + frameset = rs_main.temporal_filter.process(frameset) + frameset = rs_main.disparity_to_depth.process(frameset) + frameset = rs_main.hole_filling_filter.process(frameset).as_frameset() + + # It is recommended to use a copy of the RGB image frame. + img_rs0 = np.copy(frame_to_np_array(frameset.get_color_frame())) + + # Same to depth frame. + img_depth = np.copy(frame_to_np_array(frameset.get_depth_frame())) + img_raw = np.copy(img_rs0) + + results = model.predict(img_rs0) + im_array = results[0].plot() + + # use opencv to visualize results. + resized_image = cv2.resize(im_array, dsize=(0, 0), fx=1, fy=1, interpolation=cv2.INTER_AREA) + cv2.namedWindow('RealSense_front', cv2.WINDOW_NORMAL) + cv2.resizeWindow('RealSense_front', resized_image.shape[1], resized_image.shape[0]) + cv2.imshow('RealSense_front', resized_image) + + + key = cv2.pollKey() + + if key & 0xFF == ord('q') or key == 27: + cv2.destroyAllWindows() + break + + except RuntimeError as runexpt: + print(runexpt, " frame skipped") + continue + + rs_main.stop() + print("main process closed") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/common/mediapipe_api/handlandmarks/wja1.png b/common/mediapipe_api/handlandmarks/wja1.png new file mode 100644 index 0000000000000000000000000000000000000000..d2f91198973f1e4a7169e67a697ac9cb81d7f8d7 GIT binary patch literal 204151 zcmV)mK%T#eP)8~wGav%1q{cLxCOK-FE%#g$3h@?0aX&c-mkdkb}v@F1o0Sh2tSdu^Riv-Bu{cp$+ zVA)?}(t=Hq;wtXqkV6iqXJ2}zyJ!0K_V&A;rFP>NS#eL^yj5qp%X_b9SQqE!77-bl zRh3bhkrC87{qL@GhMSXBpCZ6>eR6 zil?DVPxCc&`PY06yZT4VeVpw;m)~Xh%j>VSs*cd_$T!(uQ-RBuBDwjR*3j+0>TGl2 zRcG&?($z343j{#`-#2_Jyym6pRG!T+j3vzT5>-{f_d*FvFGVlvA)BR$q6lSK173i< zD#2$bPiL6TW|&MSI68O?@*4&o`u)DtySIGu@Dths05WcK-V z>_?ywi^EWOBmE@l3tt=n$zzdaB4{LD z;;svS(OdAO>bWR?#0$yfMX$@?UbfDwe&Mt&E?v#<;@6TDT_C4}WhX#O!D+oKe66*h zFU?Z=m$>~>htkms&(T}LKk?b;+V8&Soz7B7Gc8JlNsJOT0?r_USYV?h5rI>~M^OQJ zKEvaOkMPwme+6&7^%mZF?_HUZ6j_cmo1!kvj3)3s6nTm%XDfA$hj;HueKIo&eDwN# zyzs&c_{1kZfe*g?VcfcP8#_BYNa6?;CmDec-#0uY{XVkU40Txw4YnmsQxPh09AY}1 zA_yYwnw3NCQ|*(L5uYNU-ba@OZHt?)X}gUIYv(E4x?vYTE}d236t9iPwmgNu%20XL zu#NVjvNrh3=4snW$NP_e_E%@dLw8xlp2l3HVwav>`6~3>Wv*3lt`f%O-=)2*f81rR zW%zFYEU$m@GM76gK1Y8^1?S<-$A_D*?Q)m7mJJMUxnDQSOpSo4eNP5wE^V>SEG?ue zrjL)0k@S10iV~0R-NkSIhu=Ut9ZNo!v8K}reE3FKp+YvD0jN-wB{<_KiULs(ivTF= zN@f@&p5?hLp>gT!`IlbAOE0~IPyUS`#!DaiAhx%65GQ?9FhVf&BU$o-?+Jfl=o>zp znF?o8dbRbL+kS;zHM|JEi{qwOt-B3wU0ODL+mmdUv%Y2NHl9|^yDHi)okjJp3Twl; z@3dXk)<;^u!fB}acDSgl6^=9T=2|FB`0#VET(trvYKQJv)%HT!@NQfO>x=TRPJL~4 zxcs~PaS&N_wc*=5sj#&37STIj*7gd{q4dG)qOUrWImSHJhNF2J&Y?}r6((-En`WPr zmeQlngn4=|IO|aT2?Ype84n*m#4E47B7;ALMmm||YhU^b-g)ayL_vr!3Ispt^$-OS zYHCl4QkJ{2G)11L2z@iipVn*fz`9u%!vdy%k4`4|=tn<_pZuwx!4G`$lX&sP7vcHT z+dza7m(19g6iTE?T+Viu2@|_Nw9R(jviMcvT!fa(-?}tx__in6E@xfK(k?&ird|4q z-<7ZB7Y&!ub<0iK=ojrWJ5FBQw4K*hru;7|Qy80;zCX-s6(%--4(2uio9ME*JDA$E zm*GmC&RD%_W0m&0^(mg#v+m47@inyD-^PpGzlyV7*!BwA6joEf+Zb(pYPptasQDVM zD@=&TzUJV~D`++>Fps~JlZg!0RHAcmK0ZFgojZ5%+0T9!`}_O&$jcu>T~>JS?RQY- z1**CfWjb+Hm~iPSFEW%_E;Exn%VgkZ8w95j9NGqkEE8c6K$QBtPfR~PIFj(EfBI+f zb3gy{_~6Sgi|(baJW=3NNuTD0z)+t;WxZZqeWv9alJ`}wbzqg|BAi8KioYzpD2+A+ zyi3bXlb5!<2`lr7SVRgR>ig9^aGK!G+#rd@1_^QDvk|f=e5O^zWq$U z?}UjqOdF%=uF!657tEr3TNt##EfWUBU&KQfzTzxz=f#AH(&w^|d(F$-l6hOYVAd5T z6e9eQ9+#CUOsH!(I5?2ys{3~z;hlHhLa*18nZes{-@zBZ_(fTwdc6M-!#I%_s>pK@ z7Nk{FHT*CzJG4Sd1G9t`h5@25#B6*b%6!)2aoMX8WOkbv=ZuIK1q69heF$fxjBjpk z;&1=l-^YLPQ$LBDH*X=$GqbA;9`e%6Onj?6SF@ay#yp z*=ZNf=50|~8=T$#bHc>^5_bo?RV&kq-ND$dTwxZ4Zv8gwD!eSKkL8Q#xcuAoOZ)=M zTsDoi_Srly;?2;}SJ0+v$LC+hnrqW{g~{16#h8a$uHn4I#MTuiq{B8Uy_3Tuy#D&@ z_`(;yAmR9MDuX$frZzS<@ZyWl!%Kd7njO-G0kPjz?=6WCmO;p%uMCs@ff#m-NJwQ zU;j7w>7V^s4EiIaS%th2P;oe)T5B7H_=^9Q-T!6fZPhHpvCEh7Y{R;BEh=+inbs%S z#2 zEqnGNGni&eF>OFtCN?HjWo8fs?Ls1%StPxoyl~1#82C~~ypxj?%%(ZYGKY^6Rb8OS zQn??2NB#=LJ+m9Dt?j%oUX>z@6C53n@uNTf6Zo%w;lINRFMbeS6r(6A1XS!Nv1z*q zEHe{|d^2+@D=xjwXMB3EwLbg)+Hr+jCv@@M^g6T@)}`U56>ing#cx~svT3>SZrX;` zxb`j6%ix!lE6qjWA{sU?tMH@sC{3MJYua4`Q~Fx&)?w$nWm;ETsCY`BFy<4i4cf{h zf+Abl&vevoWE-PePTPd1c_|+k<>9jUcD+|gOX+gp=L65@heCyME*psepxs6gphz>k zb>|L#_cwnNZ{N9t{Rj6EdcG*h32Q%ljC01oALIPd?t{FST;eJUB!j-B1#UbRn-Rhg zc58D(>ZUNEElH7=C`+@H#V-%?2$(NFE_3P2+SNB)HY3hxG{P5Nc?EC1^DchjAN)i7 z=#TvvhW(M)r;rA}y19!iia0|u0)^Y4=O&HXV^1z*o7g8;d0hw1tK{!#&|0-mE^{xm z4h=8b&dcBjzxYr7m;Y^*ido5ZT+8S#tJQuLY+9#r60m;8n2ZKxO@5128F5$rE$fq0 zK9&JK1LezjZ7XkErn8$uVW2Y;zAXGv|DghjY^)?4_sU;Tga>es&kkK1-Bd}Nlv zU0H^jzGw_NI8#uNMi5Z9;mh)snTFP&ElHNnB=mz&mbI#?L@XBaMv#$*!C-*lU}%J# zh>-bx_X8iC#n2XB+pRpgsLI%>1>8S`}CiRF#N!a&!aaOqO3{;et<%SXcVBx zGt^}bFECHI)}gfBH1pf?6#iKX$>){vx+bkv>Rkoqs{6C6PcF;L`DfBRPww+_*?PMA z!=}5^%tQ$h@jUZd`gB9PQC;ya4sG}@n6CWG;9dpItGFN6(FSdsEI)}|huIw^3igw+ zEJsCAj5ptU9sl3I`+xA(cizN^LWavsqK|;=(h5VmNHMb$dzPR)vy8eFD$`jWgn`6a zuPDqbUtFhf>n?>Fg^P1S zb&c)O5Wn*qzlMVcckz$@r++HTYMhzGp)WhbXcv=2+)5mve1dZm_SqTU^(I|Yc#-1y}H2X%EvB< zXDMGhVi8YgVdj!tan6=&ZhLr{2f?MdPQ8k|3}+dC%kZ_Hi-sKFIpDJ%3KD*u(>8>5 z9^BgdZ~pbamT+@pgz3q#xJIEZNE`+-XCyw`z#nPoPx%SsQ1U1kIGB^B2$eVydy_bc zMR?E$Sk&u_K;iNg-LMp;S#BaOuVc=lDo$EiXR{R5Z0%JZv|fhHqh5vY5QP_)vFf@6 z^&yc5{Mn!WG15B3fB!%HBiwrKIg~{WKLU!(_zkOz3|=%hYP4y0#o2z=`>b5#N3S-% z>~e*3!!|q@M$<~q#c}(k3r^`=Wq6UgE`rm=b6eZp{;_dgc)QGwuL`F)Yt2lEv~C4j z(RGF7r|oj{-L&F#uw)s0@_B-6htRc)p+Nqk_9Y~&LGULcnGh-PHwh+e= zj>Z#F%!g$u?p7#BdZUpny|HdOhNMD1&t@Wo$iIE*OUjTx3MT4Y=!mi`IEyiQArUTB zg)hDGInb`$p!*k}j>hy|vWd6E*>0_~rFiWum!966E<)?nt+dv`VZCiU zEu+y^mrJLsP1lv*R(~6x*HORL?S^(;T4v{6W&A?Z4(*_;WaKJnweeN+W%T&1Y35*V z*j6v;tom!izskI2d|YK+F0HoybYYgJJx^u~6apN0IV0gNs$c%M|2N)x^Nt7w&L()x z(ur8O(?*1r(EMrV2Q*q#!mqrM-)vtAv7wTR}kAkfzjnhXjjKrtdXlon&IKh`c z{|f&1fAz2M;NCq%Aq679T}pnuzTYnLet}It9`R>JJ@&21nRQ> zUDOv^rr|PLtCR=7_)q@X5(WHfU;e99)&{ezG3~Wmlq>+HrJ+D|%v@MTIL}eQpTV`N z>54vy8{Sp-X&V*@zh(S&wYM$5EpHVCJO^Zc;fFzh$B!Q4mw)+}@y^?C%K)6GCrFYQ zH07Y)gR=wvbOzE(%+eI=c7KFPvzfef8>0>E?(V|4OUVV6yTrD(H&GPE79~k~NP2w{ z9<#$KzKS?>d9Ie9^sl$=EcNYe~nQG%NQ z9zTAB@4R^jw_kh#d$(@!=>r9pe$A1lec5R{Zo{k+zYOjw^cTTgrtVYRre99ePK90h z4%nIGMR3j#SdegOyXgg}XNvT_T_3;uIXY8;l~})yIkJuG{obb?M~}`!y=<^>?Krd( zv^v^>*cCG0O)Kn0!ZuoV9%mwU+O6NK=bJNKxHf)Vy9zyjLt)+auR>FC*MU_WIzn7@ z+5EY@5pP+YZhPIjC@A<<&M$o~?U0@-xP?9fam6kU9IFDq{pK9GFRq`UMW)tRswk5j0u{^%JFRA*Ry2#I2jVqK|p^y?ZE13a3mAOgtDXy^`~+ntRfU(Z>gup|xApY!?e9WcDak&m9}y0co)3p+pukM*Y2bZPxCai>1dvY zZDraA-;=_G9dp_NmN2pNwe#H29bE0fT4C)D*Lt*UQMeAQ(s|m#gafPHUL91K&-T#E zFRjn%(&SJ6_z&^Bzww*m0=}OZqr(0DM}kiSKM_b_BFjb;QXKHJnHiL2Ag^d(XmlkU zw5i)j%L@D;=p_L*HwL(Q^Cr?+j)#vQsCoC7)QqU(9mUT2l<k@u<=Y|ZRTU%SrK-w5LMv>fO;&8B6 z9R=&;jEA_))AnueY+`qN8-so%!i4To=n{ona;cc7V@Phz9rg!8kNC7}p#q(XcWw>d z-WcKL?heQcFY?UYSge0%XAh&%rs!5Eh$sN4J7N9gk$L(I`bmUjI6x4Eq6cF6Y&yli z`?tT0!^e+=FX7!c%6!i1D3Ig0x72%sF!qH1X&-B~t2`qLyGnS~^j4|!S%A4{yKTI# zxVFzO*SxM!VKwZ6(|kVf!7u*LXLTm$kQc9_EVUn}+;nNWX=UiLVH;gH&rP=-g?Aoi z&Y8RH=PvURlK4tP!#RcS*gCMMRGekW)BGmF{wL4&kG2u|YrDNR|AfE zIIEB^E6gTS{MxVodrZb-q|+%z!vW%?hogfd)Kr#uK6dwRh;boZyYq{GJRall@DRPE zCj&K`!|l2pY$?3Bj6}zcK^VyaRh*@aMgtkllQ6(=FhDk&iVOKD2@yoTxNwQ$5K&C! ze1*KoF&u3e%Xtxsq@T+4Yxpje8afjPc0?fgd7?dx%21Ov!{_3K_j@ zq1qqzQPq{~=wkm-2NOpj-u(7=*dYAC4}L<>dEs_+X{`EQR_kkS9Ct z@~CBtLKkPP^pfX)Em|#O)iQjxYtgl+-OF$n(Y4ELI&R#V$eyCvaHpA0L}3_eoFHym z(bnD?tccHI$id8R^hJ5pLGiM*E{lIr{x5^KF3Uap--$)llh!J5E)5sY zO}p@JTHA0Hb-T2mMta@$lgBQcuKYzfU2S%0x#{mJVZu(}1I0$_)s|+N4WqDb=;FHN zPa?gH&-sdJJ2y7|MP9acs`FgZq(I>S&$_hFC`cH8_w9G^hrj;^f>5L>Zr`{mU+Gki zbIE7e>x)i;gC}P!ufFyz@$O4cyd0!;w-oCL{742_5+i&>gTKlXclDlMV$kc+$(C#b zPNESuZtfv`bYJSGtjqI21P%xJG6+#d9%hxXU&-?V6lk0a1OfFxA;N$&1XEX@*O*Sn zD9ib5gvOU#XJgw*Q~N^ugB5d$EuE!+7sw1p+7WQ4*Az(<;&*=gx8-Qym%s1(WtJ}o zdDUjSGEZ?_c7LUDPvDdg=4GE`Khbn_idRMd7ciUYCxWw)tCBX2WTG5&ZjJ znCQdJM(V{pP0KQrl~x#jo=V5e(N2rji7e{eb?7_^SnU(-Gq+AHck>seIgsj42T=+M z4)*W8_a1)z*MD7v#mV6z_V)Hfw?Y3^Toz(|!wsX8*xT8{H^1?!I7|#THf0u(&C*jr z!`X>$;Vxxqg zmh?uVZ6EGIrvuhQs{2+LUu z&zomkgJxDk9J5o4xFNVBp|OIHoCh-g@gD z3`RrTx^WW^?%fr`Mk>i=@I7@gZ+3QZxrzcMO$+pso($I1r;wL~+mlhs4l3$V5-PSM z52Ni(_#S5*JlKjB?q()|cms!r$C%DC5lB7k~EZpYHdZ;Vm z_FyX3DcC4Dxb&v_9JY&bx{#rNF>VXyk{sK^e72eA#j~HXvciA*<3GXQ|Ak*bzc&>6 z`E(|Na$R>T*YRw$(bRjsZdn_ASKgvJt`et>)q;5al&#QMn!@eOW%@tR@P4@gPhuz*Io9@B1;&Dhx4AXAncf&_fb)dCbRv zzP7>$q3@v|huBOCYz}(Z>W?t$C5VCmgV=}H?DS%tq*)KlvYZb1HkD^bXAaVcoqR zbu2#5Czj)V!>|JC0-yc!Pvg1gZsVta=I_Wd9i2{6P`RGF-1lkO{ShV>{8N1QIk!<3 zmDzBM;#!Xjvy65Z9_bKQx1-v0>^_=Xk-0U`(>Crr_v})*!f2>)c3OGWP+^vZHaz1> z)6ORi%~yI%+j(|eVZ74;%e>+Im~!bVZOymo*m0%FP+{%7bHc#x z9-t7QFwt{iYT9pjz#sk5AIVY`mDS?TriLsEUfaGk7vl7l==tE3j)EPY`M=}2B_x}JN|HLP-y|X8< zx@>qockV1z_K)&&w&eU0lw01Gw&`i#x53$YHjbU&6}RE-co%$E{yMnpz;@NQEPvHH zTsSw~R?jLhZFtM_NcX7-6IT2zUe79D&thLGPts?+pUu>UUqZ(xNBH6^uZSNiF6D4Z zh}P{K90@<29*ckx-AYE+C$((j<6Qk zZc=y*2iVyjVS96cK}^NDCo>zN<9G;AVZzYFJ;b%Kk)dQa#Q{2Rb{`o&4X^BH!!uz6a~Kzw)i_XBW|rmg*k3w@jEug6!eN?b7^f+YrxQ$O z5oURYg9+WJ0LSAgrn4NCXB7KX_|qpCm#$P#!uF64>WgU45+yyEA@Mn58I}IO`&++- z4}bW>`1lWgQY`iL8ML1x=Go~d`P{VebD8?xwzz4V_M$Qy&W@aoNAw z8q8&@SN`fR%|TFkhW?O8*BTpDTx86@qs5h$l}PyAPF(cG7N^mcszw)SDcn$k`@S~ zSlr^%DDu(6``Fyv6a_!)m!&Ish>}E%XDtPO001BWNkl{_{<=JM!Jk>?BE!l^7s6%ouaov=`1)(y z%l829ZQw)BaKHQRd*Fe$OmllLmD1ED92`6rmnHqpO&QoZh>xdZ8MMbdN2JIw9ZwJi z9gu<#Sj7-tbS18g)=1kn?b%yq{tMT{K^C~>AD14W-kLB0Z_El-G3fJ~bTn4v|UR&NdVWI;=8}LQ* z*pO%SdX{;6R{PB6OCM4`H$3#}t6%yuA|G-jE_Xu(F}MCs<;OvqOI-X#Q7B*S9JFZ^ zn9ee!Gh=_k9b2Q}(Ch}IWqdD@9b6mz9&YXJV7M`q0XU54o}I2o0z}**EC){+gF_l6 za&{2)BN?#8_>eBi==PakYfU5Q@?9?xB%HaRgx@TWg}nq`Ng+~lFYu`_Ar7}Mb9?g9 z@fh`nhbZnLr0W+hvqe*kQ_i$<@jb?w5rt`QVA`c8LWV(vyq*d_X-0!fAN{zGFMs*V z_~tjii68#dk6zm#rtQ9}P@jcG^p?GEE)6%mh<01qvijO^o<`nf+o?QX6&xyN&*$F9>&^HNT$S%f?@oPnU+K z+wg7r3fGp$GS}rj^K6=2;$L*N;oI;*)BIC=6KnUAkaoW8?7B%Ot7_R{RTe3}_0=z7 zdh!tctu64h#A!YgUBGlwiB3fvF$SIp6FPC^;2rl8(Mxc9Y=1DoaL|Ka6)0v$pndyx z?BVv-5V!YsvAZ?IXtaS|FG0|Y#TYP(%^51xyjOmJlKguC>d<(Lrmrh_bc<5K^9%7D zT=Cd}(kyp*jh==5@AIRl*>R=!gPw+czd{gt$o&d_QNs&(^sey?T%9~7yV;c{%`-plY*-3`6akcUn zfB5@&>7^I2ck>3k(Cjp$T?_42Li+#mLKG#B3Z7re_dMrvv32RW&&Rs>F1Ky?b{&k{ zFz4Q8=lNZQz6;}~?K*80(;oEsOEzP%SYPseyt#O4n+b-=vLqDqwgyJZz zIo{c}*!dbiH#5-!JJbs7y!UhbS#Qtz2jI!{HtTgCvoqiGJgX zofhN9NDzwZ810 zS?c1BE?)h9Pj-O4`s%Cr&Ud~e!bIH1&@hyqlWEH%=enfQ$EO{9)4JbzF5ju9}|9ubW;;m=Nh%AAsG4ElWSE?OElaTh_L9%5_Gv4vq~= zfkA&*M+cAb#%tfiu-`{r<}w)4IBzn`MR?GrM1LF@DMYHuoG~&v8Dlu=Bc@CFx)Ni< zUg%?I*vC#k!p_zZTN?vWe8;pS3C)R%Vg%Tn_?M37g2|>FP3Jxw!8Sz+` zp6EjSTEA?WZ}cIu+|`Ix8XKBtg*GL$Trat@CIVDu2^Ej!<@*s};M3ojI8cFC`-tg* znDtdP#*-99P|4CB&$p-0p`c2$DT*=>Lq_s0KE%YmekelccYf=)@$rv;9NW7)$g5lq z(c&^8cbBOXO#6Ol`^j_Hr7$dKd=YFHjjPOed9c&U>oOi~oOO6p`ipS1Zo3XUz6h6P ztJJZKhD}HLadB4VsSQr^+|aH=%j`TmzLuQ{8$p8KEthG}^|j{x(pNU0TsCu;#_V#p zw>a=}2hzK5za`sXpS!V(>6nUVx<}!Fsdgqb?#so-f^JbLSg1$fk+`%gp~qjkQwdO_ z??)IW0k#G`>~8kOMM^J;WXBfq0?QwmADKg`$Rh`5y?FSUdFi;Z`f9` zN12-QSa?DwXG>hJ;*5lXm$NnsFXP10cu0QZwb$_WowsCrF)jV4S&A?)KFdUqYlEFo z@0mUDXr2Rl`cB)h3e$z7a zP`OUru;wX@QZfan4mzOlT8I-89qd*~D`GL9@A3CGa0iAX>)W-!uiC%1Wl<^R( zgV_Z1F2?Cg?VX5@X-eG+&zk3sF1o`nOPPffMK0~|8i!omn9z$OeBqV9!UsO^0Svb` z#1OO0Q#l)+eMp{ob-jmLzUUrm8DYEVD9pOys`a~dyJ@Xg>0LFSO1~@Y;-?G#GWqMY zu?^Pc)lQ#}&u6DvreRwf+%l&1(hn+0uX2M{fl=bmLinWlwL5p!_7mqKc&pN170#WJ ztb#{pinGZC@4fRj2E7Djo}nso1OdJC@_;EbKypT5yz1tn%%1@OHJ z!z9LbKf&JS5H~hP7!7&eNdj5kiX)?V=PV{3$WAejTa2Rweqh|Zi)~53^X1JM^EC%? z3QQ`%eJbNUQJ~XIp69MpAT9b4pIeRPN1DE&P2pu`5}ZMVhE`22iE$f4yB7+;TYKBs z81)eNwalz~y;!z9QwUMt!!Su=nUS16tFl>uP9b|TbNRw6pT`^Dehp=A4(cKt`@;xC zbC)ji3_T0a+@fb}5r19nU4*l!u64@nI+TyDa1mXbP8*y{vkgY`Tw03TRj&EVLYM9$ z_?2}gHW5C|>r`UnK8^UZ%kNj{aZ`>%`b+Me*;SU}>z@x_x#A3ZF3)vMVUVodj zJ>r;4RNT57ih!YII2|lfpo})mQM**i_oEPdTReMx3p*Re7Z>s5m&5>>7{LpS z00HBi?Qm(S+4<+4I&$>otDg&79C%CFtR>D`1gG{(qm-B3!p1^g^(K5~_zMCPvJNht zG2|9TnO!lOaWjETc^apZToU7fDYfWL=#VlS3~+Ef#m2}-T8=>lK6e1f*5c7n^he? zMH-7}xplc|;w$|{bX;EB=(sSNR{EN53$<>Wt{rc~S(dj-y)F&KQGVLWyUJ|XHr_SQ z4Q)J)D-6?&>vd*k!pv2eSqDxldfMTt?Yaz~cE?_Z&XdIL8a9@-Maww|KDc`iM+b+p zWJBI*L!$O1gcChSUXZd@j>$42I&!krw3q65pml;?@QRNsPYOj?8J%(2-}p zQ=o)Vg1FxkD{~IG+^Wl23F991Dx!awJ88DIvIEv_7f2fJoiNKcr&$bzP>d=S#ctZOBz%Z1{`B*RA8a;h#hsw2pP#qIj1L*R5CK zHC$GIC`-pKl=Wp|zjWupn!WjMft6N#D@&p}xXTx%Rme>^HuDxM4V1ADP!#T-aW5Mm zvQn-PhMTkHT6VTx<`Pc%oI{i@|Vydt5_W&?e%E-&dWFvXl>IRQ-NsZwi8{|PhVo;t@gb}j)XM@M+|YhS}h zzwcw%8Q#ETmdWXoXwI;2m^>56B~eX=oI1ObHeMG@7d^#Q{^xL}zgWJ? z^U_r>^OyDIBHU{$(}s6dFz<*ii0=H$;C548ujHzESk_(S?u72;`@IOeJKMN@^9F`Jx|HvW2jD0Unpw>} z64D@X!DaUg<6VN2ZEX9QHt`Vnv*l;fVp~G{lCwYKXwul!u$?r)&WEtJP(CrL&c@^UHQH~wTC9)NG| zY+`R`Q%+H&lA7iG(F1S5I>_6p2QMTALHpU`I=oIEtoj`C^qtnJW{7VpBZW?11V zP4W3<;Mf=ZX_=cQx|T82a-JW*H5y`fG{PuOFpOg{a^z|7yeL@pMu}QwqvcN`blc#j zp9Bx<)M4{y$4SFYFQQ9Wea0Cs{}=?RqSfY4RdIt?d{b>T0H)5Wiwe-VCM8g`of zwJuF}*-Yu__(XboA9P@*(w+JIGM*iu;KBX72x{Y`ke1&HpVOdEoFV#hgf1UA;&ITY zuB0e)Y$QImhY7YvL(rClXSQ=ott#HB9}ywd=qzYuPCbUuG4t|s(`(K^N^2&?G?(Rc z0fa(Cc_f{-i{(;B^W13LIT!G2v&3d-7<_AWWzHMuX*fonW#}adb~i^jI2mJ-WGHGM zN3%@Mj^E$kml+5J3Hyi_>!xn0ic8sw%rfecD7f$6y@%1p7W|lAhs~w!&~|D5qL4T? z--I=J+Eep)W*ObC`Za$UA1v286i3r-xGqdrnm*RPn=ZC;*A1%R^ zA9jT1OQ%q;Lm^@b79Bn9XF}u4LJmtd47VHWmzkZhJbfsPTO3Tf+@!c{vZNpw?+^yG5UuE5-y)J!)@50q`^4S%4%b4aE zpg&)UcZFBk32n6aqA$AahAo2YD!VLx7u{9!pLG4p`g2vjZ8*}@=Y#p$CN9l9y!#%w z+#<6Mx*nk~EYCxs4m3sI;LDCEo}*4&4xY2w1W7N#?OQjnyR(JSpeMEyy+I!l?Ji=o zV@m`{(9A?cVLs=~ZtJ;?B(4x4-z|@twyP^-ZA7zCIh#A3(eVrww!5)qu|t_f!7R$TZ0(W*%-5Q0?`je#!WsQzi??R%V#2F#1Two+_G>7*H^yuWjRB> z&7F$&jERd+#BpE<={S zj3?b73dQ|9-JVeS%<8G|+QRJ{H?h63c?!p4bVW}R#_*yTK3%fV z-xX&ljgngja`JTMCreQC*$H`fe|FosE9(rtOONezXFE=s3P}Aj<5pg^XjjFgS8_XX zgj$3S&>uwD9`$5)LgUPxogERb$% zH_kTNmz&nIu6!-GL$}}TvUTF?)JeKpZ(AMf(rTk|nY^c6e;4mIUtMwH+GTBNmpos@U+r8Xm!=^Hna=wSR?$gc*%Cjedmg)_G(ubuNu`D2^VP*+t-Vn|jwX>EzolpU_=m>2ONl0Q3Ku%cXawaD@c@CE3^ccFqmISeISi zRksae({79FS2WA!!_XYEZM*6s`Yyape@@lJ$iF%rbjvhtSH>dVK$!d2oVg18z`z28>1NgsKg-g z(dVwMUV;f7LGmbDFQQe6xDugbMcQuALY_t)Uf_wcUk??tI_J@WKZ_B<&07eyrIP!TYYl*Ih++@3DRV z<(Y7#tQ;n$4@=X>R`N`gw7cG!Gk{j23tsu`Dkq6m>Qg#|w`pnIF1Og4!#2WL;a9EK zrgfRP%b(2$>1x`A(>k?W(+q7`x18@g^Yj};H*+c+^W8C3X`k-qG6c>JybAQa655@7 z(KcTNjf>X(B=PvXsM45U(Pr>6ZszG%g#BQIPl(B6U%s^Cq%VHCC}6mR!&!>%+Tv0f zjUEjSXE|mjM7q4BU#%CL^_!ph7&uKgu2l4kN$-cg9H+FJ&LWMZ3Yw`(>vpVPU0;$5XE`YABYk@?iC_1rn3wjSalZ{2f}{r zi_^oM?U7l&iH)lfE_YFw@atQ?ei~yz_Bn+L75nfE*#-gbwdm@sTbkNi?Q#?mgpq*#cjVhlcXSMglAEt$a(Z| z2lg*ucT4-^{>;8!KKvJ^WT8yHUyM4`_1lU~s* zRk_Pl>?h7j7_y$Pe)%i-kstbD3`Rp~8<(v}gFmj%&8=%L{=`YYTkoHpw&Pj@^Yq?m z-qQ?ie%$zz;H#~VR;~AG_oK_Z>A&`I@tiQx7jM?8PZ+hhLn+ z#W9!G-3*u)ufbq)aIzn4#%XNFkb`eQy#_+0c_Ddpjz}RiNoU~6f;=OggCyapaHb%k zK8I<0SC#T9=dAla@?ySYsqIcxO?`AZB1==0WFlA$9~2n2+RT22%pAbj#1KyUlE?1W zwCgBPWhovU9%4M5;CMV1e`6^<`ikq5QrZ(o36d}n7cg`KLqWlIQqRFz7|)|;Kk&50 zD4-auQDjp|4|;uU_Dk$+4DjxQeG!sWxL3^?CtPBSlSF2JJlli@p%fy#rQ8a@`0KBJ z1NZK}i|!&euB6;r+jgtF3;Uwp*@s zcI9jNRfbnpm)$OxKbEncbuZ=34V8}4wCUS%!krT)%v5HTfD(K^hi+Tk^g3<34DLGh zJWH@_GoK56HaI|XCl?1!D#$rra^NgDZgSv^%mG;A@iBIGwqzSHbu7dqjVvp~%{uAw z#}fz7^($>R=%mq}nF~rmt#}6Oj+poQj z7hZZ1QGX!SQSh5`&V;Vke;4WMGtji|G+0!23iJdcUHrKDO!Mk$*ArxUVO6X0r*PV? zMMT}cuwiX{o2JTt7q?ZIC_y2xzK~P&YYE*3TuUVlQM)sl<)*K*?yI7`oM#>J7T2i# zt`8NVsWUOph$piTZkrA1m#g_A=HPxjKEj7yd_lgXsb7)VNl~NBD)jq9Iog+B*!*#2 zM(8yb^xUzfOEyx!Zbg)tMr4M}Y%GgL@L%%%)%(8q>6n+U3qQxae5|c*JFhE#`I=X!VDmsM z`+aJo;=;GVbmc9ht$1388)`X2mhmD@g|qV+Unooj`x*RaH)a*~v?Er5RhWz5DDHPt zsQsX!wv7)J4{+koEalKPqT*Rq5LfTHS#ILtS5!_=kZ=H;PG^GC>)k+A7(+%167#iP zi{(6x=SiPGF4wSb{$zPametIWztk%f&F&`(6E1nti!qm!Uzs--7g zGcfz&xtILWy*ue~_8>xr!Ybsll8@fTNDK$7EJK;47*D67sAn15P{PM7uTbWd@s=#k z8vAn0FohH=?j?N`o{y80BRL>zYjY%LyifNhvO|t8`;*=PRe2;9@?0+Ctd19XmA+_R zYTBMWy#GM-Qd`n4vy@2wFDXZ~+fM7#46UDOJFeyLmyo>M*OO|?I`zo2YBTwS<6XSA z<%ha%Odbia?&UVtG&vX=001BWNkl)9?0(=L4%M!pK&%ya4UU*Gmr z?Hu?e0G2>$zcRF4N`j~U>DAV|=l1yv@SI=UPNWsKIiG`Q=jx{2!JL$`(HYMBdd_o} z`*Oe&*YP>%=iK4M9ZXe)>EQ#}b;ZN~cxs?u<*4%jT-7g1fHoJq8++K<+`*&rF%D1m z5ri?qBt$kl!Kl9>Jd2uKKc4VQ~Y+L3RKbNp%AxL&nnPYszSp2`sQq_po=(&gf zV1PVNWd~L^JwkDOh+gDlaBC#CC~-|)i-(l@BkI1Z8T`CJo>i#I6kgItCBDUE?M-Gx z8&MCFG{uckA201~hz_a>dNPZl$K;daeGxJg#8D6$-HS1wk=Y7oWZ7(rgU65X`qy5? z?OV@_r+|RQp+1-DvQu~WT{qpeTRIP?&w~3PnRH#BccNiGhx2FZJmp1jHl7`Ksn|4F z=BA0Oc^bFr*>RUP%ebSDS9|Nvo|fd|3!V-%ZG{fMi+HioZ8&Y4UA|7-re(*KhMULw zxb)16U1JSzPj6;ICNJ9&+Tdq7T;4|aF}=FhmzLypv|QoDw8>gPi9m3(r2w4*f|I$vDxWG9RtrZ7d1FN4|7KtcXWwv#S=q4 z4vO50%UKZh7_(_A^jQD#I7MD%$g5n={a~AU>S5^l81!h@;ftOjFAIcR(o$nZNtb72x9`)~)A-+_(IDGHUt&Glcg!ZTVc^z{J=vk%Z_`ki%Y^2gz6^!y!(F({<#xFN> zilWApGme>|J(dzKp)&ux~GV zwbgMMy2RB_HJh)tdM?WIGCaH9Ww6&#F3)E}_*9r^r)q_6TJx_X)DF3hI!XIF=xRT> zOHa+LSc^|>8BR0SjA-8wt?f0k>$~c@R%oSc-5mogmN53_!lL#Tla65k#-SoRJVGk zMjYd#w>Gi8xrMFK29i9(u66l@qD;j^TAsI-1OlJfELI)@1ou# z3;pz6w%-f8+>L8}F1(wsY2v%EO0$h0yUfN_dR?>>Z=LWeX{}T5B3NxFVNQj~B81D7 zu>2QS|3& z2Kp%@f1FuS0C9#?R;e_FZMgs7E*6egU-P_}=HX5>O1!=*Ev zSH6fU+@=&l9Ywggvw{0>-^Gu8{1eDFcJOF(6JxrKk3-Ncf7GYW1TxbS0Y<-HY==0w zjKQOeX?GGAiP);piRElE!^{tm)|G4&;OvC`%+4Y%O+L9^M?N1vcqp^CxR;>jZZ4YM z&u`_tiBBoE^j&D-OL3&lE#<3bk&e=E<2DV2vGZIWR!!S9y5ep1*|5vXZP=$1*9{s# zs2%fk7&%`nJMUTJ={%R;J2{-0(7_3pxcD{9M~BL7>Oi<q;-=8_i01bNG*$M8HJ z59}lGYS4y*x&jIjk6wD~LX_YfeQCGC-F3!(#mum{TZe*DRqH57*ru{lhT6o8kP z;=8M^jeGsd^JNK<{>Y?{y;^1z{fIl)N>IU{Q#jv0z$A*11tDhg;bFeW`Hrxiw2jes z=Fy`^a#|x@tMFRBQ%k_s`p0@NGQh3+PIu8){EO7B4eX+=&Q3HlNJnpL`5+X@LX3D!4sQ273;M zy}tRvr;8N|gTcn83_5X~AZ@JEDM&;R$QQZU*+oIZU0F%olWnbKIhF0O+uOSWtIi+E z07V4rD)Us9#JIUBMk263?5x()-Yk2PCe*=$7ANNllVsmd3AO66H#UlWP+h6_FpJ94+xM49DgIj5P8h;?~Y$xJ29j%CoN zGCK;*Y=tK&(oj6yTECr(-73V1x8 zA|Rb)gx~w4-@xH`jN9W!_~8%j;XAJ%$~Ize|1ErYFu-2=NE|l~Kk%47v93j4Cm*Jx~T>*j5Q-~2YlhlgU+Ifw!b`aW*%Y~kdccM-~olhiR$ zBM(_ZZ+F`pdA7~sNxLC>N>eLYF>J%L z`-x<182kR)aBIy>Y{WJ`mz5L8W~7ZqTiz;k+wiU{j~#p6Jhk;xTi$iGQR#B<^EuG+ z1D%Ew{2;K7swGeAx+74hh8!-dLe}r8x8RZ&cVh8eciM?;#b&1$XBl=sGH%{2<7%F1 zKQae%QBT7ef=``6$t9~q&ij}Y+-EirSMPN67>2An69#?!WyuzW)b4fe&uo0MD!c*pJ^9zPQCW4g>Ui zF?x*+4RsluN$`@k(SD`bQO0e|6f$XQY;_pt+^Zia;^XVRd-t)iljDTTbv(k@;|{eL zW6oeA(|_cVZJ@BF@R((pEG?22H#LZVn&zGf6W_!C*njM=buSmsO|MGN#dFi7)0Wpp zzYDG_zm0~Sw+wGlzw!CgYb{}-NNz}Gp5%3r`YwXAs7>tPtETDJcir^e`WB_Ny?h@T z=R+h9S*?m}exn)RQehCw%!7t^JmNUiYex9Q3t9?*t_TbK*THc1YN?sQ~TF)XH%ES8Nv7KrgFYSo|e@44({21-u`VA7-U;dnYj(Jap?Ewkjw*Ml;9S=@JU+qx zNsd>(@=e@(bcp>R#G7xug=xxTfpheu2tW9-kKnoOEo=@4_~3RW2US&dgg6OBuyFv6 zqJg-Qk9fwq$3dJfNK_4P4%*^i%`L_h8k}kMhJCse#$@%vgmeEnTt7}C!C9TWmN%Oj}Tv$6z z9L2ZunWyQta=R`YR_Q6OrfqmP?!ww>!n$b}-%k5vX4%h1SS4=LTLe$IbuSmkuB$EH zMPFgN%AZue+n!bGebT(^1Est&tuqr2#9r;o`o38b^JVAL_~b}-QXQWhBArdd3FG+W z#K8Fxj!wpyWclf!YPXw9M$$$fvL%Whb7T7*OZYk1(w>6p@Fz7ho1vNP`M_NNag6xtST8_8El{m!~L9m?!yiiem^p z^M$+LSRVx~h4032gqt__P!_qI9w{@IMjJ_5LZ>vl=Qz6}@7%~h_w-`iNgE*EmkYdK z_I+3-uKnf0cI96b&c(ZEdfh(JcG!4rd0qV2c!Y7&il;PJO)H$zwCTFEY}m`j^|@9$ zGAq|5W6ivZ&~DIG(7O&A>+;CXTNh_tzLmavqn6Pzc=NB)W$+g%=RhSh6C%qOlhK)Q z;Np)1GJR(8q3VZ`EK4z;yQ(MUdVzJ&sI0*sE48P5k?Dn4*0VDnT{(1W9Z0@1T5n~&$e>Q)hOOJ zIw0zXBAyX%1_=(}RIl?2o7)lw+j<-#mWFRS0hSALkk z(lVDzK+{^WO;F1;R2WUW;Ue72z+NRTZ_qk?x^;iIq@@p^rfJn;_}wLM+f+WKmH6(rYS!8 zV?Tn;!2r>4fLkxUfH>~qt6%-9oGri6^D#Rb1e3* z+;kiLQ<%2GOXiWb@?w)}%adoZ0lKg-(Z*Pj%j#xFUIm>+^*rr< zYU7OqpNypPwQeBDCm$jiOq+h;S3C1*FOl?n0;oH>==MDkufpb>kjdl((XhsY$L82y zeMlvg(PwTu!Myk0y@xkmzk|Kq+jwDP6O+R+CXWvATyKDX_zV9n{^HL+gMaXIe;42Q z(igE)m-x`fK7wIV!QYM0i+3;>CZee3IU)4f#aWZl*axRdakhp0YuhwVYx;-^^|D05 znTVV%@1Y+gBB0Qmmtur#qjRBP38+i*5PHV(qj-yvO$*H|Ms{^Yn4TQUjK}9vA&oH` zy~(4;@5n4;cW+zje*E~c%$E9bUzYnSuM+zezhb`|8y~iTZR1iG`%RX_#LTqq&OY0D z?0q1kMN(5;%8td|KF@M4VP!7UC1~Ka6DAi|3oqCaHYQ zmvw+?mSQmUP^3qw$_)MCO*}lLGJA}hy*>hZ0j3kl$PDT-2J*c1S%ElA@O>ZpfDDvW z>{EGv_^mG>edn9ldijU&!!O>z^!NZD`N_YDtwAKT%5)++k_^7Ma_7m1wV!}{y5L3V z1qto`#5WdqU6CiYM`QzqWmbz3Aua3kX2%o@t!%ZvhqEK<%HfViX zZqsmKSvKEzYeUZCZ8%y7q1x)1W6$qn8*CeG#ciW|Dokt!6oFw^z74Y|z6{?up3$g=@o{Y0uDo5@5y$JolmlF@8Bo;dt zZrvq44x+O2j2}>9jA@kcRc>BD!tnmMKQgG#2VwN5{m!&rCQcX{pP2z%KMhz$I_x9b z?{F5!K4cy@FT8!{4mc~>-QC8xN@Z7>SNfQwxy)4P(~P<)k2}=li-0wh@Tx%0Lg5k^ z9b|T0#Ibqpf@8k&x(Mbv;Fi^QUFB|j-SjH;+I@Qw{8j2unCqs$YCTIW;FVBU*kQme z;L@SZ%%lr{-F*8dt&98J4!=&{DD1L9g>d|nWu7Dv{Q~3L+uLG8LQ8EfaV0!JN(MR( zm*#tl?nk1amUGTGcXq^(kgi4O7K8#Mt#WZQe`D`Cv9gbY!0d*if<<&L0g9kRJTy)l z!)S_l5F58Bje+DaHUls%!nq{n#awxCAAA!BZNoXIk?p2>8=})o0BN^qS(pOqls66kYtY)tvQE zXmiI{na}W%55I(ueDuTE-FpF9SmEIK1ScoPRSJbH1ysqU$7Y|u*~s9*FH1RBhC-Dz z=|_#%vim&eusz0hxov5OTrGFrPe%A&6>X)f^e)P`i|5kSR=RMS|D?k%KDzQR%U>Ja z)0v4&oWOF~>mV*rOZpVArK~M$RroGA=IevgM*kvtTGv(6B|W9Be7R}O*Kq!wt2vho z-TK_LOI^wvdk}sJC(ZdFy0w;qg|iWUVFz9*OGR{Rf*?Q=MX2)}d%HVG`U(2OA=23l zLFkDvx_|c`?(gs8!&ME=NjPA0S&3$lWmSmlcg`fZq-NHfJVb@Dnx{ftW=&%7=*ccB zk6-wHDd*7Z`6{%WCvV0gTt;7+)v%oudD?!D{04obA>Eu9!9W<^GyZ5(!i(^vCreY! zK+Zh(C%{dc_`xL#dO4hHPKU;nS(=LHV>6?p;UbUQ9b+`)4mBUWs79Tq81y6Xh}@Ix z#Mt%tAyO_KqS-1ee6mFm4iEM*ODAHPUyILv<>qoB+qmqVaABC{wF=%UaI3aJ>m|I# zm+|1zcH7cLOX;(`s}7fzo7TGBe4DnybcHUi!YPd|-W0Aa?4n6nx9prS(TbI@o7Vi( zaM@_rwrF~a%!p3>&t#q^mezlXhvl@Aj>sx?cc4DCY?o(!fZY658RXY(+}uNMk>#Z{ z>C}+}E6@H&CsX7FU3>7TSu-=?POP0_4-*>FRW#nKvAH?I?(Qy5j*n#-=kflLY!M#x z24<@FST*z;vjrk+7;TdE2tv(#+aC10`~85lGUC0TzEnJu-_ z{$|i8|NQZ!M20Nmx$$g^y0ovVQp#!bQdcxGq8FdhfK&OxwK5&2|4Remz}iNh?je-nP6pWEW1;ZLoHpU6-A2 z$4P4yI2)%cu6()lG+*)Da?NL`u!~@9_{+vG+WuAXPTvF~XydMeX{C4Bu!|R^YnNXY z|2EC5j$g-vqkYlVel5F5JBUkubuFKRt&Tu~(Q>ARS%*qztX15p(3MrhzFa{zH^a=bZM&$>x#6$NZ z(P#_7U;`eN_&qvf>=~gDhUn2c-CBAgUt-I_nN~B~;_?vlIiSmIrq`1?Xz!u8+7E0y z{eLl(c;ixr?RW31^a0-~6^hiG=!aEp?HmgN$(OU~Ipb+&KBLhF-g)~y#Hg^hy@8#L zk$4cMbImw1M%!Z38gC1i(baN>%dRdMH{VS!qidI62G^$36+cg(BEVk@W4u%zQuup6Gxr=zpB&}Dp@Em**faj+3WJj)J zQK)bSSrl>5=UFEKdi?}(OsjS?d!leqI^^@z_Jg~p+A zqRv4L5!oIQB8{DhwvqX~H0(h&~IKks{O~FUu>_xc!{ELLf*T4Kl@iVr& zxq+RnP4vPD`79T=`@SEZ3UH;zIS#j89~>Nr!RTrJn#*gi!jb4Ol!YF^_QPUbK zj2$x0%kI-AOY(@DmxcH#`~TT{(Y{I~dv{{#D*zt~~R3?ZxtTck)qq(qU#BLD(;55NN+-gfu7ch<9Y_vv>0 zvO4F~^z_+gx%WOi^h8f}Rb^#mW%tRfs;tUFv2eyciWjBx>Z`BI(cV+(wqtd6+3Pq( z2QC!e7&kT5XpoJQMhEW)#Sbs8>S}7wMe2H%_?qf!N;_|RE(4e0AY63MqtVJY zf+ua2G7%r3UG)MQU%C&(N;l)NoxuiG5B+uO2|!l)yMM~*WRl(smMX|bW_onzD}!%*TD$|zR@d0FO? zF}k3~KSfZppCpr{mFWH#HXwE)6l5u*GMA(Av2@yrt~wj+aa3<0VVOy5nhT!l$LT~k zhB!&Ox?vHQ`W(2WBed!OF&suRWu+sS5(kc8M<8%^d#tO~;AzO2EF3S)s3;FqIZy@z ze4eKgNhzC~J&8B3>&cBfn?2bbm-67zNZPGfCgn)-s3RQ|r>?f+#}nu=$U!)fhmY>b zV7M<)r>)bB*tPJ;9EOg6ymwWIXTFZp35~xm13}Q)^PI3Y({=`m4hEP0COl;J8(}%d zd9S8#+wfYR#aFGv${BpUd_C^NlSjM`vn+0PS*QoLRS}P6n&RUkZ=Q59x-2x>K;q+Q zidR*isqf@X8B!nc=g&?fFX9b(i|%0Zu~x-dbaoE z!`U-!L5SLD>%`Who{2HKI~x&as>f~T#TUhiEr+t5BvBrKLxr(tFEQMfUZ<}qjvYn$ zR80%AYAg<7P21VIuFJ1?_wYG(LmocamB)L#YGXlZB^-do_g5(h8`)9MXfRa1lFvnG z@6p00dY)IB(P{P98IDEyi}H-drf`*V24f+3bhe;c7O%^5{7kE; zDb4cch36?V57#Q`)VE*|atZ}MATFcP;-`StjDYLxh-5JmtA8<+%UuU{6?_+gF#*KK zLl4?MA`_}AKv{j|`<=q82#yYMl^${=?S>RZrUvBgjlS;WPQ#Y2K4O{hOSkW+5Y1Wl zM3+8riW<6`-k0&mLW9w`*-dys)w2`wPLU`Ko__PxEgR-T%0;H>Sjudy8vq$o=xCu5 z#HJ`wqTt$yoof~pEOBfe3SWH{!0V2Z>LXEGj@OkWp5;?rb`0$u4&a({wn-!#{VfTj zKsL7e(rOK)h(-SNFaBKO-c7-!7#F6OHH;|@>Ol~3 z(^F?^2lwg-PcGodBW@qDhB!eCO0}~v)xwCN9R@NwJQm3_5xfbvL>}C`r>nngo*$8z zvmL#Hf2y&oeZX)f5-Fi_CdDCLNkF*rVw19Tv9=Dbk5LrsVt<;PJ={9(w(_ zuE$;c=H{lh9oqz60Z=Yy+U<8-D#Zw$;6h3A4RI+A9dje^R+gzhux?MH-ln|r#%E;2 z)LefcZ;f1MuYqN#u^Qk7uCp&=NIi#-qeU9?IL## zokk6x<<;Yse%|mr_?pUC8sT{^zx=#smdA55pJ1Uq6R+3p$NgvMJG0N^JVallOr4-Q z+v*>E9e!Ee25)%k@m0&ugEM^d^4CqjY<%n1Ux!CQ=toAcyDZg32g-!YXeG{B_xW_9 zE=riTA+JDq<0gc&HL6ntr&&wVG?%E?)BPKhESG?Trdp-!Ki!qB?Q1$J2*OC0>slT5 z{)|3Lw~%yTh$AOmSQ*SwCMY@1rY~}ds~?GT1;cUkQ;~pk*$YW0sVX@(j#Gx|q+&c) zLG9X!E{N1q`1mU5yxAqQP0?Eq?OrUQo84byBvTu||A`;}p8fip zo}1GAvTW|PYpKn|2($wA&=-YGuuW;FarhWc=hS1%an(zlWw7CBdKqU+pH8u|r&HI9 zEyA%VZ@pSB587xlej!W|P6%T1ET0 zDvyk1#S_j4Y3ZJo92-WbD@E4QDXsV3dr!Xgoo~y{n>Xcazx}(~HqMhr$#9`uoifRF z8Vg#e(|6_BWHSMV5gfE|P#05RMHI=qAATSYj*g^1oyx6OUYFxRD*gVpPP?)1Wu&fc z0znV*PPp@wvsywKGYS)tCy#e^q+{<(6=6*f86SP#`p?E&KkZpPD{ZTbheoo%u}&MV z8or6hraGI_{IcY8HMMO~o{z(x{krPU{BHd;%J}&Ce(jn)S&9ejB|Y~?YruI4sh6+E zm*JfUPx_*J8D7huhu`v_S7;v#3W6KqiEzSR!c80)Zk`cXw1qfx_(`XyJ#VIlCV4JQ zYe|Wr+MTz74I>**w0XDy84rhYba0>!42vw)bmQ-;JgD=MxCvZyj7VEh0ORpkr`<4E zA0He_I!YxSXEGX$C7n1SKNt+uHiEqbS1{N~?%lhmKV;fSTMZvLdFDq>$mNf&tt~Fc z{V?$mfDMZ2Ev6DB3Z=WbCDV2+asQh9!Y_S69zJ+1oBd4**+Qw`T&PoRJli{9bVNI; z8#|G0GBrA^ZVOlC=d*%?uB*7##e3E8O>JDa&L$l7G;l7v>t*J}jXnzv&d0CEDa>Ya z-G@K(X?k|whas`Bj@;4-HLupQ@PAkeQ(LL7bIBf(GuuqOymcRqR@3Ih%i2B<%QM{U z30QRb@P>a?c;K8D*|R?)!&TpRQ^&o^J{6zFdiiB>HR?`hhH#ugwb^aXPV;FlaU?Pv zjie}Dzl6G&{-PYu(NttIWjcmlR9lKXmd%apvitP0y!pm;DO$JX;}1WQhYugi(a}IQ zjt8=N?S{PG?n}Gdk+9uSeA6PUHXJ%5HMpIS40P0^ZLD0m^UUALx5LK3O2}iQK;Raw zKzEXdK`#06NdC?L@vr1N-}<(E?RS4$e&-MVkzCu^R=il}H@2?Ho1goyHM z0`c9&QMzTdQ4{4EF$LDr(ExRzY#BkQun$o<)if2f@$F&X2t|&DN4gheGD>yx;^6RD zve8(&QCnWVk;(m!2lC##_vH3=BvZ*`lC^Y?&tNc>Fa{TnEMv)vO!6#M&&ZPHG8*m6 z-odeSSs4~P-(^YSR-Um(2IZp$rs^ZGZ*JK);pbZ!<-ebCY0sv1n-TiI&qXvSzZ(`E z82w=P%g=*vf+KAn9-nF-#!s)~v^?O08qJGvSUC%65BAPgF2hS1d)9JZ{iOT(7B{|~ z*i7mb8p36y)O5uO8Y_R2@B%#;6Pid`l-C4rX%}g)|AGwPWrpW%6Ex^v5{{j%gr80g zRfb;j%4#Vv26JHiUUJD0xOAfy+L*OO_8EDkBXtq7_jpgf_zS-*Z@m1fy#N0Dx|H?t z!$*?k-;x_QZ%U`{6bVX0`CEN#;Ife@3A&YM>axoo6ndx$zWybaW`iB$Z$P z&EJsE{le#^ySbtMu26`KGJ?<6$v!43oCxcnk<4*-X0f#^>IYzxb=SV+fS>1)9J__YHo5&A8_&|Ca8!|bb$a_Efkw{s{=RfyZ`K2%XqP+I{ z%Q8ua^4;&gCF9|N`z4K}}8)Po>KaGwa|s%OZkx86=wA}9~02KI^M(^TEM6Gti0MpdTOr~sc@oYD?m+*vV|ah6J} z=61#SY9ULH%QV-`o!D%!!?5b?AO6m7%NIWXIT;mg`FDT*SMvDjfyCI5D!*kI|5dTK zY!Sh1NjCJs2l#XUqYssb`0OGbC8X~BS;|@2dyJN!_3$!(r|aOV!`9=*_eJUR@~rH$ z3g^*5`kBMAX8ox1kvFfh^I^MKsb#c~?{yr{RJKa_Glgmi%WxPtKYSmy9yhppxO^Jy zbP21&7sRI_PRD@DbB>dBJ$g3E;iery#9V(~r20H&^Id^}a)Jyj2(N(EO@*5(BtB`C z^3kKmvUfO?&u-t5bhIz`KKfW*dg&#(dF!TJzja*>j}PR7k3N*~_&_>wS3>q>;8j@N zlSCpdmNlVNSV`gr*R%`#1+LgjCrGU&E_j5Aos!0C(H zW@*XONB4z2GmOuIIF=#HoY`2z=wvk3(<+TmKM&XA06f0xYgrwBzI_K5p$U9G9>ZTx z^W#=u<208c0BAY8E~N;h7*d_*@#eRBzv?>3x(i}a@-@tk5^V_|s zJiT9f+DzT30OsV4YGi=$%Q@UBilod^8ILEDw44DLSax8?{jL*cfk;NL9T^@*@||~n zAiwYje;{|Z618UpaiqSlI9vUdm+#2tR!8oB@Dus`uiTKJ6-r)Cr7Yap>n(|-pr?(a z#)^2jM4PyE_k1&-~P2N#mlIQg#ptn*NuO)pY~vvK!}gi zT%Auc3Uj}Z%GErsSWs&EgGA9){;#I^=z>^AQxH5e%rh02w@Mj|2NJZ~a&UAkA3u61 zc@*ne_xUuG0Nac(vT|O6;rDQKtZnt%7s999E!U>4oF>1&`$+b7AIdAQz9bnZQ7V0I zqh>xGFM9PqlX6vCD6ZrTb|HH!obJKFZeNn(8{4<|5PX zc@-~9w+fcQU1ffqhI)Ka-K(^JU3`n`tLLrr5!B1hi?fWB8^L>?oAx5SxDl$*h+wtp zE#fu}W<7t(0HZ=!*pq^bkZLLMltmAL+1}OFyW71h%8sp%njZPvT zz5ipG=s{4E6W>_=R2Dc-F7NxLe&F<+_iE@#8jAolWce)%0vJgYg^bcngfr?l`VzD` zKPA%kG40d|V~IKbH)u;cK&Xf69J1T)NWcgv=M=`$xi%@>ZwQ_+8iC&@qY{*%(o$); zYT*a(BrWj|){~^&m(mS;q}S;RixF5+Mp-TuEmb=m&)sfj z+B!Vmmmj_JwjS)2R#SBFn0Lhp=V$$b2N$_6T7FU8^Kg^ils7NEUWdUo;i$tBufx^j zR;DSPG)q4-&1D7G4Gm$vTs^)1Zru;8Ug~n=(6CNDM)Nvl>J%G}dirI@SFOk3)@>6b z6MEIt(sqP%Jg>;c#)eLF1=&a@>}Xeo<5pTBWE0exEF%kYDFlh&_<=y7S*#~XywD5%A zdUByVwpS0Ls+3zN>FK7)R>6_OZfY*+^(1bWlHb^oZp4Z*lw2aX)5l$Y#z-S@gZh+F z#6C$8~-O>%z}t;ktMXp72GvjHWt0q7{gCq-9(m7>lcIV&EQC6kGpj&b~-2?7^C&Bb~eal4_1+v4odN2owM zibQ>4C9bzVI6hX#i`RE{WV6@T(+l^WJdt#q>XPE&(NOoKv_nQKvlAS#S)}8Mo^{W8 z_u%I~S*CoNTuE4EHZ7ft{A?=U``+7n9!r{LdPtTU%xzPo6fzl&PjE3hH2$OXsfQml z?V*jTWQwUy)g2xj=xEEPEeSs@7reOWbs0F$L&LIqm*tUJE>?*7M5yYElZJpYO;uSOm4f@!p z?*wechkDs*H8nG@I8!Z6m+`fZ@2nN9ns#YI!bdeN-2Msm(G^NomeTGdl63oezPe0? z!Z{-&47*_@sXB86C%(K|(u!@zJa&nRwD2bta9~L&op?*$*?l6vm}k09q zMYUwl0gRV)Qs-kyB_m)nxFSpspAEO4X3upT2J6@BKU+D%dFeh({n_wadL2hSZg7N@)qO6N zGCqOz_~ds<8V&G1LVKC#5({PIlz>$Ytkj%D@K z%Te#TW$HMHThCYBeCVb?df9IGIGggu$F3B0S)CS=!)S)ywVMWW&)}r@%=PW>{!sqO z*ZzTYIWBuOEyywJnjvB9)EJ>ApcYM=j~dZ9h2cIwkx zcfE3_M7P7XM48C=a9>7G59H|az8pW@R|7mF4tiU3A=-H5ZE?;D!vxN}PvvlMEJu@p zJlcCAkDff0j~_pjYd3b}SHAl9Wt^wd-RMe;-Gm>eAA->OB^=}>&cWlu$B%U+wteem zN!ffzy@|6U!C!88N1JE|BNLRk@!R-HoJ9a!z-7}^_V%Bul3{r<7cksQbcw=#n*P~$ z{Ap_Qs%>4yo0XIaNUq{CycX)my<$aHW*PXZaP#n7wER50>!!n-b!l0LpY!N(b-Fov z2BEB?VwDrZ9zkXKsvKIZTEc*ix82#QF6iJU4aH*RDEsKiK>qZv-jaXv8^0!ZI(>;) za@z?d>bBJ{mav0kg8ESk&W>!fJMx7$ zJ}aO3;xEdb&%7e7h*4Z2oq3F9sW8I4m`cg-D~jb?-~OI-JAGAHLBMgtZRHjGf_@88 z8cZp&G+S4m;pQfE$_7OPY}~f}L4k}XnLK{{Sn_nDBg$-&N-GK^=>R*Iz)x+4`=*;m z0_2^1Lu-symNB!Aw+Vg`T}|*;nbt(_Qe|QdxJ<(4;k5Mn%c5>S?J{Y(YFyT)dG)N* zE@12U=1mh=ef4PuOSiC&&(bZNG9{zptyGsO2sD&JZ={jo?}cttcM&1Z~jIvR|bu2;|A$kvzTsP@dd3~hq&VBIwP8@Yl5+~%VeCxIb(N1{lj-9>UQP7`RD&!y0J5Tgq;7L(W`et zdDeEDKdL$)YLCEgRpljE_kNV}_|YSI@Zf>$fA~;#?>!J1OeExd`zRLta=m=}mbCj_ zX}3bTee0Gx0=INaq8XJJl)%sjqNR^sR&zc)9ERCW?cNVJhi-)5%BQr<=!9s_w$L@uR2UUf7ST9c#IaG zzE$g51#VS(mX1soRkms+mx-g!IE&A(NMF$R8RNm zIPWvU|76mi<*;n#!;NBD%5XeVw60z^jm4QK#Enj#5o)G9z^6DXf>=-(B^?QRiQGM& z$WQ;@KbHUEpM6!LjYR(X?eEL}_kJoL?>^QeY=8G_zawwFc1sW8idaS*#8S)=hQ<@@ zE7a$X4`zpWt{eUyKD;kK{qc`w^x!}w&E?L{4f)(FugR--?r4u6WzpZpK#5`fAr;$uoR|mtlK0UC2lTgw$<3gs=XEf+3A5I+S>t71{yVee_r! z+`TJzUVce>{Y_m+pq+umpYNG(&9CcOJiBkpujw?w_MUx+^FCW$^KgC;YSEAgd!mqUXNK#bubu8o^+(!zb^SClcd*`5B8tP zhlfLT4vL@l~KIUvXxL9mjI)mzYI{GiP~okydQ{N-Q2B{^G5LwudZk`4#zjy{YMg$1AS(Ub{s zeJ@oHnYi7wj|BoJb*f7o4k1gWn{;&a#l9iuara_I6Y5-eHTL!wmU!-&)+YZw8Bydl zrLUTAaLdA`dKS^O4BxZJKbJDGMy*5ODrK4&xK16bz$zWyV8y4a>38v>{uWLIh1ck& zG%x#Hj|eQ3Ks%0gFTLv#J2&$@Q>SwuQhDe_(FH7jb=8rNk=T06;N#g8ON}kEwEzGh z07*naRNQGfck5wSiV4TjW@-e#eq&R%UwcX3`$;ZA%(|*lzWeq&@|7>XDR1^)m13Gp z5XC2pqUJS@y1BH@shcih7dif^l6G6hkw`y|Bt0HVkQGw25z?82aZB(v!eL%vzsrI! znIM3ZSi;_xv^s5xx`}kVJ@tm1vurm?RKWAilu_W$dG}|vPAL+X@!>~zAD& ziZI>9sgLjgv_MP06+ZQtGNWF+GkYH*&#dHf?_#E$P$DdsCQQffz43h~Nn1wgRGvI} zBK!OMa^q%Od8cQmEYSt?`1)x`cd}uz@@V1%<^1>61Y>FIz*?C_;br5qx>ms(nSmDI z`Y%%v)DsQ+C52Z14BhPOt~a1=Y+mJs;Y#GxRVfl}uV&1C?PqDB_jY<3!Env$uHiQT z3o8vZgSQM9vX8{Bc`%k=4;}oBewXhd#5v-U_ZKeNr^2za33KmEUzNF@j~=iRC`q)( zpSB8#n3peI?>UJ=85b>?mW)6W8I8tjU*Ra*AaGMKPPwq}B$RQ!FG;&AdCrdZk(6N| zfA`}j@(*v`lCS;Bb@~4Hzbj>MM`8)3m`>#X{`w!wzx?n2Te-0lOWrLc<_wQK*Qqr2 zwV1L(`SHxob3TDE$AwDedOpHd(~=y+c2G(#xdi=4?IJotkiOzkA7f*1i1iboM)H#!~;yx`xhR{o3nziI-=-&vi%T z_20*=Zuivu`!*<_CerHhdiyQk(k*WI2raJ(-#oZ^={|n{*@w61dOmTV7K3XF{j!v? zxX-Admt)V<0}TLoqr&F7(Q5l-wK2xTsM!u0S_ z0*owJQDnVn>NWc58B>PPK0M&Th2XbzaAE)@52uN^M!}WIfB28zly`pgf&BLG|DpW) z-}|hT2lwS>IF;L5oAQJA-jjdz$A2mZX(^+@L?)x5;#4J4t?U9H^=KL%bG?yhy{*u% zcRN;tbbo78Hg~S6&#+{(FFl@ju1R-$OFCN{67@Uy)K}N~x#wQq@EQ-`2Xxr`aJ+L< ze(iQ7=_Hf4-+o(u@{^yaLrmz!{fY4rUNIs8hw&KP##`P4uvQOoZt@*ponkefgXih) z_@!L9>uWtI`NO8&a_ zu7Yz_n2XfC>dRY|mU(c{co8~%ymYV;Qj8|J5l*xNq4oM}pV7^DJaYzz2{J2ha0o6g z@YuyOG}8M-?}dv@z-+5+QyBJs!L9hFZUq^}c9!C*u*XYqp3C9kq5Sx#?`zK+ zyAH;3r*PaVH~3ss&LNxl27c0gXN@RNtCu{jFJ$q7^NNgnm%AT*C>)OrtlFdPltx$QhNWkOvDCqmMkFr3*@5NwnO#ss0!o~5aJ!p$&% zPenTYoAUj4@5}%6KmV`t{dayWzxtIg%l6G%^7c@-TAJ{W5MeMBN-1rOT}I+2a>WBne$Fsp=7C3JW3Zh zQHIqh10`XCpE^kAy%3smhc4=~@}^A2=|t;b>J8)mlgE$c;k|oO@`?ih>9-vSt z2W7-L3kJH4m*BUX-?zeQnxlq1U{N|en=%`ZQrXz-=@M!@2=71Hl?V6l%4=_YR-(8o z>a)cfbVVWbaQS>$y{hW{I1CNNW~1GP%nK(O?I1cI{TC)-Edbb0Zqvx{l@xuL&bROPSVEnR|O((cfBHF{Q>?XwZYz+~) zc5O%P5sXCe(?$KzOmCar+ZIR2S?`)O8=U})OO&7$>HZG{F1RqdVuUUwmT|lz`&nB? z$+k%Unw}(xk-rFHIUG;qVDE{HhXWZ6j$}MIlsv_&t`k7i#S{~vY8Ibat(iT;?|UgM z>Lzr88G5*&nKm*dMMxVN6|jE=edRX4F*2ZT_+U52ekX`HgMBm_IHBK;<>+{*u4jxV zMqZ5T`Oxu^Jov{ufCiqS$#}^7;2Hh`13Y{+oMqrnv}yAm^QnxEk7RIkAjgOMYS;&M z(QPzcMo2x&t~yLTzN~ybe^J}k#cjCibv)1bdD`I9s~sYKCsmj0BB4%m@!|PbJ?`h( zGcc>b8GKW?PWg3Uo9a4m+Ev!O?uW2y8=(2J=r&rR>@_;qER4JiYLg(@wSoTJ=b(7vycgZJ7S6WG5r@mU!k!fDaG(VQ{`=gkRnetjl-$9xxCHJ8fT>u$L%7F!NJ`QtGGHMD|OmSM<~GH?}`nW zOy}VlAaqksw9DS5wU0RIZdAnb-jR$3!&6Fu^GM)V93@)bR|t+DZdo%*0({!es)ua# zK|4x~vR0lv%GeZ`DH&`?j4cO8$FjG#r|(A@@$-LcaRB}r|JN$`jDRnLHojx~mW}Ls z+|n&P8JW}p>v1b^+2JbntO9e{bp0&gy9~Y|tXM`%2tMZOS$TEs+BMxvV*aN{=OZ?Q zFoG0;=!fu>I6@D6PDr{>Fp2|-qd+F(p}M?RclP56ZYA|Rb=I+l(^5JK9)L>;LIiLk z$H&JKSFS<8e{`^~`zf$XKod0E-SkeO1v&}2peu=DwI}Eal~JgBMsPoZ@_!T-sr~~dPC9Mm9uJ19P~wQyR)wV4nvz5n1oSa&h_diUJ&bOQf2K&l#k1p`QyNw` z>D~F|J?IRP%sEk#J57{CU=w(Q5V9b>-Fw>lN0^SzOQSuI+`evJS@W6EOJGdG1(L%WDkh?h|Q*J|h&Y zJ6r#v-exaq40C)H@vNqL#^;qJJus@@y|6F z4RoKwV0a{>ER}1$t~)cmK%qpULy2t4sUqrJu+vWT(5q=y=;$V${v(`b8ysD${0JqRG?*&Zz#Va&NvyhssmAVpp{2a|;}(4UxG zn1V`T=evwu>L@O?={tiz=euXwksM8?lH$)SzNQWyv%+oS+=ybyCxt|v%8FAuSM)`J zLWm?wbLnj)!oq}B5a|hxLBvUyZRzy-G8i1`R3i!mn~R1jwNN3G#sdM+sJy#2XltWH^RF|siI6X8nnP(VBbmOx3!?0!8eunzhi7`i?1cW zKkvMvCOpmx*p%bajFvi`^|)a$c#F@2v;1Wt_*TJT^%|_joACQM4bI8|e=6To3Qd!g zX7{7qd`Z(p#TscoacdM)&_!hz<*i%Kivn*i^dj`Ei(^%I_)QO4d%P+mQ4(fDFweBk zP0H35#&NgG2>g_Bo6cMhoe=<=Kofj%c~f52Zpy6tesQmkv7M0xb%Phz?9}za2Or3j z$M@yv;E4=}hcX%-%JBG5vdLJF9*$VKg#yT@dV>R}mN>19y_Hf3cFu@rr56|ams|ai zm9z~3?4~~Am=#u`dI8|9cIaS)U>9xVhE5gO-l>SxZ?Fc#UK2)p& zBFBS~>~uO3w{Ve?NE=};g*@FmlE;tk3bq#%U9Z0(K~x#e83iCjqb@D1T*6l_we?WO zKuMeB z%7uDcrJFi5WwE)rsVluG$4+?4G9_s5fikhTq6-D+rn6`#BuA=<4)^xu=wMIAsGU^1!W#C_`OrGb*L)|oT-lh5T zGB22Z((d`yYYiuGbLv|_{+SY&@j?yhJig6Kw{m_6ETa;RnN@*{i`SvJun(~L~?8*K$@=tm*wJXqB@Mi8b1oYHaMyHhr9 zWLH#sV^9*Em^~>hqfXSv7RrP;WhrwqQmM{U(e%(pGuW9pwNWIU7P7zpRCtGsP*D8X za{Nynx@Y5(Ro}*0IOE&doLP$Tc$V_Xc%p3=rF|V7>%i7ISTAdFe`@N?`>ur7s%>1V zOzK3{<5UD;S9SRfxr%xW|5f0=44y2b%bSVN>XyN;LX(f<)cdW3D1r+?MUR)>G#lJ#22W&xC ziQ8RF>DA^)9f?fcC`LyzrJGWseIYb4VyoPxSbL!n{MZGwKBnEOxc;Kp^Mc(e%T(Zl z3uTMaFy({KGfs>o&v*%b<2Tr`6HW3=`kjunSoknbUit%#zL2nSg)rZw<<{ITK0aT zWdIAlE350I607tiV}%FmU$vakx+?q%)t`V|6>h_OQc?Y(_PeEROUu-8RKwJU@W|vc z-l+Y!R>cLpHEz{1tHNC+?p0}6_R@Sjz^-zw3RlNv8^&=xqK4?|e0S{`=T5kR8$pOs znDi{mwWq6TncHiEZA7Poid=jAaqQro-DLJY5rlTxyRdjuIGGkQoJ^z@x=-24Q#OiX zkxozPZb>Z1<*^!{fniSz$}JmAbl3eP9!nG@A_3Dvk%TA}>YcIFo-;kq6k92hv9eRW- z0uPf2f--Z9k4}D^jrG?XQ;V~a5ju2rQxy(X4+Cy}0%l4O&(8AIj}Pv zv-c1k39?LQfBxYA?7zljn2!gkoEIIeA--n^C?tVn@4FN&f%J0-W56B z0H25CyIGm}JgC+$HPr5sBF+d2V_gc1(4j}o)Dl+oGCh{fULpsFM{3OFI9T1b5*9L^ zPDIjB6$w3Xgd7+2As8*rc^wExw>_QF1U42r7EB>Iw;`0VcDX62*$<8LIPN~)mo#+C zW0NqDJi{FddpHKtZew3yTCF3IZi*bMdlQrhbT9?Qh0UYIsEMg8iS+E0Qomh1S_SIC zH)yq0F=19Y*`H9l4U3H2I6|1U3NuHa;`~QNYdXD37mp}Mh+YskH^~Sa;xQ1HTs*fAe^R|w7RUMOSOHyZlWWRR_sn~ zMCr0ffPE)fI+nu+Kb7Ir*Jae%lAfLq&!J-?teuF%o=i)3MvF43;h+D#Te};;mL|*EJW9gfw3{#DOsnfIdWbm_B@b$n+b7N_|1FT>@-8rFK5dYm$TS`!X%8I0xE<9>Yx zV`&yz8H?A$#hk7~U*h~|1L~ENmNjZ+L{|W~4sGkeu1e~>4`J2vbvO=Wf==*q)6-=i z1*a6!JGML&g251CQLvsdN{GwKtI)G0!_^t_;6(tMk|Dkde{k_KoQzd)f}aaoxS3|N z%V+~HH+kHaZe?xj6?M;U_k$%4?X&cnD5?~T)k&yjylGkLA&m?EDUH=s8Mw)Zc3`k6 z5kjxkYjgsGGDNvB!U4|GfF+H~MjfQVU&BXP^4@#zJ-xBCM)RyLYuB>+ zR)t%J=XvB`2JKBan$niFZ(f;s={~-BFl#FlAL;Xa=0|ZE7kE~=*Qv|!tyAVQVR_m1 z!s)mzx|h{!c!1M(nQL{Oc1cyp0fQj3dhNNa>>rdvNTDcrMmPe?GeXavtqv1_DrlDx zC?dzl1I10fZvRSkmPhPd!1#1A5s1nvWo;gd940lbT2A@dgnk> z?aR|J$`-9cm&F2&KyvMIJzIMN_HA&qtuD{4MkZDUVTM5DGC>F)1Rfz50*)JDX@XBP z7W~8MA~qAe539=&`zB1G1_*iZvayemKwDS_+>SeXT(AjR>SYC&wL_~^S2Avdg_44P z=yE)$Mi{JCt9Hgy#!Xbs`e>9xr?Pp_eq*k^g}S-#CX4`_-9^i*0;~LhRa1hdR4Iqj zFlB*4gjdE_+CY0yFx2Ig3Dcxbv8c-xR*H!mnNc6d1RozB$ioMBtBsZ{J$7f=*Qbz_ zCojN1MPB3#=0^t(=;-wmJ-Z#-4+@WZxQ%Au zpo^PyQzkrPiy}m!Fxnu5en*3=lr+kqP{4^IQe{&eWOB5BAlYOj5AWTT@n|5N*@7o$ z6b?%6Szp@j6)Rl_c14uu0)viqXjuooj<+6Phv0R~E`ql_Lc5nL6Dzb1(U%E(_J?~h z?3aZPJat@6X-(7`T)lh~>^f=oQr9W747NNu_oEWiYGHSy6ZSA5jA;i-fe>L9qh$EV zs$mOh)>ed{3hZhF9&v7HCmo?_*DBv0FnNJ%dZ&1($FIwHqG7d9#Ok3gdf~J|6%5V| zt5sQkxzlzOqt1m+iMVG|BEIrKp`awdXLM0N3wm)0e{FNa8UJl0AuTySsY63OYQ}a?6#u z)q9zt@%}P#J_}sXz0S2Ne4QT_Zz|uEwhm2o*hTp2c}tZ^9r^Q!+mG-n>IU~J_d0bO zzIDo6CM+-6UNoQgqI;EkZ7Pd)neZpfC!9ax488PzRp{xIQlNc%aBG@pOee0w)N{`c zUg#y{;@M!9(TCtuTI^7*>IV%D+}9gE;#xCg zsYWW+4xM6BMeJ7C**CJa<&=p!nDmscDG%_&TcgQBo9eO=3ChD1A~cgv$XO|r0S9ql z>>cQ+ER59o<&&q6<>}t8a|4sQRdkelo>w#PpC?7nw{G~c%C!ito>z}I;a>%Ya?kf` zX`*~inhBaY*()Vq1jl*Gn!s3zxGMl!^&?nRwYCAFTul>ckG49H$%Gd$HZq}3t5@wg zm4KutZ2}T_6KJFx9t57n5t6_xyMS@^JDk8%zX@HpymyAhXtNaHX7}mUT|Vr*XMRFO z?U(~bD|Q(jx|G^emgGY>9*${)wbf{+oGB-GV(IXZn>5Oh&TZwvNxtKWQ>HvKddYER zU!87g(~H=e;CnWi$kV60dKL`c0$9jZRPN`kEzc{2=1JkL~bZz=N-&z$7%XzyDfoR+9( zjsR?kE!hu)S_oePe zFpguSW@;&l)C~%>uptuTJ(r%&&ge-esBjHTS|MT5(UG6NB~_B{EED+4R3Ch2FOp6d zRze>EPW>#O-t4rc+s245dNxdeAFpbMe9o$@5I&W}ydW^%(@aRn1v|UIq>`FPA$o{?iGJbO)hr=W3Z}%nA(Uqc|{que= znpp9125>b`_TAR8+k3S1GjL0OK0bUM7dY_*-EY;~mBCRNvF}8!zfqeDL zzbu;@Jt?wO>BCl|G<(xf^Ijco@b9u3saP5`_&4cxQOBvxhg5#B|4^YA^-^i|q#isZa)L)b8%Z{_{H3iMK2Z7btfy>(-vl~vOv|u*mx~@dtHf||pRr%1Rme0?<;!p0lH1of7C0BqkyqT) zLLx>@de({-*MH!&n*^gpck-arD!Y&=5?rg8B5`!hY${e>r?4tzskpuGQ`_t@oc#KQ z_n6x^ccfKjdZ-si>f&A4cm&V5iK9rE`U4M2go|`&E$F+G6x5%rp9De0oOJtyPUr8_#|mMD_SG zn477cp(!_WNz{q{b`*;5qm7oB+Mpc9cc!+qO;rxIMDjw(<@Swh5{1}v+(^#qqMb%3G@x8b zv-bg9mND`}p}0+%-ELo(J9B;u8#ICEviCxqa^ORm=<@9{(4&vp>+-ct&N#03h4I-b>K{CZaPJ@0y~y{qupV11fbDQEDDU=6p0Ywduy3f2j&qIqSO z<ES>OY^`d3gI@*cd!}fqIYqJR-76u@Ia09}HLET0lDwI5>ga8DVoBC|3 zg*bU8Ai-mCrK?&lY`tmH;!Yv~ju25|VOzqeBS{p=)4T7yy19z%#LHCUqy=NQ-Iyh?!p}*KfanyRF=F^jqd~KhIZ1#I{ z=lTtqOh(e}RJ+gNo97n|+Gx-5@v$lfR)G;`v~qB8prI)mpC)@I4}}76wVjoMXN1Ed z164>2IMPg>KD;kK`oTLV-;5Th{+&@MerE02_*hH6vgos}kA^I(vz|}9p0dhjI5MT(VM~@!q$4I^je-l>ZlTHtsdJ%Y}agolm3SZA=VnPoXp6wou$GUsDrIGtB;b^7&qeWi-SzSJIBJWMORaPQ`$Tn zz%GJcl;`7I70xeHe_n*+!pfvx*(&ix1W~>zzbS2%y5_-LHokfFTvqx;==IC4IwCQ; z5jb2398&@auf4rJi7N+$mX6>;n32zIWf6|Ra1oN{mob4z2(94Z0uEaMg0sK5C7ai_ zCFyqM`pz}^(&yihPC1sO;~X|3;6o0>s-|$PZbel613&k?tMKv+&ggVy7Yhww&Wujx zRaT|L-8gK??b|oy+UAywj*rwnfs;)5Ks(?Gba0c#Xaf5PBSUyZz3?3aI{B>fg6Aj= z;+AjIW5g*(9_Pvvw;RKICy7-#z5DLFj>>8@YE4;ZbYf+mRp@`~&#F%9Syu0|{8eaO zgkw?OD!4BLW~nk^dSlVOjEJVPe2jK4%ZEve7zG}17(R;|-bM6**WfIym$&q$5Lhmw zu?b(q>2;h@;oSjyHfp!!yM?37Ya>`^f{!0NqO5-FUIqjxZDF58?XL5VDHi``+KOtJ z`qJsIs+UE5D!?#Bv~mgQ>~jiX($}M4Ia~c;JdqUX$r99{CBt+qQQVa<=*VR3Tz=p- z#2t!-lF9VgU*eN&tS1Dr9F=;Y6XA!DD-}#9I z(WVTiZYk_$BGSr-YP~qZ`)x6mHe^YzJ42uYQW*`fx5#eJM+sW7`^sD35-E%7ZQ~d+ zP9%&Y2_m;yP!C$EJ}P}D)%R)N09j^3$;(2rlH+@;g$Ev=Q4-t}MjWkDZbqg2>My<~ zX?83{5(rC_%P~$FOUbj;oi$%f-O<1KRF02_x_>8%+tLa`8BbCfj>f{#^zBYpUCc0j zbvPWUl_o{WW7`THzu+}j5VzfVCz87(mOGm=PFo`5k^JC4eM8t8uW<>>tdgXe>+#Fkv##7@igV6wN|?|tKh1w8zaF(F}Mdg#4! zS&<{`|Zet_( z5JD&wGvFi4v<)Zccp#vdrV7=Se8dTbaaZD`uL?z{u^5+43u*T@_XQ|2cNZ3AH313#Vxe* z7B3kUscZZ|+Tm1w?Mq*fUf@n!L>Z!7V@4k>xB5ywB3Haj$0Kbw3Il%HbRx&TB$Y*bBe!BR#~m8%tc;1fMZ#Z861^S$rM(bGL$hRtY%dZL8g^v~|#EaTOS z7V<9VUCZ(o<7$0x=ic1 z<*UFsmm<~P6E!rnREgl{szCVRjhG%VqmwXlQ(f$Bsa%R|+;~~O`_sqrlaKGqAT0!; z%(NrB$ct)(g5b?7MS@&KxFYxI>9cwXnoKzJtO8hqYMHN_P_%ccN=|gVO8k?R`ApU)dF2BI3j4O&z-=cff zYU^|x&SmB4VcTu?iqqi?!!n%9@@JUVdunQ%VZh$8=mzd0bh)}YA*(XdPIDO!26C{! zCvl}{5Yp`FKzZP$7VFMvlB$hkIGU)EKoGW*uJ(vI#0p1(>d}_vzHzL|g6S-#VAPJm zAy(Bs3E()xT(p-Sssg}vGm==o|K5Fhus4vjV6Q}=BPH7pL)#Ii+$QjyBAFSSfw4UQ z+0xX$R2#tijvY<-Qr0fxxAKlXER~%KyOPsk?gV)q9pxO)n+t#J-0y{f+}^n+fB%c0 zlg&;jMK;p2+WEnmAP`ah8pdsT|It8xa&J%ejwdq7oXv!@ z)799oXRD(u+z4oD3bAxT79QCMg=w(qNxI8d#bY*=YBXchUnZpeu+H-)ep{M_oV3WO zB$x^XB!{K4CD|L(^UR_DP`2jwXLX}I90 zy{~$E=cU)-h%ds^1plnkR-tQ^cAokgRw+<#pb;`JtixY*{5)-_(`0R_r@sjC%V^&^ z?O+8D3IxH$K5hgFcg&Q@&>7efT$41_UDQF;mb?tqu5sf@~Tpz9N^Us1NoDG`)~D( zc=MvmNHj}de7i{#-|Zb;R=92*`c76D5nL91myKs$dry?fJb=q4$dc_ zuE}VeN}93R5P^<8B+(_ORVUevb}*jf7Ddn0U@38?LM};Sb@<3USqHcDy={5;^iX!6 z>!m zDWzaP2gdINm*-Kw>T^b51RJ&$c*;^(6?7eUzQ;9n z92uzdMx`}~WtgWjIy{hTy}tbT>9Mr?T^$8omr(kftOkoD%{g%}6waLp)dyFo8*K^} zmKD_Dzd`1N0%zB#Sew~~JzSu$zySM4#XMNn4xK>d+qBV-@m52CnO@_tDNSG@0^WcF z9bHW_oKgl7Ok2{8Bi&y@+ml{bqG?;AJd;s5lJ3o(+}^k&A3u!b<41?GH!S3E#0iWo zNg~dIhrV3OD3?h#kYbQaG)`pu+LpfGc3iD^D~b~(GC_GrApK5PQk-aJZtn?Rq9@Rh zB$8*j1WBl)lmGmUKa*EqdRbom%xCq?7nE(QS}M%9gM#AwQ$<$o(6>?IDV})0sixm_ z9rmK}raCN*^KJag(k+el`Pb~1eNXjqhY6|{UBaMF|2kF1&x=a~=CK0G!LA{-cnj7P^R zfbZVDD@R8|$%{~?QCn`l@~Yf=`86GZgzZ?e%64HJ68Ye;VMH;jmSVYn{kjUOr+Wv& zNCO)PFxt~^v9Zn>o7HBb8#3JrD&D`{`0Jv~*4CDea-JR@%j3O$wcD_46~U$$tC0kK z7N&D(8}0Gi=)Y$*kXH%D13$n142;3qCe}L4yf}i%wcA11=;x%3)y774`S*Gq+1}ca zH(q;5e(CdX%B#0`Bnb*V>xKI1G!SYhpz<6{JD)sxqSIfbGm_!ropZwjMlm)jL6K6X z6}t0M;2~a{N29SW$sQgLKj>;McI{i+2`R@-du+sFzgG+A@!_h|pLhNB_ML~G z^OQMHy%(uRyHyuKP$zg%d{I4%@_d}D!ue$uJ%f)Q!_Ue^TYMfZYa0T_Yyk)ZE6;R` zWSO3z$Oc5ZzAU-jeey_#xIYiua&$D3XlqmAt?M!k+AA4)eJ>s|_s=Jc{LMkA2QGIFb+s<|)ol|`O=XHIaX=~NHO z8crs1a6FL*kN2dLuw%U?amy`91`#`+S!L$dQ6a`T{czSxRGzWRd0y9ZjSs}DoV(}R2W<$K@yw*1!b{GPh6IWh28 z9;mG@HnP%o|8g$o}DxjMI?{Fcb!SKzQ{w z`jYhf>PM>6XC+f0NynYXLH&8boc@^8f@g~k&83A3CpTS%-GwE^qg>?4@mTi9Q`tKl z$nkJ2oMk@EojVhCOj1-nt|~H zJG#1SlBFlcd-#t)SK(>KWnDwY5?A(UV9#)N6%-D_j-|4=8IdTF{b4SHROHFwSe_mZ zC7ooFPMOv!1!cjd<*S}DQ)Ox+VZ);Lu~C=pN6|tH{;2|~IyeS~Lg6NlsjvF<*C~af z8y^wM{!|{Lhe*$=Pr98G-(bCNSGM{++3F>7z2B4T*Lw2Wog31@0bJpZRHi-fkx>XC zn;mt-qblgBj3#5fd8aI%;KC6GN|)(Dcs0%4t>qaBN+^?2DzOCm9-lsXD39;omq+(L z){!PSP$;}NZF^NeqtJCO>U);gv##$l+IAkADdU%`$LG=Imzf9Sr=L_ZFi$DJ3Biv9E_yb z?dzTh>?|lT+gGdKiWot!wP zWb-0CGaE=b&7>D6^7!E+dGhF?j!rPvGin02UF;5m4jZvpI-!17e!`Mx#|Pub*>Fkm zQ`zg*eX8&|BUe$U@nl_+>a^73>*A}!FSVI0uW0 z2udU_oiITu1+kkV!4>>C%cQfhAuqrBihTIthcXx(>C{$);Kvhh=>^2QlUqznsn0b_hXf!VuXmxnVPr{9^62ZdtOidK(>ln2&U7uo0~#ZMM?j#gWZ z;M#9N$+Mv|5;scOz9vV*sZ6HTRF_Uyxn4dvtq%BR^q5kKBBxlR$~DZipi|IMS2oiu zlQ0j}UX}!*K45XbT z^3qE$$@}lWuf0@^y?TauE0m3HUzeYM z3AA$<sHD(?>%dxv~?Ej3)IdRGC>CQe=VOWW0!g>i(X#-)TssRwGY%4_%OK+<7) zV)t>&#NAS6r+l5VvTxf2KcTruNp$(J+n5R*d3$>Y((AN!Gil7BW7Uxbdrx=eop%ap zb+%-Cdt1E>w`|l|DMrOHhY3bUQ}&{~CiqW6+KbYrCOVqZ*5Rp@k8Jh3Uzp63Ysrtp z{{fzq@g7KDF0E|DPMb{}>DnP&I!i?^s%X)%MFvf&=d8E75KTQxW&7CqbKfhky zZ!PVJN`Ie2g~tPG=?b3t_&rbsqD|JTB_YRNP`yK@E9j9TT=4Qs`Xnu+!#;yFm3Q8G zPrmb=@5pz)^LMHk;%G}+WhP8z6tT!C9cho4)l%hXA_-F&u{%~*%1~nF=UZ+?Sl9|> zGRdSJ_vDQ?KP&e>`l%c|8cB5PrUbz?9l1=3mULTP>GyZ!;iCs~eaCsXg)UZuG13`~ z2YPfby-u6UEK5$ywmjH7l1w5A^Fq=xk!Tu7o}u8TGHtP< zERj~8%66}>?q7_%eD-JfiJ`i>93R~x5aTJ^E|uriZw6K?{U^U01Ue%E(%GfycH{G9 zk*+n;-s&@M#i6wLCaNXcI=L0H|D<}4kw}Z>yDjcm;*@EvQo7xi>>cAq#@UpxhqNM; zQYce+r?wQ%<#5h0!&Y1ETT@)M6gcw4IM2Qn_Pnr59(7bougy-BKu3N|dtsj0*y!r_ z5l%+(@ZBQ^seth;znMdsf z(v=WaH2TWv0{AYo=w;EgSd}fN*!Z&;>SDQ_u5*f6kHbfZ{)_`@H{ zpZvQ&lW%_Wo3gcaO)JDL3JL~YT@=nB%ZI}ORWforr!mT_@Tm;=6aajb_z zA?C3c;CAGryAS1ypM6=|kc1*x>ZXR`UeEQeTcI3}M#4e>E~8f?C-Ku=0boo=7(8|I zY;h}32p^!=cybbYu3ZeF&ojfJI4fRSzJ&(EJ7Cm?-D0EHm7`H!9mD2Enz)uHpNozc z?*JPO`+?ZdN;zEG@D1IJBKh{Wz9rp_4SC};pH8=%3p~xQ6^WE_|HwmJ&&}@ zq-j-L_Hm$mF8?RsxY$Gs!W)6ZXobfPx|LQzG zv2j!#Ch|>zC<3O1s&{U@3QJ+Hy8B_DIG?Qeib32{PHr4@TG<&MLf$DG2$ML}>8Rl- zlUyBe@-Cc`vv;E_98fCWyJDn=a$#fwU%^Q^#r>j1u~t>>+KY1aY7i*COG2Ir@}XwT5-Uqm0a}xzLpgf-SY3D^I+&_* zg2(lgZDkmA+r_i?!rN_kE_}Z)oun_J+H?MY_TKARl03WbJC&K`>zcmprpM3Dtici+ z5P$_hfI$W!NP19&-WXEojRd5CkzVj0Yy^Q9g+fnINF*a9kpjR7hz<+_AVC5PV&Mq0 zSiiG&W_zZm{k3J&R4P8-U!GfetLwVH-Ltcc$?m$D`OBX-=lp)h(yrLD0tvLPjb?MZ zdHcRKy8}riK{kWLlw+Jw;=+hMhaJ1haOS-4-eh`Z_1p)DF8|2G!>Hq7y{iczN#=++ z;g`^ss$t%5GP|<0+xC3wcb@$xX{u&o-A>b*Ny8HODf2@1)0~IpaUptfc|CcC-vv@; zv!F66^CDqC5H#YMH}IU;Ot@!Cv38Q!-hS&__O;i)VlTh^lB^30uoi(26D0DgMjmrh zna6xPYp}QPxcH}iKP}y9=}-H9T>htplkd~GR@Ha8tW|NmF2{X4-?qVXtKF9?QTr4g zPoVjqnwH7FYLl`m?2&@sTLHA=kS-1|sH(RFJ082z%YEtZh3stMt*csntLD z2mdJOcXWC-o??>;Al{VtDQWR54jBwU0&sLKdDqt<4oqy?QQwL4>_0VT4i9H;tthff zSDw*n2<_3_5+BU+k3IM#BNw;KPG^``Wa*$jjjrW=J+5El!E$}%O zaq;OQ09xDet3MzqK_0A;{K%(%k?zo!4&<;JQf8M&-}?OUGSm+qC?sqmadldW^i9_K zU7KzXEomo~F%}%wYK8h7^dOK1?F?my6N%ob8$2}>7-wl1n`~_R!vnbrrgmt@U%z(U z-uUL%?E@eDkUjtW^U{#tx^mh2{r;gqhL?5R-OKau_4oR-e?RViTHICN3G>VQ*x#4$ z9{0F-tMXsY^!d-(53j9T)LLu=7^f$3d0%=TJc&G4 z<#E<>Jf8A6Wn+6J?y5qoaX;ph=FM^62!GOjLVeGZXFdK?K_+MEz>_-YX?%OH)Jedh zQnY(g?ObkK{T&focKmOC>n;0@-}p`Y%;&yftqwlJ+t$R<66Beh*Oi^NH$D9%Vb0);EZVi@d0xU%cyVP=$GUe)lv0Xm2y$KpX*3hrDDF z7=%%o9`SEQ4KWc$9{N^2hw=k|jc|Tk{!Dy+;p9Fyx*5scRuWsc-LaAS5EJza;1Jh% zC8~cCNQwY`>dp9JsQ__l#*O!8t8ZyGwN|q$ivrzVMe2#pq#<^b3@^{|7&ZosY zF70{KomS^n<(xI_w7gffwVtN_d|a6x=ZPZ|uiQxmANTEPg`ZTXlfIp)KBw$V>WXUh z{Jh*#lGl^0eD-`+eiX~Jw14v(zh%Gkd!N)HacyH=9tGitG@_=>CLc!LIg-zVO!l74|jgl$?KKp=$Rlm|P=EAEXoty`nU}{m?@ND%tmggdVgBxY66|($Z2w?vO>5ZNTHhu+lggw@FpEQ4 z#C7RG#(^@a7kBdEB*Ilxx+3te;CV5=IKomw?C6&bn@nc5mmb&)lhi)=!4KMBeEKss z$#UDecEeC&{N9a^X){3nv~##r^P$%yXWuapSKNX&ELy8PuuEg&iec~ z^{MB5mh{Al|L)KJPoI!ARY`s@)mRK1ojD-0nvPBe64ig|2&D=OPv2_q^-7)gOxpUT z_iBTvRektOy~0nmI}EQCT!k&?SB^}u;u)g-Pr|`^@LRC}7batXs(rK1!?)Ibu4q z)&PGacsRs96{nQgBJ>&>CKs;z!(BT#*t6{i_ig+BT_GP_#!68UpB3;0=B3QbYb=md z%2U+mElp=4!O(+QHka8IV9PvX7j8D4Os$pR$uToDukl9$8LcRC>og&;C6?tQ?XDrg zL9&Aeg8@lSQRr=CDMbI++D)wK#uk^Ujd$7M&$a2+*3!NOHNsuEa4q$dQu}e!u1cMNUST21Zd;nE*CB-Oa z!^RlooMl$bQt1T^)7++*gO3I4bohxcB4lF z=7YDxq^Ev}5VMhZ`<>hNH-G%c752`px9rlOXK#MvYf@C*+PY?wX)ag4@a=HN%(!w2 z$`BA}HjTb>qT*Qrc75*q^YWV08uRg5^|4y_q(94bQamKz7^>x;HbT`pKdFp*-rk=2 zJ?H_}a}Ra){_?o>GU|EO!&g0fKJ{<)u=;a7&Z_75Cx7tw%WQh6 zKY6pe23Y}+VLHP`zkBYZ`ZDD*~Xx6F%TH*v&ouq=_^hF#o+&M|XO9C+G7-&Rno4$hV z6c88S38YbGg|yw#t&;+M!_+R32|w^U!>#5)oOR_zx;{+$`Gn}xV9rOs@yIIBb1bZ4ii^Be+8W5&qdOnwU}eeShZWMG9}HT*H)KwY`%xlL;oDU zF6BsiAB#ntZ_m>cCv!cGW_V|v-tkYP^!Ik2%w_rouY%l>cKX7XzG(mCSAN-^d+s>{ zwy>i|0~`PhfQHG8rCs_JrNA&DVNeHmu!KW`5x|}eEuBmSESl_cE7Ao<8j)ne{uW`t z9(M30ObgsnRk|SD0lw_MD|_-P4^t~^8<%YN?$F9|rn>BJZ>xUo?piP)nU~fZtlPoC zP^M3)4;S^*PQRJhpq1F&J2&mYy?d5UIq5_eW39FVc%9ZjyJ$`!Z`|6mZnI<0Z8oiG zbF7jG_=5n1WCbu6JP-9t1?YI@;toQf%{;@%4`Jau0u2#{DJy4VjR*|x0Fw-OhR1<9 zVY5t{?6E|7tr;7-H-u%?d8CYkpn%tr{$y-;ryp<&5LF1g-|0X%vv#*>-F=*wEr7n) zSBnL&#Fl;zx1-*x^-L1qp!X8ntk&3 ze#idX|L(uHZhxSv`m4 zLT29hL!7!q=BgLyaZd}Ye?RScRi4Xf&Jt%i&2jIi<@MC3!UYRp_d3T+hk#rn{~`a& z|N6ffqy1E0i+uH^(Kb7J4oX z^XYgf@|T3H%F?=>j?MEzWGea^1eW6R6@U$Vz}R98(g9E*U&INeY1!l;nC1{88{L$` zI<1byNn33|0xXz92_{Bx9n6UXk`dBiH^25J+kN=Jvf0>L&Dd~H%Z{G~6~~F?)6AyD z%qE!ii2Am>yKm22+q8C4S_g@)if=;u`PE^W-m7qcu><6A+NhY1m60ed@1JO#yrTV7RKtNWMgAWthgHon`JP;u24 ztIEE3jh2z?#dBO$&nFRfEHV+zn87&#nXIb7MF;ev=~vb1q_ES&p-Zu?VE4BDG3{pL|a}C8y2@(GQ5blJS_BzynvC%EV%8}PS-8H>TDs%XjwiJ zDW$}m30f#Js)!B+3V^A!))7F3JO!|Yd;{=F;--)sd;~7wl^mC`qc{AM1gl7KQD}z> z27~vL!e@yR>vsF%g|s>W>CIsV&#?v^Tfft?y}fPw`d42!OUJ5HQ@kFK0f=PrV|Oh> z>dlUoQP+BdHQU>{Zy){8E7nU|2!S0Ui7-#XfG{sKH!39Jq`-hw0@+H>@T#y4R*Auq zhBkBZYPDMyiQiBSa)m(Z^HF>*%A$`%d3TanBvKQ&m!A-c_%g9ITe#p&40pbe5UrV5 zyVtW`rz74O#x7@NWOp8JThi)>aj8yW8iyL$3sMt&6zb0$kQg?~oz><8oSjmB&`wcVZjmNX-~_RO;t!!`KKaK$z3Ur`?U z7xQ3QSo{yjY=d=cO(!-T?ghYWW}|~$Lwc;Yz9muKH5A~Y$ol=BrL(cU{ni_H_x9UD zB7?QQkdY*h=9~h8`Fh&Kyyhg+YQY-{37~_KGJu*8&+#E(Qcf-d?ui3JEU4;3Lfo6iPvo z;RNLI1AsT{bl0rS@sN!{np!>yeo6q?{HOuZP!Ofd*3!!A`Z;B!R(yOn?bu#tfl-!Pz!?{q;n`iRpqJHPS zNc%YH&Qs25_4Dt_^D)|Rp1Qo3;>LgPX95GB{UVolM0g|Qcx1DxA)em9oi-g7<#>uk z9Tp+sX*uuZ?~n6-TAr)w_c-Moo93bgG-B)Z2KG;W`B&|CfA0_M)z?03_y}pp#7Kl? zN5fkm03B&1cqW`?AcY_mr5!YkT6VaQXjD;%@)&n4#AxTVfrJy1L}@xxJk~psSDXm) zA`eCxn{9(E#Rfae3o&OoB{*Qi>My{AAIFeG$*~g0OhYS+T&EY&?~UCzMjlOhL+(i@ z6Z`t>U$TR}hc@W7BsL6Lj5)@d1^5D#DUS;=W<-V|MP&1a_13z!ap|(8+0f~K`Gsp{ z73oFuKtL=2BcB%%rxjy-fgqd#PaK2;@ZX}HdKAmgOVVr!slnlC(a}j2&n+l62C^2Xl|0QQkw!f@eFTKY+FYDUsIMa{5Crek4aAP| zO{4~Q_V(;AKl>TGdi|PRzIs{njq!mGr@3~5Vxy0N2J;+$9yi@NicnOQa{>dNNEcn+ zT1-bOc6^Rc8;KsN#)_9mkcm2=I(935Mdmu|04>Km4VeH1meVZ1*Xw=Kw|cy@KA)D~ z@k4jk5>APC!2;NIf8&jt_Dlc!|6wn``a#>+*s@M{Aio{(MOwX{=-!Z}1f&Eo5&aIP z$Qd8#@E{nZtP)Ay%q@jfGMgDE8;}W-Mj}rkHCB<4Aeq7NZYC{xS{#i>Hdx;f02C5P zGa)RH5GNCO0{|agkb?mF)h;xf4lSLIw0YrsQ3g@v-e6!jX&Mg??47r7Dh`OC(Z~(| z8*yc8jB)fIiwZGR5E;eAQEnL zwIZI#qmSPc$?Swo*r=RzU2u6Hu7^b#7te8#*OPsUf9j`y?h{_UBLl!7>q9^X+WmRc zj+p?SPrZtSo%lN@FY=&1fUu+gPRVbnywHY4jaV#ay|h@)8u^%bGCxxF+arCr)L|;G z1{8Uho&dYfEU#$O02AQ(TqlPzZreZq=l{aG-GQyIUy_~#j;hiEM@fZc(^QBf22gO? zkTj4xuWD)c3s9#l>c>u;6G6=GI!SCc9tTFe^jLy3rl2*?NycoJ9@xCd#Q2q!$kL>6 zh-KdCG^_X*P{e}MS&$ODa-B}_laUqHL_Z@=~C4S)fO^?i~^~Q z_Dc-8h-4BUk{LUHbWhksBY41$o>P|~oyFGe^dvpDx%G^VhZEab4GT)-s1erA&yWKPO6+uI%4!NJ&u(|t*_&Bk+!JKc&G zHMM*?wb^8B8I}id4n}1v&sJG@}6Wd;e#rTUs$UrAa&AecqMJFo+vcn0}^>Gjg zVDrG_2t63d%uQmk{n;P=slD;_Z`eyOzGRzQTWU9_D@e8UQK!|^=@~I|kPQMBknfh) z#W73mkzmpx0210J8IYB6mh-Q_Kazl!)nUle$wbJx4ue+ej)gr`0DaW%q|0mX_tkNa z)TtKbxbRw(6CY3Oi+bY65)Gz;6!J8$r=9;<>aKy%;(xkrJ*h4}8R!oHFn8~Nfc}G> zUHj%6-?H`fO@+g3#@q=f4Qy030d}<=C_7E>Tb&l-NPG$MCJl^U9BPqwuh*0I`<-{* zwro1KZl@)>JO&Z~Hsj)>~V*UOO=4hr^+*uMc3kiv|zin9OF9 zCW9mr0LNU~_5Jk?8}IL^ozxS${m$JxcIDbt`8z4?l91?lxNCFFek9P-7N+U*A}H*E z2*?+tBK}2#zDU(h?`ztNBaI#G&qx%xDMJ1A;L4VYI_GEJEJ>C-3)FCG#z8U{-zo?hZSGOqdYr zj5DoL2RQqVn|6?g@+liKwCHil#@tH$pHvLzPOmQ{^WffXdwB01*?Iuotzrw;QzC z8Pj5}-M9KFoG+|VFxJ6RatJ?V+$-fn^(XbHq_=n%pv_QB;T`3&%LU0Z z%#}f>ZF|#+_)Z7_1YS-M+Hn33r$PEToJKe?1~OPta4HRRjIx<~QzZ4OP3SNF{a>)3 z|M{P{zx|*8xU2#Ymy0`X;3pB~1Zl1Z;Oj>XR|6RE28 zjWrvr4dmlw|6pG{0AK>7jRJEfW|n1R!v(Wo1;79Xf2SvF#19`lF!WR)Apscm__nRng$HDoPRBv9QfBZ0V3?(WAG4UR zkV>Qoh%>BKSJnY6YFdeQeIv7vzV?E6K4LIejA&BJlu#uy%sX{-AnpA~U-E;D0izyeUJ={fuE>}m6WT_*;F00Nmz_1FOZpNs^J=p;Bb6_B1OddaLYF20 z`%oWsVj#nUtL6S6m~){IuuLs8GjVLae&7E1kN?B~t=Dlnol5H%)AC~aLTayOFQS?(O2|B<0dY7WB%HMT zCi`Q9v;p$q$0ANfk;q&itMv_#RBV^G0;vf%z+Zj+%d##@T ze2VVcx@~T5+RnrK;yKW304`a zW05bu_@Xv5X_be!rCz=&@g4Lhv~_8`zJuz2ma1yJtN9WCu+3FXY9H)HMhif; z2s{4i(e%g1UH-Bv?S+B$g)>;sbWbS&03ZNKL_t&l=;iwIeroo|L|E0<vrSDGeQUtcehRD0?eD(iAp6fF&NOSA7TGs3htUu`5 zbUe0${rx~w=LAvh{GId#<6UN0^1`N*p%rLhgSJaE9C~4P??+#;ws-`fv`X{85``C10a%KG8creJ zfApt6ODfJ0N42QvTSp#&@m`5TYb3%S9|O=I&&$_g{(%#5IMb-7rzK4|;enJJHk-_B zI+<8e7DBwc`%}C1;6Q$9*l;wkk%pNZ3|LCcxTO;mr#-aP4-WRlXeTdD1t2m}{X`xE z!v^vff&z?HsCH;8c@p2nrV;z*3iMJ~Cap^AH)fdiSQQK8@JT?1cBCN`5QPScGpyt4aG%QLkkjbrEx9m?o z{UsZ$ts6%ASjYf%5DJWL#D=HSiQ)$4`hpqHNg~+kLXWQ<7~(Ouho!J#*<>oy@Q|nQ zRRJmI;9#VkE+mR;SFcOw0fj}B)(VURLaKsR-)zb_WT%r@+3Z`djZQ>tJ39|`8fkai z(qjPN0Nnr>045ySvd=|dB2OnaFH?)#1KIVWUOC$M=}bVX(_fR9#kKyLbS#iK;v~{+ zAqI^3^a7R$R4yxKg`|YiJhNuEDTq0EtKQ;&GK7HkDU$v`Oui6Jc^jb)R?oBnH zL*DhCJ>T<1kqM>wSg$I1m1ywMCI8)zOuS#tj7(1JRDG{^0k}O0n%H~I%S*UNl^_G49^_w=p5-wWUvWXQ3 zOSDlenl%SbM?ichE%~t{qJnbmZf7WiqxWJuiDK5aRb2DE;wmftJ@b31xfZvDZU zb$ggrVMBrL4V#Wcil=1}6il%St&>z`I8sPM3jRTX5{1dIDQT%0;q2lkCFWK*frYve z#r1tc-I;H#HVU4>5Gbb;^{X}P)1UcE`~DyJetC1`LarqjY2#aQjekynzmWy(ICnfGnRr9!`p;$)YeFKjw%r;v?C#w?#akN;Y|!ml zmoY`NzT3A9U6tv+B@sN9uFWP>kryLbI-W~+C7Z|Af>)I^ttDq^7=}dJ4TGAPPC?{Y z#JVGhR&z~<+(2&h`U{`RcT!jmMTyNflqTo);QqFK{D*#6$2J)I%uT3B7g?h|E-R=} zE7#+4AniEm3Ys>-t{g1BFrq58f?TJ;&y#Xr{cTm9=p+BtQ+e2`J|v%2;j6;Pv!0hf z*UNfDnydcNGguB=^}bwz<@ZIJql0rQGFT+k({jG2rav{pQUT|DU9QhLlb?p`Dxc&H z>2jcWx6-CrE@jH5nCFqDld%Avwg}j$ z!dVmo1inKD5k;}h%fiOvky(*e%>7_8L_2HgtVjXKQlz{Zkm_2t)*FbgLw?j3a@=e* z5}*Pw=_IDSgU=U$;WL+d_QLZwWObMm2?!BDiC8M8V!U7I8-5I!PA(Nt2YJxn{!@bb zpW1>Ab7e6h^qtT_3QmFFGOhs=GfGsskOoK@IlIuj3s)678@+c)nVSZ;IM-Py5Q zZ{M_s5AWJUR+?v4&QpzJ8>P%R7BbPerc)s=PIHt8Vr3q1A_39S0byPR-4PTjH2_Q+ zLDPT$cm{ye$6R%o9C`q-8!TR9K>;TIm%sdF`|CgYqxQ@**DbF$6(WU(Cch{DE=KdX z>YX0rxRj3*?(^cTY3p;!)0{UCPj^Jm!~@^Izjt~7(NmjB7BCl6}wlY#gFfG+G+0SFw)fH3CsR6qkHLi`XGM0SaX!Wk28eVua9U1&;QW1gpW zFdAE@7uj(Cu3f&gWjAizu={sz+iWzHmN&c2Y_u;$#CC7Py4^MF4AyOUuxGQ$B={|F zb#)q{43{PYV8cl7w0kzqMv@$&P4I2dmTzFo3%groX`Q%fW9)08^)73}2gfD{-ff&pfzeKz`R^Hxk0BZG% z^H3^FxT_W=W8vZ4g9YBjZjkzmH$h(R|0K|Mf*3RDr5XhkpYNNevn+^|bO!)`p!H_xRS_%t+J$T z(|Ob0*%@2Z#xWSu8t^=VjV^@OP)2Nm1hZhdU^*Mg9kb>Rc&kDX>N7~J&9*g@pvW59 z?}#Ia0;>W`e>8V$VKQv#lbLW%F|yT$`(??2$v`Ozxa0A-n!5o})v|g2@q`{&?(-9( zUg(qNN&To<<))K~SHgEu7b@xf#80#bU<5mT9wjh*jRUM+fBmbH!g0XQ*!lP|p8gD? zZ~zS;5U{F|We%;p;svit2W}z_d2lBW6dF0DaDh;;LX1)(Iw0f=y&bz*0@AIHUD~=L z&G%MfHs0T}@o>+&Yn$>jKG@u}>1bER1dH*|2K{yDYBCo;Z=hV)v}QY4I)+~~%h9IJ z4W(^P3$z&^3Npd0%0#|ZaNdP)4wKK4xNOQYz@XW-D_3vW!v}Z3uGVUH!ge2I0I#8F z*q?s-v-Xi!Ul710fBFF_Biim{9mrptw75cF$CkqfsVyqP>uV|WXXvx)z@hZonulNk zRMPplfb0a%t9GW;q-mVR^hHSIVQ)CblYc+c^lT*ZL zuwsCV&PnP0+eOPdLgpf~(;DXm zzkh#sdVqzA%iAz6fu@fs_S^UFiX7uWh&z`rWSIPg=CcP z4%t1D2B%WlY^v|@NjiPZtOWaAkgZ6M|MA`Z1LcFGrtaFB%_j%4Xgl27w)L&c*6OZV zZ+*j(`)!*|_AN>>i507kO?WrK^>Ca-*6#K!ZFehVQUR(Gor-X>(kWt|O4B^IRLBE& z#K5<~`kM4ykP3R{h3DkNYo1TV+o7&pDfX-^w%d0f+RomAZT5rlO8N$k>~6EEwtK(L z<&yX)F!%MseR=&5=HFGITDP>@)`=sGg(DK;k{3T8R}b?%y}Tly>9jR3F@GP~EQ{=0 z_x7wzx{_q$lz}-H82@Y>;7^bS-5l~yrO(q6*$`lk@*-OB`8*Sui#`tFoW=lr3#m4> z2{IdXrOupo>UU0Eti%j5S*UAzI0 ze0X;P==+OaPa+TMa0HoLv{H|g{^?mXNCXlC2!)>m4m94$Lt$N<9+grQqzp`ij7A66 z>vjb^V9suAZmDc+U!{|Pu%>AyWkZc`iV68Wn~e7*QIvGr*4x~)F}rD)^wY7VpE{6z z@TCD=ttdtAA^&9BvUJYQy8^D#bPpsvlpYa@1u>Kj;zTwb4Q(*M^I+R{hBG7I&8cS`QpSw--LO@CWHfHFn3S=yp4PZaWJot1XO)1phlS2 z&)cWF=xyE;ixV9~Ef)szK_BKZbzp9i&&5IIqRjW79_<02SC4*qG~~3nk02ADFpp;S ze#p0@2Ut)5b`}`-xYg9D0oroAyQu|79AChG_kjl?fKW)!Hx@hj@FR|PtyRNdY7=)f z%4EftU@Q;=JRn1~P&AuNZ7^6@3IuuPCAuBC-0YJ7tTnOGXry$UaC&QNHl3lXGPc=d zXzdKY-z^)guUnapZMc6RSF;B2n9VF{!pmsNBsmBI$tvoe7eU7Z@nKys)|wVcrjH#2c2_T<+%` znP5Vt6nV@0SeYI32Vm%9B4!8iDx?8VCDc7ILJs2*r8=Ep?<}lI1q9Jk*{llUxR@o$ zWp$=u!|~MKy!nnbnuu#RZJr)jnoq2>Ok&qEF@ycIYO{~T6ynwhJG7GEG);XXaoxap z=bd^Xs_pG%J|Ox`xV}}0wcZ8Hv(VHqUJ`?rd~OIoM4X6NSNV{JxkLYVdg~I*sOS0q z^S7@DeC$uEK~fnqRU8JDtG*jJ>5%CYNoi_3Gk;fR)zLOQhreDWht3|! z97zj{vT;Lz9E3E+kYKwjgN!X1_baWHW#UVKWOj!jrVUHxE!(}jV}td}7Wa|dYFpey zbAKv?CO=v8!kPdUz#n9$PS1w;)9ADRQZDOgB>0^UKoEW$o}1^DS_`kWm-cdkQ`=L%plHa@mY-QsZf?MQ>~X2ErG z1&EnD6)!@W>OCyfIgIsm&*Cz+Z)}^rHEc<6!SdAh(uO5y;1{LDgVDKZOV}bvyhV*d ze3WLpX#?p3H7x43Ey}u<xw)-173vl$dnVWhLhSpNw4HVTbB zNRX?H0@4YNy+V87s|A4t1T7-@w4d(oD1JUKZJg%T!!T&XhUX|*5O`HzQ{ErP-Glzy z;_F${dORPiMGi-w>hM!v7|$Bask-54qI0}aemy^u*6W0jMEyG2TlFs?T|KXQK1X9N z`nVo{IgY=3oRiA-xX0c-6OXX`?&05#`>MLE3R_jTv&LJM_DP39Uf?v6qX<{g`Y&JF zupjyO51Fj-*2oF~GbV@wGU`%qO8|7?lmhvPlLH&bet*q21{>Dzt%*U+9VIqNBUO2T z7^ag{07Sfo>U4w83CLn0KeXtBUkuX2?AAd7pr14hjdV^rw1axWhanwg7%Bc?9t1^1 zJSEO^?NWKB-oy_-kb5Als69!nGLihE{nOdRX4A2a4tDI$?OV3L^Uwxe+R~5(WF*Z- z(}@rzENV_YAXpf`#NpYIub1g#DxN@%yhYu-fBk+KcWIG(_(^xlTXikxU5|sfbUu%) zY_{#I-+aRwmGy%0=)gcIMLM%W0t|&V1VPjr^C(S8x3xMw%>zhegS9mYJ}@UPUA`io z6?24of!z5q54a%DHQPZs*5{S?SN)y-L_omDkoN_1zp1hhPl9IRd+B7-!N%H!z*D`O z4xf+fX6GtEb6U2crGP#f8MrKgu#+Nce-aV1MI-Q=RyQGPqL}IW`MhBAGg4Ti- zcBj{swmNkzEbwVy0P~LGVyJ%rKmba%?X;6R@okdMWO@ThEB8p)h|u27Y&t%$dvCvC zli{vyZEe|bng%WTvLU_?=Iy;NKqg$Yf&TOS6}a?=Z;$))tf)IzXy4+r;@{75rw)0Z zS<>m*%{$vRoM6ZjyJWeLcriV&*%Y?|Q;jk0qJ8*_M>G!2c1+RZgN6&H{H4t+3g5bN z)sj|A?F5O?=cEPs*ZYSsZv)RrZ-sm4M@X7%hI~$P$2tM?ki3#+9QY$q*fhWk+}TEJ zKL~?(-u3?QzN?45*Pfqr9goY;`{$(ZkJ~q=g60?w!r&QQlMF_-e49+fn*qQ8oH$Kz$CL?3$C1nZyLW_G@)^p0k@C`M zqiom=Ul{1YSHKsY33N{83WrY+5K6bdCO5Oxn{ohLoOn8&3UHy4fL$oesWcG(1^6!f zpyO(FeY0y&Vj`FXlQT;X6RnfwrGK z02DlLY-}9)4nq{+(Cr50Mgd%d6cm{AI9HmDC(?@F+1?gn0Wedh6d+q|Ddwf~Or$P= zIQ~xH2~Y?0N&0K+x}(Gw{IXOwnc~P=)vlQxZw$Wz5m*eiRJ3IHB>*EXOx43raSe97 z2V%bq#`~LZe8bk(2C5gx0++=2`fx-^J9+jw&Ydy@&??14Ur>jq)N`Itd~8(Nr9Ymx z-COL|#wwdeZql$-132ujA&+s_^CZu8MP7xhJJL(K*&}8T;hm z`*H>AX~Kf6hn)Wz;C#}BREXE-q`I7xho@f^=cI4MKW=_|y2q{4VO@~oj2a>h;i<5J z?WiO$se8SSq5+hhyx{44&;bToxHa++@u?s8Mpj5^Op1|70PxqY_C&iL4Ts83yT^)Y z>YDN_^XU|^+==qap{G|SSrSQD0mRtN_HBlt$gDEkG8x-=Z`THEn^v%^#k_g5Z86TV zqQJwTzSIvA4h&5 z)+NiQX6u_--v?~4@Ydn&AHx3+g|XPjdtOo$|#Oq2;0grle}fdM>0O1OeL2u24|VY}V6PB)QK z>fKxK*p;i#T9M7I)j`K5h>X|gkdO+R{1r*CUR#g@0x8}$zTrGf8t$Bg&{=9|6g4Nk zzqF~SEFaU~U;XM=bt>Lm@5l+-kuqxQy&nGUdZw+k z&(nA~X&(^{<|7}LBYUFnru$hs?-6N@r4DdCfTz`862Gl@1ne^5KQtQb(&Ixi5WpU0 zxyV)(X@HXhK!AnH<@NKOCgJ>|xD=vd5fcXz6#(Pvl`D4r+BMtV-_fZ9hgp6(Z~?Jk zYlVK~2h+UF3rkVEuF4ccxY4y%H?!%%RQ#UN-mXnA4{hFV8#`+d0M>_rd)i4?WVz`S z%fLb7eU@=*Fwx)39GhdD#@GZSK@>?q0ZBIiT7>D3B%Gd*DoPM#wZiV*dCOYOhF#ve zWcUx7^-mI|Cf8`Bp_XhUh?j37n6N?%+!opo|3lRgI+{y-usnrQCYO2pL{|~~L%`)5B zzHbn(`duspw}f!8K#Wxb0sAIan-iTzxX;p5ikB5;k>Q4-TPYQ9k-iXRA6Pl9e#cS5B2&iXLsCKdc1nO zJnXdlN#&7txy;8Y!|ULAot6jjgiMI&i98d(pY+Y+yjSk$sq1N-bKW+cr|k3O4YQqX zAkMG2Cj4i;BwEkluE00+wi^T9ixQGYvB@MsLtqqaC z5ECXo03M6Fh$NCfOm^-vMLsR$^Mq%3I|9IQSEP?tw_~#*$SSdPI+ds?&a?_>^8l$9 zh6VA(LOZZjj0NDH?Qh=`V5i=cBl9oC)C&0tPlSB<)|iL-f&>sJ1z4eufp6@pAa1x%E=X!1O`#_N4 z@&!%*q${rSsi!4BfA_ocsFitAp7n3bb@TUnoK??W?x|$7s(H&Nl;u`?eqPq{yN922 zUzG;^0@f?LXY@^+feNskj%OlAA&~{c8ebru2g-e%9MY_^w^WJa%0~t#7A*Rr2eNZN z*vOKl-I>kOV_Bg903ZNKL_t(Vt8N%%5dgsLH-jTC00{K#W~(v+DVnzhX)2fYiJ_yT z92s2f%8WbPm9mf#!hUbV#>0^n&D_QSul0fLLz0;{EotL+xM9s!S7a+3SS9Vg4f>aC zIzhQEk;pGd3?9I|KwK5|X^;RXEKVhJS@~s;1fq?a9c%YZ$SY6B)@l}(4GVkw%{T1E z3$NL1o>;g0KxD3L-mtvUu?#=<(^16_=olnB03Sc^TgH%QewbKCh=G*>2@+ik-4A&b z!LuOrP!N0(gVeD~5YmGjxen)3wFZ2?l@X`C$f7cm?J)>R7_b}`GaILK`|KMJ%mC2C zUF%4>G6|AgoID$mwR-^SiO5Uc-XOU3<)k1{>caN7??`VXiu;zd*JZvWv#B+TaAKV| z;C10wzA3*sjU1QAGqAKQ3(Ok9db1evzSgz-2_(T59fM^CA-1UEqo5c&vYqXRvWdy5 zvk`YR_vW*i^`g=q-n%Pg<2J!cxdy-i^Wp?Z|Dy%OJO#0VoOouQ@(k~e&5Je@7#VE_ zWmO@;c|fW~3HkKVt3K9`eqDqBsz6o0oCa^gS#S~mk*8A>QT+3&asbB*(=?CdtbkSN z_^{kQkEc2P7;u<8SCY9_SL^AAK5j#nJLWt!ecUq7Q^s*|8NfPv*838|R{bi8sIcn} z5>L%``_R(ws`ir?iwH2scmH`^e5Z(Md3KkO8{Bd)lnCEsz|1AD8NS)G)XGuV^^zX| z9B+MIJ_t%$*44rfKp%e_p)M?P5L_{xOPUIXZ)rH?nhF?n8Zh|*s{wIwLR!0aUCiE{ zhd75SZ89246Tgh1&BvC*7pUw-0YFd(k84h(8Vwlok&R2tt&}>^Y;SK{e|^^m{efi| zq}+XAlVPqpHP;5RamDEapu>sA`_9`*A0CEr;^RbD^)uf<{;S3n1OdC^Fl{x~hlr#a z97iO)Vs39f@kwcE*Vxr&;dQKbv7iAOK-07B+%F z2kx9Pf79=EY%)#l>h5kxF9RiD)J&<=2jq4RZQ{<08y?kzf0Xd@MjLc z3F)J_ic_qHHRD8^CDI`TGR>y8y}P4+^mfr_j3al#JRE@yZG3d9u1@a~pKr)?&nyq( z?!>3gY)Z%n8*ZG&;Xi(-U-ZeMZ;!U-q;E%Kp8R%P{`FL1z}EwopQ(&rWLSUq@TYly zH_G!ePUAJV8WaVb%G%e;?c>b*^~uhkQBNtNPMaM6cZtMBuvDh7va4UErwwaiH9pMQLgJ) zGwa!OGSbP8a<}i@whz4a5wok;RnCKV-n3$lV=t@;WAX*3T?>Xg?W1mf9lndqv*`0c z0+SOGAsPDI$Ai27lo!%bp5Za~vc&r$WTmMPZ8n`*-0WDI#rBOiZwnEV)OX`-2!bqO z7(>PuQE$ql`t;dsHns6|A_*=@^I5Qpkmi~7x`Ahwrh)m+2@mB{`7@~uU;>yqiAYMU zc2ZzIaMjzZck#vOKS+atKO$1;9MSRMBcAnz=SL_V%#pqQq1+gBTafAkGQwT6`VBE> zgisI@_b?FeQu#hdnVD^d#iApz$e>?Tv(rUGmdiHWNJ6BaF^opYP#nMhmsw7}$i zF&_x{3!uQms3d-b8bd*<2a1Q2e1^XoP#kTwcHK_`bKFw3PyUk#AjQPJOVd)r&z3@&!1<6^e6 z{lM`Bl#g4h@WR`U6YO^SEK0Hy`Xx?DcQHqtgNXq_Lle4F=_dG(Z&df|FCG zK7I7FSO7JBUcw~m6?&uU)W|_ppQAQ1ELT_l^RwonY z3h!Ka!}NDfWb~=OgSqGjPE{d(NJkv%=6NWi3;ZEJt|yh><5q=woK%O$spm=gE!Xqh z$b`(jQp=e=sdvx+JPlb@_Gz8FDh**?KF@wy_qfX^6c2xrcW-yS9xMt@0fg~Gkr54c zE*8)7{zQ2fDXWwvH?8&=p!!rly~mS{Tsl_Vmu(lITBGC6#OI-9n$-_a0d_85sAoU6@c)v zY3Hnn>`y-Zd3$I3K*&XD^9AWg^}}3Nj)mahopRnNESrVXBHuSRx8zcpQ(%8>ARArO z&&gLr`ao1N5W{JWoFLMnA1|r%ixr9*TbJb+`yZ zIZuBQ7XXQiR4x_)^<|;37(gbx^II(P1tT&5!r-CtuDaRL>hp~Ijim;Q0 zMB@2V24#CZ?nn>;fD{KNYo+8C>KlnfqxvSXwHs}l$B~UWRb{D7Gqau}LTGC^U8=d{ zb@B>`hg~`RmJhu4LACXr+qdLT9@nzu|46@9(qw6t3Ls{9R%~@_u)ZPBjF?i%)6{kz z-m_NwhFyR5dAmQH*k~TxR(CD9GsePh8TyvCdmnp$a0gkctrZ#|Op*ytrArCs>EVe7L<0#;l5z83at8@Hk<5~C3Q$Gi z2UYFko$;U!ZMpjm`X&rDd@u4tp|#U)S*zVvAG;km%`t>c%F_PhCqHQ$2n|f98h@RB zvtT2Pyj4!M@!*;DaQ*sqd->&;?WLDqk_nx(;Iteh8@W?2qz&o&(ErNjyXKG2DR0p7 zyN5rCJAGNdPDLj5$o~Au!u1c|p?5l*Yq@jk%>k*@7dZ$;Y3h-l!ZQm1^WD1p5gsXy zD6*ZM9fkXN&<^6UAh~$=$>ec7oOmDs#BsS$@Z$>7ZIQ*oqNSyIFq7hWvLoe3T7J0Y z<)R!+nsaxg2jD;ohcMMEZi?Azz1$A6i4+Rqt+4x5`fAZT(8$}lCEcbNtdnxA-884B z>(9Mt?f$^--M?c=F%PbTWd$Id(!8yzO9Q3MrlpXI8nF%5HpJDQ?(eIgcJAG>wY9#* z$(GEK{Ml!}V*kaDeV=ut(^H6_L_V~iAJ6r7ohGU$H0|JQz##8p{UgcOX?ZoD5}%6TS@T5zoft3YzdmJ~wzO@_K2dwcXTB8a5k#ic+DH zuM6d8`NYy3L;s5n4-1L%WR=1cK=Wa_r(`qw2yq`Blcr|^T+JD=bp1(zoU~1aS@%S9F13H1I+7v(YuesMf15x z`sF(C&gFCBB6)k-Re8mK@27wE6CUBDyI08L_Y;8$mh7P z%J-z?_4xJY!!-22KG|OoZ-&c?Y55JwE%>ZK@MzMI969FjGs}1||mtVKnzy79x z8~~YxMmP(P-Ji;t2M1eldPUy`=-`4j$0<}UK#OL*P9POxLHnE235!m2XeOfQ@s(}? z2n!{pxM5jkAd&u}e&mIM8ud)mnf#JapWruzlTd7(R@2hySgv?;gBKGt`4Ls7&Jtg) z`Yp`@U=ytO7YoaRIOupaifo z2S%fz{JTTyfoa|8bge&Fx7&B_+l?E~i&xTYH6^Ksgcm>pCO&he*XhfgJ@YEhtJ9xM zp2XH}2a)Ci@ocUNs59=A4dMY{W5(Z~eIv`AWASkCUE>=kbdVtBst(PT zwZzY9O9zQ@)@+7H0>2DfYVu*w&|K(JVIR~mr^)hJmS%0VX!)f`Po<0Ccx+NfZ z`UBDg`X4OsP}h1sbhiKI0A+xJ+872t>JR?N?mgTUqZL3U9tGo3k)r|-gL(wW3`hwrb@FG(Te7WG8Ir7kVh}}5EMZ~O zXh|HAnp%?&WHu<|s0;}$j(B4PIpP(WOlwj$Nl>hBKM~nT|m`g*6kZ1F2%J`V9sfHW;kg#-+;^;~xblTI^b_VeJ<7 zrtsT>`IRt7IfY4#6d=@W+q5XHTj{Ul+0^>|4QqDR?dI(Rd;9)@tzUo9Haf@`%_WJ( zF26*`03Lv7?~!3|Do6$87R7Umo9ZA_mOvC$VnHQ3vDo}zVSZtJE9LK)#0SP>)+~mEI-%Z zA3-EKd50DrlDSCmNW@xc^$cslPxSHKDC4vWAJ-3bSAEz|;+q_o$7yA+`mTjkAuJXV zbzqz*gP(SRY2XX+of8US{KAeh?DkjXO&DqFm)D*2nh!L*y7o;nE#MX`)69-!flsg6c$Wgc7XwD3w2hceK1A06yVS`6BL(rnqJJCfoX zN`;(Ipp)Oeb4w%=bWz~30Hm?oRTkl7=Rk-$u&^wZAXp8AA$^$)|3&cy^$*ht6#g~nd5D=W#{_LK^&JZU9#t%eZhvKeY2#uU^gLPkEWxKo zw?D8+j#6H*DD~j(ZJjjXDfHI5cIn#l_WPfG!#?$w->{E;_yhKz{k0F;m5sh#TI(6A z_4r#!0NOI`62y}^v5Aioqa>bNzn4^|OhB{&dFvz)2f95Y)W$k*!wi4+(siLf)y-i% zinwck{+D00PyN{!t=C@{GJ_O|1%L!I?rBggfb@b|AL z)&ob7$*Np^z*c>GQehV<<05H~tH0;z6W`;pz8zG19RIc)*TYvKoTK2_V;*yd3{YVc z@iC|X8}2x^^^JiR2X$fL`_3_tyMpUm;;p*8{?ywSAo2Y95Li_D1HR~qLt6i3l_5ZQ zBJf@OyT$lQ(H2$!gY=NTI9Vuf`N4?f-46vhfB{v71cCGs$Ry8W=_zEhnWfWk(&7|B z2TX=Tk<*f1Ut~T^e2m5ihHsP?U;cnSeE87bxpUjvjfO;6=|k*;QEztS+-YmGzh;~5 zrXB3um( zR^R%Au1#fh5&~OhaluKErIlMT=M2OcvV#uGjkZeE+K_hYi4Uat(}3TQSu+kkL+CGS zB=+X5`}Uik{3C0xU$%4_EFm+l{E&V_zyKb^Y&^1bHj%-`Mq@5y6SwJ~o-8Kcxp&_- zw=P);ud6_~p>3@wwucYzs}G-j;dzPaqE(KGelF@j-85zpB+G>otHM_x6T2vZ&*Ee<>lvtnf}_Q$@B5N zy_|aZ`_D%=1jqHqBgjOH?Oi>yKi&2CT=Cg<&&(AQ0mq5c6hw{xBBzB5J|OI zpwV-|i_*aWUQJ|n?bN5ug+Q1061C42DTfh-QIzO=QBgitb0OGPS^^B{vcBGP#P zFfgU#X>3Ur$WDkFlOKwam&s?*;-2)r+)-9WrwmqBa^waHjY=1Vfdp952pM2?Cc6BYXkACDs_R{k= z?78b#?b_vai{>-40`eA?VY=eeh*v1>Zx9Za06+#Uar4pBF|@(UfFPu6QR&W1=Pmoy zfA+8KU|d)>=k(J=h|9*4k;rrK2IlZO(DmU&B0FeJb{jf5gSK`O6gWt~L1x39F?v2A_gp7X`bWyCxf^;6V_Kg>ob;HFVU7fH zpnvD?bBAZCn4imehjN06mOFRuSflZMDw}u#p)cm+BFFci z9=8V;(59Ay4=9~}(nY+};+&NJEZ@8?$Hjfx$|F6p6jBat3}6J1(g~z2wKGrRrWNeMlOSjyWKwA^!`vo~ zl-4R~FBMk8cx}k#EG~N4p#$VLHZNHtZraV8HzgAK(krjp!+ZC2YN1^Eka{FlT}rHw zB~7L4b^ErzvoGVBK;p|+E?JpPEXTzCytD_~rTn79AdaG*b=G?}vfMuNwFmb48#|Uy z4(!r;$3Fgj-(w$s?Ir7V+G0Y_soy-eCZsG*EY-TfcqeU>|Ch?UBd`@CmvOsmMI*O= z{hNPaZ{ORt&e~OL&m&pa#U2?-m?)MO;~>tP7r_P>b(4@ot0RGeUUwkT;Qisqo_Y3$ z=1azoJu&HIbdmt-l)t`}dQ*WVKGW5I+n z!{P#Pa(O*iAmriq#kUauFkUzWDV+d;bRiaigY>@GNP~G4>?0MvQ$?yr{Fi{#7+>PM z*?dkP0-#m>U{ghY1D%}yL!t=DD)n!Y$nzpnVGR@j$3vT^QvrW?BiQ$Xr-LXk z?ZI@t`hk-|y9-uD=E_F1(!TPIoA#Gq{JK5Zo7%>ub(yqpcM#R)qy^#yDbv140$woS zX%78{PKG=tMos(lXTMxqN2XWMpIXWyAwOI3t`)+ns@R zduyr}@yC;i_4<8D-{Bqc>a}aOzOktj8&0tL>jP_d+lH9$w1zx_5JNEN$f*T{f=gfl z;tFv4T=4m%Nmu)W3JBR??JF}5&md-;aeypOkPJ|n(u4^=Y?%- ztlJO%;P;Eq#n?l3To%KwmwndfnNQH1;%=J6rLRN<) zi6Hi?wpNm25)G~)5Yqc%Re8Q!JtW0d2(042z&xiOSg&Pqb7_$SWdsBfX^m_)VFz6C zeW1-leq$4y&jchToGgXOuq&q9s5^@(O@l590|YoBZL8Cg4|?oCfoP@SO{Z6WUc4Wo zxFtOYL`v7zH)PTq9f!EgZ93kw5x`T(EbMZTM4M+bF|>2MOeSVoI<+Bge-Rm`-{Pjt z%7%UOojdl)-~M+}z`J&3%huPr5`z{ezLCfUabphB4G2-JZE| z!}=R*wzjchy+L0LcE*7*8c(J+9*u$~{Tz~DA`&CWA4EbN`bqa1-+{j5s^5K%EY9&^ zUN9dSf98(nPsJ0dr&nfGeiCZ0iM9yx+ zkqP--n630Cgeh6`#9_g*T$ccLz4Pl6!{gPzOOHh5 zG3d~X!Y^npR1+b5QL^Olj~6HyL!KP zqE+ovH&vxexhue6E31jG1&QgBqOhx%dUpNFWqbWAU$s`dZ^b;ab`$;W$eQv%xbX4d zeak}QnS20b0?HM_VL^&*;X6s{Q7JD{R{#ljSr{g~(jTFo^|9 z6Px98!}xuZohM`|5zs(@xy^HwHG@KA+TFA_Za%cneeRpqZ4T_^mr$MqA)1s%t(#k` zY+B1&autlOip?YY<$v+-?W;Sf^^=a=0kA_a=Tn;wx2>EFgMJDO@}zB1r*CE4w(ej{ zK44f?#NXYyXL%Ic;L;^~=>s3I>(Ab>cE2lWy3nVkH45ATj7>gIia<^jP!^A>u<2wh z(pQ1Rm`Ih(VvZX@;6n2yOc;fS6&BZm+LpC=Z>?NUv~haXK9H^-_Od zRliU&001BWNklMX zyqHV^^wnfxp>cUweN2fDOs!8qe_oDHxB#&7r7TQ)bFY}MO!Vqh0}6rp0wVFURTf76 zq$d-|bP)5|1q-26d=}z|dZEx(VOCIzd}TNpr4dLljm#{9f6%mf*08)8PDYJ!Y2991 zBq5a9kXFJRO|#b%*^PR_;78A;+39MHPaBZAF4@8EfgSAbS-U+m>|=oi5i~%=H=PH` zE9w_ERuzw_+D)VP0o{L6l=jR2>NoA3`?u}y{5L;g^K4{o_(4U(rbWZz61TOP6-mqf z;`O)fPe1oH>-9IyvZ(qs(Nvz{CMp)*}^3sNrslE8> z3o+Wd1n7)}I8VWc((YlnV4e9@9WKk9W-UoXcaJ(q{`uJqN(1d-in9*HCb z5Gi9k4px3qDxHKPLOVH(?O{HZ$Z!ua)mB?RPRN%$IJ{u_773-WlMSs8X+b9NfRKQ~ znPV^|QecgiGm(%(D!m-?8m5>#FJ<1Gx+A*#+;cZ*Rt+&2rai?WvYF2iFcs6D5)3AiY*&+nll?ug9U<*|IiQHN51!CLe_{%Bl0WL?v=0xmI(l|^d}ej>(pC` z+G-qR9V0Y`_HhBcxqJ-k@9ac;t|(IN5Bb&0;@!pAdGZ%4V_uCtcy@m6)V=e6qY=~jJH*zsd~Y?31%8gs)N;>KFvUVia;`-{(h z!3M3CqwUex3kxe$6OZQA`2+V^3 zjUY%+zY8P1v^1YWA7kG1JP#5eKoBqw!ayzc^fnZmYgds~#jM;SGBQ@*x9cwa{^y$e z4Ns3Hx2j?lPr&2ed+u56EZ6KDGdpJ1ZnuKxz41_pW;h%KaMIJ`&>}g%3Jh4AV%=C~ zT__FVe`4cd@Z1QyX*l8}df4@xoE}@PT32287)Oq>y1J&F3F^bWe&1Tn6AAxIxqKjO z!&sV6ajsxdaiRl)(_!C+lcBWS#QKrX4rBqa)q>q8&e_mM{ozRGIdDc57pqoVxo-dW z-~7^wg~7devGvvE3S+=V;AhW`TX*%UM4Vk5V6k8 zWzw)4;~HEcv+zjmyNQj9%qI{a+R90I0(Fsx5b}oksfaK6KX149_u{iRe=+_l{Ul=I z8NHzF^`dv#bT4wB9bC#;e14I#Uv^&akJ(_n#ChmtKMTwt0W^*H(B6LQ4f}_m{4^LM z#AcBW$IZ`-P;Q6|9}{`J9bP9eoVPI)eCeh!qzgn!j&JdS)-GW~};8T8k!Wj-sV8NRo z*)SPdwOG?Bc-SA4an1(0t`09ECqQxGkG}mq84KinV`as5c6RLK_}CsjdZ4~pt6aBU zvu)FU-=?FvwPZA}kiGO%Vhvl39|Ce#+ffuW@OtCC71)79iENJb#uJN*W&7X%{a@Kp zw`>31fAcS`7L6q9`Q5{|{k#A5|FXvFx^+$u?D)x^MdPtm>p?RMLQ<+!W#tziE=9Z$ z4n{iJ&Ta^zi4wrS`13#4eE8^-yEaOOw!OVAQ!4xW``V>I0$_PTcu-+rPJp!e(YM)o z;m;c5bWsrALmJK!6~@Wu6Zy^yr177-1Ezcr%<1rB=MoG``a7w1{yh*+OVZc!RGDT}E=w$HWQ)Z=BvwjE1SMbxZbrqlv zhasiH6=0D(C>Rjr^gBK_5a7<>!VweZ%SXYq{#bs;3)bs(0_y~M$DnT?{L`;&eRIQB z*Vpw9yHp!n>$bVMu2a*TPdMd(U%Rc7>bMM_!k9`A(_spRFo{N%VAK$2TyZdS11!S{ zJGX)rFtt7!i_Ij&zqV!n&wu)*U0bQzU;L|oZj)Tz{_5}k+BVmB>}dZ}J2`x4#d5{U zwG}Ir(9o(_gyF*|^e2RyeM1M8YHYHV@QfMR*KWUUM<<73|FpYZyS;Nmhb@s0K`iKJ zc4Xr|V-)6qBV)#sG3MvU7WN_cj9-|`ZuiO;eRJeZKad7^)F;kL(o^^s$_VMGHx+vY z3gPL10a!A`$zS;u7@3LVAy$Wj6EDj4olH>t32Def8*uyV0T`(tg^qc68WGRQ(LB|& z+yUoB;U%s`XVrL}^hfr7mSD+^`ZHyLJ?p&}_cW&QH=pq}+ixXpKfg zrpqyoxVKlczAEg4UgV=PH0mYa-hnj&V-x5SgGjk>6J z=dDnQWcP}`D_O(-xBufmTB){T@4okr{oUXHCp$Vgwd3O>+2E>_8&<5=wq6X}>m4@vf9$2T@ni1M&v#D;S-TZ`9Q|%|l z+UJ7ax%`U5kQ^*cZMiW5Aa2sQ+ymH{W(p4YF$ za*s6xV4yySNi4@aa=icp?^qak9*0LNtD*QW-T%dYqJiGm%Nk4iW$&}`=iO7@7lxQD zYn&Q(31wfF??vOXgWzRlJJI8=a$Q!|Rq|aqjV$8^f`S0MUai?lvn&2^wT@|zu(sl3 z0v3LJsQxi6!WW+BA3AV&KJGC;?{Soa3a!51daaU; zT5TKm5$Xqo3f_dpB-sE6Iu#t3qM>zL1IrgyZ8S|}PQTJ9$ypU_v5ocD?ce>Me{I`8 z`MK>q*|ScwEw<&#<~3U_H|(@Ouwtbo?XlrF5z<7yf<@r4h=8?b_O*AvW{;md7AvP* zt=Y93u(sB$**sA@gq%}tE&389%^aYgC&~5_}PVOPNcgk%1AWl0&JvV zXF@*Sp|Z}sCXqKdZJXjVabLw-`si8v!TtZt`pXB>BNm@M{_5AT5;;G8Ku)|DGFnLJ zY?X!RFrgWIGQEUwm3A&mb6JOH^IVqpD$U52NBW?-#QJ<9lOiBK!shCxwL1eFO#{+I zCcpC+H84Xa(?rOI4-gF?*eAfwFO(7Pfh7;(=8u#5aZoJ{d~l#htW>Vp zcr?;#d>XNP0Op(}xx^BXF?l8fi*kwlkmrVG>l@p)zk64Mn~(5Gf(q?a>aOfXq5@i8 zQ^^C0AS|h8$whYh@Yq_d#0I0t-gxT`YpkwWr`NZrgsEZ9vLsfF z%*w^sj!us>?s2JP{a(wy@%A@l-)#T!p;%aN+<8OoXf<2bYj>=evN|0JGj9AeA1660 zODinaIT8psEFvLjLN`xK+KTYluBV|gDSWig#@kuBj=!k0N&@HU%jjeva~p~g}F@`95R)&w|v2d82{uT zXRT%rA3wJ4aAdVg*^*IDXOKoq@JBW(EP+C8>MyT2C2+vGEX>nBJEJUHCUVCY2`uD1 z2&RSNE-D{5=u3r6I~R)Z;=kBClNpptZs?e7r!PtJnM6Gc45Xb;vX=uMt2tK0e7wjP zwl+8HSO4^}K2&Y}r}2yhK;0#5KBWTJV7n`vz9zpAKnfNgzuGoifrcsM@OxWk>6C9y zbhJd^G$aORodQ8YO9@xV!%e!xDrJLu1M9x9--2aj>~HmY!IiE2kEB9#0i4RM-h1yo5xY-6{Zw`1 zu9k%Z8e9{|Te=HXe`nZ?j2}M;9}5x|47kgc;mBz)>^Q=NO6p0IaiJfAQBkuY`O`%P z^NF&kmvlT6RDLRB?2?djHK+gp?ld`M74w$;O{|&o|(#GECr*pXUPK4Q#tq z;p4pgU$uDphkk#aa4DPXc?-TOFqt`~Mm)=85o}szFHXa&*8cmSj{f4$&A;RCI*$H9 z)_M!Ys^zAErw%d!u@JcW&p&+PN#p&`d+s3uTzwu8&%Hlq-+5lIgEVMV!EWMYINL}* zZb%2}#9A=J${Mq?LAxso@_{@~zREJe!T~{$7+O7Ot(9t3Ic;L4T(05;uqI2vAVSVi z47xqLvD3Gs{U_FKcjTu70qp>9e3r9XE!KIKes3s(J00VxFmL5TQLEZvFPzcvHs+@} z!%sSFD^yE~U#U0b&bGF?A_RPTdaRS;aiJ7!Z%r`8(iJ-`DulihLPM38ReFlh&vEdJAP?%Yt{+`oTc?|=BC@5+)iR+zQO z7~z31)DPT@H9zhNj28p}Lh5WTaKF;QE*#+6IGhc_+zng+6cqSoeaDK)eC7=n5jdPl zK&_eG6yTr?iwY-joi`9yfq7Z`^da+ggZyn`H?MEo z#>SfMADqgfuOlBP4m^X z+;aJFP!NqTEDn!38$eySI2E1)!53^anHp#LV4GoD9=lhQD6g{{6FZe@6xo-mRxBPB zv@!<4uWfDG>uj&mMKrp~5NtC;qpDV^h`0=TJ+Y7| zk9Yhy7lY;!rrsf1$aGHIEvrsYMySahExRr{2E+^tiu|{4@2Fot_}~M{MBab@eOUp< zZwD%{T9ISZtq>fai9jq66UG;-&+LRSFT*a4!>+@ASA^DC$fP5`q!R3Eg@fHiLD-cr z#@X-C=Ns|Nv+Qqiu91)TnAGvP;&V)_s|@kUz7KU?&PE~~Y;fgS-A$%eEm!QFx8Am2fAH_cqvt#Yt9U+c>f@vJFn@SeIJQYSc%NHVx%M}qJ4hIGnT4V^S`v_myZAE$8x^}~E?CgjQ_3-`!JA86r zy+MzKzWRd|HKtVP8_cYLh}j*0SSxaGJBB}I#e69U`Z?G~zf5zo3Owuwtt#@#Ov}-s zR8CQW=FsE_xe9(pDizs?;?y?nD^==dvL+l>@Qfv6#d#1;^5d_(R9>+XMk}#sP=H|O z?Z%C3`bOB1Ks>(r&2Jj)E$-PpL2Q^C$UiWi>4b##F@^-*Gq!VCT9BQwa`!nx8c#>t z@J+A$8I|8KJ3>DO0X*L?yV|sGQ{8T_*XNLcNO#H9r#jP}vCl)#0}PA7<2=np@7a+? zact#M$w2(k~-Bk+zU>C|%VFPTRPnp&7ik>Wryv0}c= zj1(Nw6vM{UaAf%cY^{prF#ec~ES{D*jflRnMTL@BU2(B!jnx(HKxoHcGdRYVxn8sPzxzj4hzf?Yqz`}n8+*L>NT%4!lpW{A#sL|FRC~joRg((a2ZJ!E z&+u!Xs-X%A_PeRjz9QI2Q>}$l_7H&WTFr*tj@2tgTW!?s$>S&1Y;_FPWGj?yWo=b` z$8G`wRV@|GCXa1|b>dRNM!CL4C_&(+xm=JhcL)xI*6u7CqP#Fn&n=B5FS5Zvu&`qzFXcjv2oRDvG07r- zpIaJcY22yb78W&><#763pF1&G)=@O(vO!pukGL1fdtRAe4(WZ@w_MaGrl$0nM}kJNe?PQOvJXD zS`I%SLcp-QLVl2@b}yJr!H$;9QssjB@FZvbX~#-dF{`gw_vo>4D6ufD2v&9_tj@7T zg(~QZ-B#P(@+JJv^wtJ||mv1HpfckHz{zh)>u8MNEIhK_f1~CRjco$w9v>K|9EbljhT{EwRR0r%ml9 z+MT9VYh_CYecL}evi@jnx3S=R^ELS!8Dhk-*R!?tE$Qarp9BP*40_f+IksXwZ4-jg9^vyzXr>@pM$0;4<|TZ~r@5D%;?%Zmk}9Y~zm zv|qALH|$O@Ul0C62n^zc9VTL!p1(*&W64}f#iHzNQ4cIE>{8*@mz@I6vqs~Iji!+m zy8~OR*X_M;f6Lzf#@FrP-mZ2mo!-c>EKD7!56iP44$4x~``JD$a*|%IiKjyF>;iGE zD-$SX4jSgH)jYLF5AMs>*R|~%wz+*nHny7mp;d|nt2K%uAh5zJg@TR&>=v#ILm@fmi*=`}_VDO$Y2=uf6h)2B_B2PYzJ(^u< zzj5Fd4RR;a5Iyp+Ya=b1Z48L&PPMtHhxe36J>%g}c~niLeQS44q<&hfm*rd+wMfGNqvfqX2<~1% z%#?v3c1BpHV=KjhPY#^^gV+R8U^?>wVxcs~2DxTlQz*y*N~NkLad7!cI*=Dw52Sy*^#&??I`L;J8CrO>l{kEok;VjT&>%??|s{D-F`zXquqzQIyFvPVU5&t zkyWR(gA?qL#U(r_;dOvRuh+G1Z(y}b(TbZ}(ja5JfaSQ;vEJda zPT7}=t5%~QWbrq#T%lyu#)=K6iLKYyth83O`bx#NwzedsN1j3%H($Fcb!P}2=QYMd z>}mxT9OJ}y6Q#(SXP2X(Wd(u-;nP1N$}AulJczk0F*DYDSEvmKQza+|6boqB4FXZ_ z_3dbcGDjrh4gm}EBe6n0uwBvQBi<1@r}RZgMA#CJAz2|GTm>UXGGuDL(}AFgordfs zEH+_-MltimwCkikyhCy&WWNi)k7XGmERt%)vh~|7jXiT8YX!_(f|sF(nL*0H!VPgx zBU!J*-)FBEz00O^e3y;Whct^gi;ri~>5VHWEXMnD_8dv}%#6REm%i8!;d#bnT-c#3 zwvYaMDLWGiS}fdwz3loTc`5rv^IrzvMeje0x-aWj-m^0FkC|r>1t0LA{n?+{hxdf_*a4 z>Ye^UIL___;=nulsg#c;f60#mk_2ANkgTn&+TO!m+k5apI}TRml|j|&m8y_Ahw0c+ zQ7&vZZL_B7&Mpal$6@6G7ur%FFNFN4ry_sBVHdEJOW~j&{l@MxA4k&Sf}O|tp+>PN z_8DpMYY$O?u+Ub15OopZ8S)K8S;QnGZy+r}R)Ev~r>*ou=(n?4QIttMi#_UQK4?4< zWP@06)r`Ak+%@-u@SZlP9op>%Bo6^#UU;BR`Xpz8MMfDAN3Nu!PRbySKl|7M0|qMb zK1zDx!~6=R^Sl^vTTB|2Ws@08kUHp%Ib@4D|M2`QJwV^*|Mg$~Pct9z%Le1=;W=AH zM%b?x%gQ*L=T2f?x9$;&Ynea0b4b|=RtEwNVcNV!t4NuwyJ zB1cwl)NNy9-3o<(Oj(g8<6te|?k6A1aOKWxuM3f5N}h2+*bYHqd|4Qv0Vbr6W>#uG zp0C7DZ(Z{`3PM3X}r_-eh*B(i;1MAl~bAdI3M~g%GrC9001BWNklgwA8|TPeYz;V0>_S z9omDoUfI6;-S4PwK)j6EwTR!cWxtGj=e#_BSy>GEbSdZc%VJ9U=S4&QzyBZS#3Wmo z1935^(vHk#o85cgS@SEy8kaxg==UuuVxc!6 zrO|L?qv1e^)K}7!MQ~(CpMbddu}e5PIuz`sVu^yanCbU>)@n6vD6O)*t*)=y&aK-b z3c$w+k|>v#LoVbvAY526i4ba7;TNzRjLY1{x;h0PE6tM=8+5yBJ49q{Z9~N6_~ckK z83H7vIv(4jNB1Rc-@bmsc6WCLKQa==nw^3WD~KMG_7S@pY;9KAh%LTDYgnUdfMF$~Yf(Yrw+J?+4%iz7`f5yQh|~*&a9_znx9>{7;`Z zF;O2rKlo>I#?w@2!eC~DPk{6kS@zYH?ym~uV!af8ChsC#sbRrIAlLwsKyAP7XUp>E z7ay#}n!Z@i-dB9Ufv5yz=6zAE6z#wLum4N?xBvEk5q}w03rl`XmUG?%)mb61^ur|| zWm2BsXRoxLXMP0IIt>1-7wNw&Lh$%(9+@=Bjb<7}ESB{?g@@^hHDV6eq4_f$VG%hN zLg&-w2o!esX1UF(PEiA^bQYy+QCA{#r-hNx@=?``!v>O33S9S~ZErDm+#xn$oKpw`B zl{Mqbdm--B1d5NTm!V9VZ_mdUn7CJ2>|iM;-JwLtNiaHz^0W%(~kf6=>TWf8|mOyHgsGtYeBicb<-X*BG$ zJGboTKmVDXoSsM~Fkl6*mGJz`027Fhm@7zz`-J1pX;ArE&4!gd&#;{QVDen70qRLD~< zRkRa=Z3Pmi&tq6Nu+fHn>$KW-dica1-T%Z6_a0cMbz;eQAf*Fj5i(^WYXk-5t=Ah8 z#*c=5TU%RE+09&GM?a3a-wrJoVA(NnffbXhZS~&^hc0?F&^rtl$dC2 z(sAbA$IIh+<_9r>SkZU>tlbUr80=4ugTY3KfLtf5fH^VCE=K1prLZFk<;5Z(WTPJD z2X#3dj1xcR74Ty*fSnl6thT9YgW}Q{rCIM z=33gQ3nJ#B;o}3b@xgJ9gVVlis}1|pKmC!F%LRLKa3r=!j7C%{q*dQ%I@6ya27W)k2G$tQ z>4Hz}kFfeQA#{*B^Af@lrdmKSVR+}enbDBb<-W2E2m>U=3K)Wd<`=t6+6J2o?V?(} zVG~$gm}h6@Y=MujJh%=P5yawc5bk>a&>#M>u(IdARt?qxV3{2qJdr#JSqAE`utD&5 zQY_$S9XIfSrGy=nN~J0jC*#3L1Ui9ePC&k?!>-}LPEStkXz!kNTSt~l29^xFGO;gq zRSBC{sfL$!B=m7AgMlkBmepTS z4GWJj`jTsD-Z5|ItTC?>m|RXHnA5q}Zf@g?WEQ@C*0Z2xK10#x<@E8VlSUyC|tiV3t!^szN z_TIbi*|qD}?eG5fCsry}EiQ!BVD>}yd&*{~qmT9sYby{2A!k;)v>_E@>*J$;qF^0( zsugW$TpZHo`@(UbUjYd;hN~Zn5D#9mA z=3(WkGEzhe^5h3XbY#Un_PIdj5G9b}-tHq=3E*TsD#j;=ht})&!tN=cE_rq2aHuq{ z1|vH-JfsnF<^}TN^TwC_?(QR-^p54o%94Rh)k9i2{0Q4FE>`5sN&DPV&(+ha|IAY?z zK5;6G0!SD@)|C~S;?D2KGu3*zXCjw8JWD!H%k?V1Y<1bZju4m>u!azd>O+B7jb_rY zFBwA2ZXp?qm2%QNv6I%3jfXG_!-^f`p^y)T7V%|(Rurr(`Yz(sH|G@c2w{;21dFn0 z5wR*|A%F>UkcrHX5T|nu2wp?c;bUh!!U`JU`FMgVGpp>pR;2LQxyQB?M6laOPExXR zWyR_%>vsLdj#VpF+uwg;>nn93WEmku@l~q2>?8tvht;_wP5O+!;s;_9e|{2Kx6_q< zuTrTjn_U=eEXHQ5^{SOBD|UEzEFnLQ=yp5S>xQ!~unKF9ip;T`oSte2SS`gi?zF76 zw`+srLmLg-h9(z&U4}`{Mx1OYRjj(QAs;ZwaBQbX$6||>3waw4y0*XnNJw;Rd&~Bp z9L!*5d_b;ToiH-s-X6vYMFNNuY50LBbm$O;fEYDqEao!b0#e5vaxArM$^^-iFUX`& zBZfe*APax25poto{4Hl?$}9wxW?+zDJ{8VWH}i#E9eLR`VTCx3^U})0D5;!$CCEyG z&l(gSfDIUdZ$Nq+t1&m2)A+SP9+R+}B|i(Du%L2;sCv^eX2u2MKCVa*X|8v2pqYLi*OXzG)90?O9Zcbx;wuf(H&#`Rdg_4u7|J1&Mgt>^&bf2-~mR z1EY`*0$o=}orGNpF!7#%2SNx6t5XEg<#JV5yhsK^j77^Ktgh6AoN%#=U9L_aTVx}h zfoRlfVKthrSb+ls>;$Es`su*?9-AR7^kTUeGw|$2IMcyypj=zCYuC2y;NVDyE6I;X zNCdgSf<_o>*LUvRvd6poI-#EQx^{SSXi+X0ZlvB01gOlRzeFs?B6i0h!hH~ItOJl7 z7`=D@t_}jOZ*AJ)$+7AHc88xUFnC`LhT*&n{i@wVTu>kIo<8R!Kko?McHVKXU#j}c z7~-G`ITG*bN0b(d#jx{XXmZmah=+wrnV~-+CONB=^E%YXPLy%uM>@{naOK&C0rdfw z=Lcq=KM+CU9Zv3jUJ^G&&XmIKeZtPh)R_u%E z{aJPT%E=?Y0$197DKViR7CUJ1`Sa{6U{PR_rGO~z3InQkJOl7wq;@X@dl`KCIN|4O zBNlpybZ@=+roH+49sBi%cdZdMW~YoP7vxCb&>RK;`LGC!9~jT^|_Fo_^>c3Cd$wfgQqvLoe3Cje1?HZVm%d7TQ~PKl#wU@!q=@ z^#hL|-y9$y%46q&wOC*Qf$`&>av=l|5Cq{E!~}8jp8D&nEApoJ(MKQIYj1vC2$uRz zj*f!;tz1rScgaV2Ya5$_>-E>~*xti?_N$M6ZPU@f$}t30SeV9GGR?~)+E&h0xA(wEBBnfqUjV>%AB&3_je!oOz~3&T5nN&)^#uN(GG&{r@_pR+Mn7(bJ)Etr1dz@$2)$knAvvlo@e?3 zO+CtEXYIk?`}0@zn(fo8_JQZQ5;3`Ip`T|u8pLO!$&=ZtEl#rR^XCcgXH_?5N+zS= zp93}oAL?X0w0vB)Kl$Ew?Zb~g4M;Z%t7DA(sxSGd$MCHKGWLG+cmAAhha&-h$A=5= zoagWZsm-;&Je?5MBnW6dj*lG&SzPfCB3~b97I8SzSnUpjW!%xo?tgmEwytf4)8tds zd&@$Cm}vnfV0JUljcyVfNe3HUDYfuRjpiGv6a;g!yF9$ zTk^S~wCf%{dSFK<$M()U?})EY*(?Ac3?O?)_!_^A(3~=OM?XPCeb?YuR{pe?XWHxS zrmY07yyMDy$#2qKDg@U1N{Nw&jKVHMEW(ThW!?h=@FGi+8{WK`jABYP*G;o9ra`qC z3k*0%p>BRYR+Qm!C=d`BLs!(`IrIbS*mnS|_P7Af#q`e#?~CSt*7}|`{UUsP zbc`E3Xplu>V=Lq^rr5XJJJ;>KZ@z24{mn-@H&Kvwm#|0k??5QT zJ2C?YgbzRDW2ceNhZEPtdpgSWvK?{q4$HS77a=K3tYlP2*|Ffi{O;Yr8oG7omUa4l zm5Iw*j5NaG@$zUtWl|P__)e#zD=e+S6m6*$@$}c$)}_qA85G)v2g~iP4STYGX!Vtb zkR5HUlyI#Zb~Te}NxsF`HrDM=e)J>z+0TAzozt$BYAZ6Szj^JZt!{2xsZ!H3Jsd}| z?LK~Fckg{FpCs&nK*p?|gJM8YeM()~FzfGpP%8!oZzqVD9fz}xyxkiA47-v3h8R*d z{Q`mPbvhac`h_^kp*(43r5b`f(}#Gc9FF=TVh|V7QxMgi3F%;c)rFuqSlJ2U6UYbIpO>}mqPQ2$e^J>l z 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 RlzadH002ovPDHLkV1g*WpmzWO literal 0 HcmV?d00001 diff --git a/common/mediapipe_api/handlandmarks/yj.jpg b/common/mediapipe_api/handlandmarks/yj.jpg new file mode 100644 index 0000000000000000000000000000000000000000..522c8b9d9fb6b20aa2800ebeea48be421cc2d96f GIT binary patch literal 275900 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Ν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

PF!J-x-xoLy-tAb<3D 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≥H}s8Sv;gdWN}pEv;w3D{F3FH&^pUxkgwm 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%0AsG#~%)_ArDnTTWz%K2o zgYyi2Q(q5KT-2pXY5UNUYBRsugSDReHKSHt+4}}po#C-`;Gt4AAte>f87C+|cIryW zt1DeSnthJX!yY)fEeDv)vcgqmMqsC%%FoWzkPcV^4td7rud2Ku<4go*kj{=5dNbsv zeq}AYX*mszz^fi|*avsScQEPNlRl%R%583!mV_Ub*@bK(7MrwMYBp@rjCFyu2woMV+F^OMhP@<3u&*Yqt)HegWXjQN|C zD{#Yi$}j=rJZF>lhBu#sJQ3qFVqZK8F7z~gO&_E-OqmmPp8eH0~9=CdZ-LKo^U0Qd%m8A(=MXE~6 zw@#i`w{z+HHjY+?XjHE`b}hFXOMKYc00a+DT=VyR15Z?t1Ll0k?v*5G01WUt=Wak4 zz~qBo7ouxEYWZx;+khu~f=d4Y3mlf`B=yErdh&f!M84h@JfoBgf&%=6;FZQn!N|@) z;N)?TJxUe1l6SjWS@u?T{{S!ebIz$tmAJ`1R_vbk+jjo|TP?Ti>G8#}BV}bEFFzq+ z)OBsZo^Zr~GDts78))Mw`8ZQ;wz~Hvk|H)YI~9)6fzCMfAmnl~SDpbmtfLdhal3cl+^nPka>G4I zTm0DaaCgOIo&+t~cOef=>ci+q5e8dR_Llrrd5~HoSVh)WXJoY<2!~2x9X5A z+C|(ue86B}qa8tBGs)xo+~XM;J!`@~2?(LpJ|Sq1IJ4GlH55S3N&eEdn%ZmyBx5>U zN=D)HXD1{R!%`8BHZjqvv}CN(YVmQE)zj9=`ZjtrD>>lmNx3g&Qk z*0rU!g>L)sF}7_~HgE|!>PW|*D0@ou>1?MsMR_?&EBaQqMQtzY;H0T3&98HDGsfqU&U|XWi7qXXok?`vw3d}kev+D1<4L|$uNSIK zaep9J#E215mOaEM_OB4Z65s1~zhijgTiL9Ii)B%#x@oPng?B(? zh{tzp3dmW30^&A~Mw&I<=GyCBYPv#6Wjar*K0-%s>He2>7n7$&sO-RU(#sV0a%Lrt zStAoi_vQoMz)gD?-L~UsyWh&scHP$h0Prq+-eXOw@{&=CsFanq($~{lyXk9st0NCj z(yn}{WRfzTYssi2az@4}jmVDP(nJ|z%NCzCt2;=bC=xNrX2(lyq1g)y=p+RVxv_=g zZKlZ?OGsmhB$_sPe$N%Xx&U0@c^2}n zvt}4N?=1!a0a-*^luC5XNtCDhUERH^#sG#}gm*tG6aigk^Ik}#S0~H1V8|7gy%|sV5q6ihABEOZh^6xvpNxu8alVIH1-+hpP6 z2!OBH;Zhh$yhki->dd0PaJ|3OF7LH(6?lU3d);2~^%*9b@<*C!?j+p`<>VxQhiFv? zY*DJjfmKy%aV{{WC9Iu9*0yOyq?-BP?!S8+&{Zd1le>zh)AwDUGI48Vq*6`w)%3N` z?JM>K_@ig>f8ZB{^@!Nq%Qla11<4KP1iiOKx4BH6t+34#;aCEVo&e+f zscuwd@KpY_e%AgOw7Kx*?b@oOjRQ#BjhWbG3%8&I=M92L7$h7M_|9d9 z`mQ#;6{3w+lD5%pIQ*PieJsB7^{lfO?eNqpCx2;5GHvU5SthUE_v@yM*UtX{VcAgp zHnEynBw=nOfn;HY#8W&>xFl`}u@DJgn`t>*0bft}w^n^}>f1uJU`6bXw@!qxk4}$c z-o|!q1MN-aS?q9DNT$32w?;AX_w2WKK8f(U(GoR^O+steT)9xGHRR+>%| zxh;c`2iKntbh$NKv#ZS*+jK-$%2cnHX&E9S1_=gMce#)p?Ur{{Y$yZDsUAzc^=T!e z-?qM=G<#Irl1(33@2$nwiAdR?85ZS=n&Otj!ILOJ)NzaaWJ4r|u-GZr5Msdg_C@qkFUP7@s8;=8$ zdHNGVfMr)>AG!z_B}U@gl##Tc1Y`y+fq+f`tfOr@w3~P6-M=0D^dfV9uG{wW^WX11 zV?>CAMGD(E$$SN-St3EL~NcV$ZkE%O{Re87OX;G7f2ab9zz zM!=$Ajlo92g*^bu{@Xk=Tz-(-{#|NH-1&U}aeL+BgBo`=tsm9_1mpe{W9?nKcZO1vuz*3dwmXk4cDxpr|7aVRay9egVg4tXv0HlXtS8#gi zt@Sm9hRwjZQiuQq79@P9{aU_rl|Ozwf{Mc}^pt8SbXwVOcj~=v&z8keb9Y}B?Rqqn zZ*48R?_;!UrB=wnbF}e>3Z=5R+(P3Z;~9JqtZ}qf9o^b75iUsp{HjTiC?J+Vj85hG zer6!3DZg&um76}H8>uYn%v8-Cy2QK=X_y{w(Q7?P%|*$oZo@A}`B|8#BMM7~#k{+3m@ozM9AI$FRaI9w-LQfVc9W8FHmKd_ zVkDh5-j?3#`rTP4_w?#|lqfj872D{arSEmwb-yZgLOG(3RQyVYdSGtMoMiw;|z|cBMH3xth<4!?ruhQ?al(K{KZG_2wlXk zHxRp&WUg6abDz4nb4&Z#0^|%0;1aCJ6rI69!;z8lw=IlwwS|23Tc(oLcY0l2Ur#O1 zqQk~2DpFqZN&2*szMHpY-)pj!=`LG5G9wjig3Y!v#DWF^Cy~$J;Ea!(B?A!55nDKI z=c&r!N!%CY19ACAyZ2xINVawp@dd3FU(t4H~ghKnP=S#ZEvDpLh(M0IFk9GDgyJ4so{VQbZ*3HpIXU zt{6r(7shkBx1nG#LIxv@8geG#jC_piv?v+!*f}`Q0ICJgPzvPZ3{5__Pe-M?>Ym=e zI~j8~wvVTs?ce7A00Rc*)ewdoQ*g)}t{k+d2kPYs#~_UV01(a{-MThO`A+`;FCZyw zqO5zi@EKI9S8nf2_0FTJHwwir)=DM@#ZOV;)&r&gv~VxTcj#F~w1yS0a}W~kS)Yf5fSPkX{r_hi&<_1F9qbM_|i&+WVL8tcP9+7M`e6MQ3Od*Z)@ zKM+>fOFo;bc`>B$UB$I0IxmRqq5jX;tXCI0ZltzawVwOEHpCC}?D6lzy=%bUE%Aqh zyh)_Ki{j4;>w2Dt;|~ixnn1B?8gA=tUhhq_X}-_2GQ79CG$tE2h2@(^dsvJXdN2A8 ze#}3%uZDkVZ-VRN3+OETG4Tt-`lZK#zB%{|NfO-rH29$DC4=~_ZLZ{s?tcRK@t!&E zZiMd9z5G`bHTI=x;>*n^@yGrPH~Ru7#0y<}_N4enqsJ$W{3WNX-xYi}V;oZ4>)saA zUB#D*bh#~A-d#^Ziq2b>y0&zC{Tu8zLnhZz7ayy~i13+~DuxYKjZ8$av|b&~UiEmW z)Tr?CZv6PTQnTc4Qk5usRd(tqeqV*kahVgZ99(Z zdH$QJeV0(1PL0i`uWfLl?DbYldp%AKvPL6yd80^Yni$}T)=BM_VGRlzO6jRPIJfT4X6&Acr+clrbm)GFe#!p;w112~0{m^W z_?7U^EjG$q{R6}rCye|%scO1{_F7WkW@E}N-oI@X1$!=*@V^gTyMi^O`Cm*R)<6^uXT%r7O;E;Nlw%uf}IO^D6e zjz-hwfFfOKS5~sDMoFxlk|f+G*pU1Lwy zqS4>i$Z<}cX<=tq+^u?)qS8@QN<8pOM%?A9yQo2;c(O?^N_~@9(=~?h(`)wEEp4Yqbz`N^r8bv!d~EIP^-l`_0AqNGB+@N( z3F6oOvT?diYSyu{-a0oQC%u-hMvu*+^m=b(^w*iS^J_(I_vzQ(w1$w|d8MTJS?*+j z6n2Ns{q4o9V24=}C}oVNmK3y+J1J%a8@i5~ZlIDN@g2qq?e2=QnB|H^n#Sm|F!LmW zXw;Lnyww5|`+62&6$RDsU)lYV#oS)%uni_vs_?QK5h z{{XAr3t9gFw6yTIFgKkLD=J3h$!~XWBP@v&$lhRRF5r?hkYTYN;_@-cDYp5yyT4LG zh~687Y!y=#+7)obgRmLxr7VrgfxP4*vlR`b_D|MPk5%8(@_iX<(zAQ{Uq^n|UcYy# z*aL!bp5TA={{YWgP}m&jIpgu`&p6Mouj-O92?h@ z>NxcWzkW|0{b_U89OM#4I(N^eX{2MnrZ~qK2iN?Lw5Pep2e9eK0R9>J6F~X2Non5Q zcGvJ1IUr{_7|uJKk8U~R>(5M6!N9-=132l9I_D>jo%uBo`e*+D*ZxQ2KsY(~>C+tc z=kTC$m6ffxnq7b3{{USk;Et#Hb?Mi?arhqe0&&k=eFk~{Sm*Pm7WsxT`4QCh>(4-Q z(1S=0diLv+!On4!&~ks7rOO`6`u@IuHcOLg&Hn&j*ZJ;CyVI{8xdRydGCQ81r7n5M zv?vCd<&q4Lay(lCPUU}`$B>q_EvCkL-6)p>-v8r}a+hx1AZ}TSI z#(R_7fxzRQ{eQ=fsm3q>&mOtt4Er8W;pvKCKD|Z(&l&BXq3zQqmvP8FamUjG`f>R4 zP~g-1wf?oT?hU52l3Mq*`>Xu?&j9%L@K52JojT+nF5#`Fk-W{GTsB5qxg{%x-ihUn z(UfH%9I4<}!k@Hn>|5}c#$OIBJVB>vHr@~M&4!m@CZ*yXCOc<H=ccwbV} zd~xCpI6(sd=_%5+C$_Yf0?8RS@U+VC-^~mDd3aCu-qCy}JRjkYkBqijt@ng94P#aK zgQMGK&f4?DFL5@Uo*?kx*m3uVGwyD{P#D=VM?^4MqJJ` zsZ^XK(wu#(m7=7VEbOA)ugzxGr|TIWbzY_(HEKrim0FZzDDyQZMl_u2a^CSt%_}V) zmU^G8{ul9VaTubX_mP%e%3PsB7>&r|B~I022Iho)1C|QT+yg_)IBrrt3N;r)w4Fm9A+wmimsBsanbdL2+$+ zX(YDuMED_^IU6T(xmQ*L*1R+0DKyDb4$6V!S3tp+8?wbqbXLw-CC2U9Q%4mF(BgMWwv{-v^I{OIgNHnorW!yX^J4^R@LqO#DCNHb#!&7^GW+72Kex zAY={1WiUYsyN==98u#xHc%>Z2DoMG9%mLAcNg!?7H*x_xgJAM7F<$}rOT@PNyfKjJ zvEmA>N`x-Ukhm-fY?4)h$sa1S1B&-A3hNhEGe;ibENsI)Hv&N*0$8rZECTL7cZIi`s;q@=zfE&MJzGNlFUcU zTOTmN2MQTRIBXzOo(CXTacOpp>U_st<7gpR0twCt2aI&egOYQ`GhZusKg5mZMm)xq z9Z-^TKqQ<9`5D6TfVjZ`uy9EFBSgQBZH!fp{i<>azyopHg$slvLBLI`>(yru} zE4HiGroTU(jtbal!}7?XjHGsqa=cE)(7ST~)3bIAFW{OYVo00v#Yna%*fDoUOXse@w{ zMP0ma#{-U-JnmfQ*XGLMN#ok2xsrE!*>8Px*4uow^E?{7%Ga{hCe&5?S>NTVcV>HA zFO?!~J0(U@)w-$Rt}p-tu=*St`PV=};opopouiN;HT-CLo-2XELP zQ;@dcNr_Yfq>=SJ5c#`#J30)o$jCi`A&BYA5>G-7Yvum{j8Ojo!ZYH(3wW81$n5po z6EuSWEse~A&rl9a4WX=VZx<(!PJ440h^R(|YimlZRHXFxCe&Za-5ppb%`8P5+uG22 zca%A07kjOFp|4$fp5ZGtRhW~JfUXX}du2z<>&YVnxvn!_x!BBi6)c2c0HKCQ9Zmtj z190iVUMv<2DE$puCl$C7n3vm?EBdaMA0E-+dc#(X-3V^_U3uSgLd_69q zaWv90Xc}&iZIQgCTXxcZ8)|myskpH6+AEOqvBc8iRYj0U6VEk`9Oyp~H7M=lA`N#? z@a4d0_W;q~S_yB2UnU|FUTQI*-?S`Jy0}t=*QDOOcAgiG%(xG#>J}FW>X9NOI&Xu# zKLzw`nah!Jai%P*nA96{yK{x|e)kzWN;RWv)Targm)cQ^sPs=quKK30rH>0Qrky!Z zovli9q}~4j<<~vw>(xdvzMVI@WcY>|Jayu$;vKDL@TP_0%UgArh+plI_-{~XrC@|B zL1U_F(<3mAqM8eN7?KD+cA7ZSJ}BJTIGg)6$}KYUOKBv1w|0+jX|LJdW+qh&n`1Gz z1(woj8Yfj~$Qs&(tJ!$l!OBSe55gk z{yN^#+{oA_2_)wHFH#Ox_q+tZ?29{rS|Ij?{m`pb$17bbgRK; zp>A)qSS`)GJEIobh5U2fCA`r{#uL1yjM1{P1h=6h#@GX{|8t!EW`${u-?ITKdMfOoTV3%S5B#?5xDdH=yD%q|1SrtyzI3sN6u1hOt z?;H-tCpqBO&bxUdT#&4cE+?4^Co2jfBU~o~1T?NtIT>{Xb{OEb%f_B-xmi>h9y9|4 zA6{JZf>vPzK{Ht_jlEwuKxh= zMDH71cx(2C@dk#@63fJzEt$&#LB7*(9ndR%)4Ja7UF*0K6mUVW>QnZi5nTK|ySM=h zeTA{Kb(P}6gxoUUyk!7|Ve<@g#eXcnus4L)z*@J!j~_-&t=7HbiT?n!X9EIDePJ&x zY~zu;Mj%UN3(!f2&P9JppR`wuQ1~lAw~|{w@T!eXCw|IWX}?2-_;cab z(mXHWF9o5^<67GP0BOpZ`B17o;_eu5zGIkhaLm#M#|FPbz8`2_Om>hgVMI!bHxH9y zsK)?gwpowxjz}38$I4#>^j6g6ZFXgLj^Ua+GF#^RJWYfu2^cc5bC5_Xsni80^aH{g zOi?UOR~Z1P!D0pg1ON!j7dhRLmEevIe7#D%^Sk>k=$4n#$!)iPxcbDSPMl(%wq0)9 zX?ol5yVGZT`rn4^(il;=8OF`qequ%&a0|<4q5yNAobl`09k(ZU-YO6ifB?qfp13=5 zyGn!H9@XdCC8$MI3O8`X9HGe=+(-cA@H5mB2t0s2S4o3pVfGFRgY)2$5kLg619ISv z!>Ax025O*|n&>IE-=c>>e0vxa!C2W!;)2SFytI#KQUm-jisjHM&|=? zP(u`O2vz6i1w%TC0a)?IN6azv6&yp}_P4~F*4B-!ZLQUQ9SxNhtrV|yWY(9vT5G0{ zZrU1m7XWgHcKz$WZg5B;3CWZ)5ZiW)4CEYS0g-hpGL5(nK?Q@9J5wP*zyxJ?X9}Y$ zlaRq`IUQtNg332BI}QsFU*^J)j6)0+`@G~5fonPCINprTxeXa$6kul~EseM>j)NH+ zf4VTMh?P~!?QQP5?C4uEA?AlY}4viyKTpNAa~%Rk-rLlWf=-b z030#FUA;1KRT=jPzznUiTOV}t8)}oD0MC|GaI1_j093O!;)ew{Fv@@wWr1=sK2o{k zAa~jZK*blqaU*RXGlE#;0gcS8axhG)p?Uxb=mP`8DRVow_w>)w1l?80U!oa4pfn_<0C)B+p>58+i%=ziO4xW?Ex9!V3o$#0FVgJ8%ZN?eB|ch zn^In0k5&4ATitUw$91ae_0^`W>C~p>fx-Els8(esqeNH+48Veq8EgW?lP~b(i2_DJ zL$ng70ZuXGvKJr%4stQKIdyD|0!=FwkVwUH26hpGJhFuLIqSF<0KQpUXJ@XO{$8TG=1*mHr>6e99&vr;qd6E1 zLlAf^fb1V2a#;c2l5>rK;Nw1Z;zimV#-umz7jXoI4Uz`m;^Y!e<;!g&0fs$GQ-zDj za=0F3Y%n*e`M`64qi7)THjSWe<;{8Sw-1>E$W#{*F^p^jYi=N(FhEeCm9!?Ln(}- za2Omh2Lql8kge2$xC0rk?_ENn-vA_|YMkYF7c3FCaxfWy`G`dz0zl`BWDe?}uwj6# zN$4=Z0ni2+R5>FBeSqhm#Qy-UhN(rx>28h(pUzfAZc#&jY8rHBDd59-HqgT8a}V8*xvr= z{2Taz;g1`5SHfN*@Xo&tSAUxxK>3V4FfE8RC)wVKv=T~Lv{e6vOh zwj_y^NfUqyvY{m4=i)Ee^Wp{n0PGR*&TrYTtm;A+Qsa#L9H9?>H0RXVAZ8-9V1flbhp@HqTXSGoNK&2N>!Ap z)qJsqDaq4O#N9>Ib!hV1DM>cZK{{ zG

%CGcCK$QstuQW0J1HWscepu?;-Fw1eG-#yphr;6-u1+A32ghowH+|LD^*J%tF ztZe6rmdjGRL=MX(rNWB|Z%o#cM?ZytF5FH>Ps1(^FqA)L^8=O#fRGUAK-WPul<|6 zP4FY)2aEn3_=3iHZuASNC4%ly;@er$;FjXv%Tv>(M`(q_nswE<)D|U3?JuO8Pgj-* zVJG&g`07)sM-xxksm{^G(uI^iY_~3`>)h zB%T(m+_~K)6)Ja=NlI}|E7~rlK1z-&ncL$}4fwXlQMI_xwOHdwBPnTj4bruqwP5z= z%eN_Wc`>roMwE(e;g3=}ex|T1+FHG`Lw^u`&2=F^W`VaB z)$O8j3)z)t0!>#>m-i5>7JJyutZlmRymx)~g?v{nu!_-cW*TdgG!V#*BsLdrs*|h1 zDIg;lJc7)jo;8kV4RK{03h@+ToNM9a;-r-0%XKJDJgqePNoi|n_SH6*p@pjCr-j9+ z&QWd^BPiZAAuTmeqw2a^_jXMG06=f}B-i{Eb3yp}`e(zhiZe&ye~4DvZML6vsou=9 z=>9H&q)RCFGcaeezo;vE}W@NbE=i+u}Ahh6Y4 zxn|ndx8Nm?%Nl;QBoJuh#2yH}yP6vtD_htt;EPxArmZN@@85OZq@EpV{6T$t{%e1- z&y25P_@&`}9xo6tgmq0~@;x`hz9zSe$$Je?QG$Iw-YH=hR#vEW+k5Ms2`?j(IMz)@ z!L=AJZK7z?`%(Re{{U{k6w9LgH28n}NohBBUM!DC)%4#3d_vO}>fc28h2cFvLen*9 zUhYvPmXdE~vC}RtZKaf%S4!1Q-KB?z^xw9NkEqG>DdMSe*So0+I6A2)!P}RWPR{VC z`JJ4Vq_j=X-G83(CPzmv#5$NJqe^g7cy}wx3EfT8O)h$A#_lnboi}+jp=N%=d@}f% zr0W`-I%vJPx(^+-wVnL%-otzjpLlG>gW?+t^j%j^@h6ABv{J`fhgG(UbhBLw;{M^a z8@UU869k3};-um`p^gb4o=v+WasoJx;fF?MmkbC+E%8Uh-vQb9uSt)`9stx%hvSPZ z-PvBO4{rs=rD`wWi$&EV`vctn0AlMh+|Q$H5yuqwIu(|qdwZfsZ+)j}tv|keDfpeI z{8sR8ldoFAbE9i=>FD=bMxhZ)s~tioWV^POGl1=5e_?;8+)V_83!801)JrAJoz~A@ zq*jh9PU-V?Nvm(=X0@^M(NA{vYRPHZ`abIYb+PP*Bzv}>?zE9f21oHn8>Rz;!-bLM zP!50A9AJ`Yq=sQ3fHIVCDph>y`ebb(!r#_qvb@x7020=XXeYoI#M;SeEGC>?tFyC#Uo_>@W^1G#_+Wx;Se^KOt!1@gOAZx0pN@d!-Ms~0Gx7tag1@#PKNF{&OjedG1or%108rA z(|teB;r)LfdP)Y{cE3%DGCSiqCSP}I6bfqK;6eay))1904{kaj1HWL{eSxY z-9OGc_oc}h0R0c^$3u+v`th0pTdvmpPYL+fXDE}x`ohZ`DP?s%le?gDCBInS*|I?@ zJo{CQkE#SG0g>Cmm=i6mQTWRpzsEv=o*21!;$iEb?+DB;J? z9PFfFvtLX2^FUt__-_8dgXRQFh#5v%E-hqRh$KPWq_L?ho>Z{Se5tNVbx())nlfHV zY|G;78`~|DG;$`Js@y~;wYGDYc@5k*0ab{2q>@P0m&)EYr*2iIv8frZ@7_)6)!)AB zPJ)){tJ+X$>D4POeD2lyJ85lCfIM4+wbQ!#C00uBog1Yw=Y2J)&DYNjmtt z^4jjg!9u{1%Vyfmh5f?Hk26VedjJDL{Jw0EpDG!yZ$FuD+aO$cd*auQd@XwfFkJX$ z;?OQFpoZ26t;dJ0zQYxhMQa*D(`kjo5=$ADDQC5jqqw<^mf`;Zt55hUu8F4jv-XMb zH;3(G8b+7kJ%7bt5j;%Ru*G=#m5z_1_-1Kkx3GprB0D{AQkzFx*#S!(Mo}->R9oHL zTz@A&wx+jb;%|=LI@c{?yhrg9uBUSa%n@4oI-SIJ!&i~q%J_7L)Nq6B*T~LL4 zkL={QS#+&VXas2w;p z{6TpLySkDk4>NdQR4E0YiS1VpCy@eKYZ1c~(_Lux_TeUf<+oZW`h&;wlM4k0BW_fP z!k)nfT&Pk(1E)NCH^Pq&-Rqtv)860hmRmKwE-O7^+w75>TkCf>EgUx&HxT(Z3kVkx zOofCE1Wx8PZR?IBDZ}P8xn~s`vR>_ICCsm6xt5A*`f9nX-I>)4eOwJmRHo8`lIDxL zjNew0cZ{D&M`vzjB)L!RpW*L~WYMnTwU*~Fvw;}o?Q(Doh{q$3m6WotJFpo+A946U zTY~rmSrNvCfQAJ@&JGD4lWZf}Sf4PHl^-Zvw!#c! zsTj`S83yl{4ZCUjEEJxa>a^Fhv+egSHRycKGMbG^LdxAbD`{nIbdA1$m5US`wgPZB zXO0d?1f1oE9G-_60|b(Ocm1cd*e-k%s!H565P6D7rK-zg9LB{3+ zWNhO(Bp?MqW0AK!0)LMLmBSq6@!+4d6yI;~X0EDLU94x?NjTlIOk@MWA2H4{FnG@u z*^YL?RDEq1^G#dvw~@=2Hu2QcdMPNk*3L@)ip~E3TVC+?vUUFe4rn^OtX@r9NYeEd zXDjo`e`5{PFy|nakmCdrPu@Aeqpgy`!3A&$=Qud%M$!&=9G*sUbDUQf@KWYW--Z4M zo&NxN<>=AaWR6evRP$+o}XI}U@+ zl=-bBt$3%}{L8P&?{5A_Y++|4n$mJ!jXNflmuqWd<==>K7KTFU%7!`h#~Zmj*kh~h zW0DBxgZ#Ar0Ks#w?k)Zqd?1P<{#txsw-b3mc;Dgg5XEntkflw`@do5$e)01qe^g%( z2l^$}<^(F?SArA+w;@j80d8^|I0qnLn*LLN;JOpT2Z6p2*iVOo_u_@;+7XKxV@P}{ zuUyA+fI1KKd!&WD%#efT=WiM1$*ju;l1+PcblsOPD{tp*x76PeH}zaY_+PP&n$;^7pN8KTd_QM@H;3+Yh#t=FJ53A3GNsUAIEvp+vz|c5lyr_0XCqq)P)js2 zl!qoUT(-ZY+)brvcWCk5ExTXay|_UV2sJHQ`%H-BmR4yb(yf`ZA{<1C9_W@cC!k%& zF0ZEeI{oE}Ce*w=qTjTWwqt9D(H={?MVdxahKdbx{{UkLYk#pyBY7GK=5EI0Nz?7^ zd^x6N=Z5ukojx+sK@_(J=I>I~EG}%r7Y0*ruUy#NO3edAY?^(jj>{k2*QF`S5Q}Yd z)VHPiU6#5#UrjZ;-QU8)Rg5{N(od2JrtYuH%$&8o+ji4SD|I{@#c^F}9zXC+^l&GY zYhmFF$nBa&d`V;CNlfuVTX;6}IT6O2gfW(ou4LTJ=Q?(y{fTd_T$8@%O*WS{JEbVF zPp9g47D3z-xU_3`3G$SxmxkTW?;~>iuZ~J;pA`H(pu+@K))L?7DB6p%w9@IiF00}l zQ6Mgf_9&#hhfuhL{hl_5%(jK3oq=Z`CwRM6^0luLTREfMw7M7QaOS& zRx(Mtbz~b#vS0wJ7v6&9r%kIisZ;fol{m&t`Ey@eZr4VSo|L)k)zR5joVL2bLE_fd>&}{6x0h14i;Q2*EVpxBONNgs zY_g9mLLM1fSuk28^CVSfjTFOsc8+A6GY_`2Pc%$U=-H$UVPn8CqbjUy21=+6wXz1$ z=2A`djnn&{-#_c3(Wc(M@@+39lI2_K+Q0dWbtw|FE3*}8om-qX;Dwy-<#)FuBrpVw z*D0z?=TEf*Wu#R($!+Wa!Q}no*&_oT0PCH*nVxmHx#NdyqMVGC#A5((6;S6Sas~nF zGIY59+pSn6gbdxm<{r3JD9m=_lgC0j@Oa{(-8svCTfKhdyuaWXRetZY+0>FzPkmbN z*?y<&2f)7;u7lw(h8lFthEEB2r^7HXVk6&bx{ML9#|ARdP4dV=0SPQPZ2q}?WAVPB z;|+J=H-Yq-T3elO#QI!7A@f95_UR?X-NPst+ihzUw{9?T99aN{!Te^{bSLoko1|)1 z;}G0Ir(H2c0HwvLie!=@k{AGt>Ua#FE_Wa&_6PP)(Z|HUiyB9ZuECbi!M+u?dt$`x zi&*grn^AESg>^f0=rt%^S%DGXDaXzT{Kqnyw5#gdm032Lvy)3s@7~w%+Q;ZP7%2NF zN9-ut_u3q{?a@1W>7zeqJ{5Rw-$~MRyEvi?9lg9LFr)*uLgb7AxRLk(RAB&l0c^f22}$Lq%gqwRlZ(w*kOflZryQd zcfVb&Ypw74YB|a(_g=bsS>JQCu!R&2!vulQWG*TRFVNCZ2$s5=Uhthh1h;& z#tGgr&d|U%;82_|D}YqCdEHyB8hx5Ls>WXoUE9&8bhWo@zw5Ql?=ZTm?I075AC+vj z++Y?*Wf?+#Mg%V67Yxaie2O0=#Hw3C$#!S=A~NIBZr$OJyu4#4B(CcLsCWzN%s zfR4Ebj0`$1(oZC01BK)q@eWSSCcPh(ze|5tI^h);cNXQn?cdA(4w~#n)0~7x4sbUy zKmcWIsO5fOqiA9d)6O%Ts~$yUa8HhhA0|Rg^juZoqcPDLjUAt+&r_GyL zNvmG>Tj{Qw{{UMNN_PSkzGfdVBOy*RmEE`HP;;}QgY$4jS38-V8>U-pbB0zWmA0HH z%Mgb-&N*!KjI-pkovO&Cuv_II?gdU*9Bx!{aC!nr;GvmL)&wxa6=pcXZw$E{mW^2L z1S!B%jPY4Xrk0vJt@Ue5^zUs`DXV+BX!W+1y`G<<(?{q-g@|=0YYcqHcoH0LAn*Yy z(eGoljNoGcMDkV$7w2ZbrxM$v9RDRI&MS z{oEY4Cm@Qd<)ShIeAQxbz!FB$GNLgY@OHAY=XOA1alG2mCib$j-L1ZE_w2l{shm<$ zcUSA>((QUXTk*c6(a5D7GW?*ZA%5{}GP4i~$YlkYf4#f_!Lv@r3C2!XXB?0*g1{4i zNKmbuj1n=B1yqf~vX%bu1xd*&bAyIBBq?QFfOjcY&Q2~UL4vG0KLw6S3fqCe$tP~& zzuribM7X=?zE|yQ@8-rxqZ@YMu>kep9p(EG;+q}?lah2S0n%X%+><{-DIN+$;oPs#{ImkKw5Kl^@aDqtOKg`Ii zT&VsXgMs&Qr0-%*a!<|E19c_Jw|ZMn>dN0c>EuO~)9n8M2fxnSd7gKzDzPkqkQrFI z=bw}B1yZ@&mLY-T?*c)6wdPvLW{ODbPN&zv|n0`=q9DH&>eK(U~`4fLH0z4iqzTK+YA@92^zr9sK&-t?zcUY5c#- zs`>18QurdfB$uU;;vOSS(C`$7V5^hBP{E`s7XT2_g;JqgaQTmB;o2W9mM)9I9Dt!t zcnrmG3zr#QgCVdnpGVe^H<(dW#u;|wIQfGPG65$CBmxNCAmof!pWKNN%VRHwMJt9- zsGC>>Zr*bFx|&9oIv zuoA_;Y>K{F<-r~Pk^#7k75k(-n8r>+o-j8Ph1#IuzG6WHbL)0d6KsLDWrldj0a#}_ zz`-PtcL2noE6{Z3sYuD@pu2IfzJ-w<^h%~mTP+8^NTGFf@v3Go#6w$e7F_I6e}ZLf$W zxV}sDWz)QM0?(=G-YLDZ`S1P;J@5lY{iD7e+x%Vd4~B28d|lz>heFph9Zt>cHD3>S zr%ArKU2DN!A)X7ZLfkx>V@NF5&S@mGntK~9#{U3Hy}tVM_L2A*55)^DJ74g=r*Yu# zi#`I>WAPWme;?QdT}wdm1)|8&A#IE<^n2C+07KRE`I1{(+Zm>{xPoYAmKkICXX7F9 zL&6>^@!$L*@#r2r@Rpxp;6K|J;Rc_lUTSvkZG_39d|dFnH`>Ja`m~Rwi=A^pzl^}z zmW^XRn!1GkCGecuwU=gHiN{AY!dd%QA9Xc9-r^#o8g%fAEkc!{8%{MPH!t16H94qG zmRXh`2RsHN6-F_`wE3qP#?ZmksZ*YiCJdI3*il>&{V9rwX!#PvN`bzky=2 zzq+)zwYt;nbt{J4<~Xh|v`uyZY=@kD#aSc!Ld{`z43NihZ1I_ywH-Olr_V2N*4HrF z-|df7iKp494=_QjubAIzveZ`PRo7C8L+04tm5J`!0dIA?P+9J-{{W!h_$epsyC1{< z03T|eF7Wg#t#~)aw(pE!*(VmQWbJKMmT%%~;l8m-o-&e3v@On|cJCCNqb=VnkAB+w z(XrC_D_D$NM{jj?ForqWQ!H7P;I`Z6-95fq2Y)IPaj9Ask`v@Zb!cQaEo7tmSp9+j z0BJ}yUxa_~u6%EEW#i~=CDQIRzYV%8_^$877FU-uXsf5|(noi#=-Q3egLE|S3F_8Y zQLl&Z?>u2?rpIfk-S~dWf8{H~H?Geyj$bcT(%CgUE@WG)D`{eyJL^>_L6XF7p5!py zCAQ0%kxW<4e&qd~zAxN(1L6jUtEH5BmxpfdZRFH^H+6q^X=kfx_X6%Sr`%6zG*_0d zX)L#PcKU$YrsgQGKJW-}w>bBYzoW2&<^vguMdG!wu%l5W?er-wvaN2gsZJ0}MXO%vxAH}2E#=DHzP}_$ ztKn;BU(Qe2*T&xrJ~R9?&@`=X%Fkc$*N=2KG_6i0)@-GF-A7E2&*A?7A88irb87{L zroU;^^nZxjbauLM(fmQF+TK~($)Na>%F{~s4GT>1{{X;07WiXI)h)HJ8d!K+R@Aj` z2y6P44x}P8(BX7Hk=cM zoMi~gI_TY?-R*lP7bxl8`&j&ntQ=}JB;hqVLUC3}tJ*F-6qL1lCbZSIkJt|fYpLQL zEj1HwEtTL?2BV~0jklUj>@3mWSY04c4EC2H!rVohd;3PUzOs3&?yYB#uPRMy!$Q?O zIpZ5WViTZvmfqUNc9gKQyj#$-SX_One6ekF1Gkq9_k{xKjVy8r?d|LhiCmL{QoMPr z(rU{^vbNnFhY2>d-D%ffKl9h{K9k28z{WB&^d6l_=R6LBk;V`lZa$=pe_Rv#eSIh_ zG57(GOlSJw_s{7{4&%>Hr&H_bI`R%jIL9;=8R~e?%t7`55B|6W9zQxvo)|;PBKAwOK{v2o9p0pXtDP7-Js{a5l>-1y4P7foT zW3lw(8~`~v?Miw9jEtP*a(Z$<6YbZGbq(Axf-}J9Jf7#Cc+YS00C+ucaxgl9?Vd0? z9+=4Xpv-=8fr3Ux4oT{N`rPyAI#3&@zI*4m1NA4`nS!_{pg8VFUVr^~>N<2Kz~=;d zlgS@X>-qqA=79dcuj^67pHKe)U+Mbe^Wu~rP(PkAo;x0LKA8Gbc>}+1Pf@_`ax;wc z_|cJ$op|ax44&B-8OA+2@C^VvzvajI_5T1p@@J^yo}bT;*YKtj#sTM#Y?5$(hdiGD z08XKDag&~drZPM74{_hOJp}+M+H$9m!vtV-Bax1{>`3kHn*8Vep@rwee-=e`dhkc! z?Rru6JGt*grMW|Y{s{Ox;>|Ml`rlBxk5-rC4~TU=R^x2zZKqsY+W0rX*49CF8RLTI zP`Qc%BeT_R7Ej{K_LI}4u<_T7t|Yp(miGSu#XcfyrnW_f2>$@G^^4syHds*=V-tU8 zi9+{r5U_cr*&lBCdx9i?LA{;?w?f8w&Cc>eRdTTp(=E+ zX~Eh`q+>=>a)hmWEgErllHT`L_@@3JF7oC{nH8SmR|~%~1dX`BUziQWi4BFo``D}TNj-0(gqwY>9^H27x5(2l z_i4K(+ngg9{{Sg-?78txz8n72zX`lW1D!uho5oAwopL!O4i`f4 zyr;tYpZ0~r#~a^8VQZ+atb*h^Lv?2q@FY^8EB#&gUj9utTMHWzi8d}t8(W6R8B7M? zoG=@gxC9^Kf-8&LeOett66W&G?mO6=V{o3*Z#f@4{n;bPU`Qo+IVx-WH1LkUYvNxI zctggv4v%Bv?+$1lE7ERbA=XOE0;i}nQPNh5D z-8i^TK6>6?arHbkUy{9OJGiLQnp)`Y<5FF(WefQw=6;@hJn>b{)s$PC5=XO!IRvN} z8`NVger~RM5#{l_?catv$heL?5|0b~%Z?d|UE457DtB%m9l?Rf$;EzXd??o;yR?IA zy2y4!;0)o%&PGN`hAMH8n?k2MvTN=?hIfq>;-bhzQW&INp+NbGQpAP?{Qm$j+%Q9D zEPiJEs&VD1DDt}}c&)o%x0Cr;{Siq{o}YrdYfF9B^Xkvhe-2+MSk$tgFoH0lc7ij2 z2RS1O3EW1~2nw&=J5IL`Q)5v7nKsiOnVye8ZIl;)>NiEJ!Nx&8F;Ho!kG_I3f?WT|N^V;`3 zJaiJ2UedRI*7<(B8W&P0lP>iNz&kHIws_|N0i1!8f;*T zxCCPm$=Ku!oCN@${GI{&GVVnR<$-^cjFEy=6Ows74^VPcoDxnp{Gai*R)5=DRUf6T{99*R|ER)0azq%;mz;wl1ATdrOy@blxuhPfI@f zY1D)EZk?_^6KFvs4lHlHQD|@%ASa47c2SOU3QC}Gt+yCc!LL}=Nieb8P;G4Bs4Pe- zy?8k6dh>!Y)8`M_Ls4e%2D7Iy!|9$g)!0ime{1>t@CxN~fGTRp^m>UbA`;q*mJGlW$f$?Rbz}Wy`0W)TxOiDl%Gdxf3x&fgC@qIvH>OA#10z4m z5BwKrQTrckVs5=e`~DV{hNVNkD;^6h5E*aS-RA{sTU{>KTi?kZ7b=}A*;&)2&t{V5j3p^c zrIUJD?aH-JnVh}E@J-@~uFaLj&CJ%8GU%6!bsJk*++8#O0BIST;lyS;$ZfBN*Yf;` z)m|nTc@yOC8f}kONw;~C&8O)T2i!2`+f0Ve>5C~KnXc_8V%(Q^&g_$4pmx3+ytDA; zuJ-np_xBoSi0m&knagSJmrrToJ$qJ~(5=y1iGOshXM1lFyfa9ac8e^TiIel=#>m23 zI1)^yj*n#ws>Csh8^5$_R;?jI$ga^|fg%P4W?ol&1g~xplA%e-T230>HP+78^NPPs zH$HXEOBIN8+H}<2-P2C-gp{=SQhHgvWq(5sDZH4YozL8{@?#Py06paL++1uJ!vd2F zc{ux$zByhh#PZxsqC^Mou0{bP85kV`oQwgC_Z(nSp5jT;-Af-TC^jI^0B&bjBcNg* zI3IM90RUpO^u!WeL=FUvwIc^Slk$U+*QfxWx(9MHG?bKMe#=JtB))dHrrw6s`Xy(5 zQ(arvy|vuD@g!PhXD| zw*H!*tG*%d+G{@vG|RYAWq35GW&@UJ*g%X%Mo3aV??HyfL10hohx`*q!qX?hZ7*NF zg_7gMH+Ppoop42_n&U~eLR1swIkJ-GF2r00$m2hl9|pAu_5T2dF=fB02tuHi zD*~*0K>*}8lnU~2yZaJ9pbyz=!3p610EZqA@azz(jVDCXw9)}!T1YJ8ONk3)=gpWq z$VfS7&PX^vmgh5Zr|e^;>pP{{Z`S*}ZD*oCLCU@K=F`%WNv`s7UYF&K{`P&};JZSJ z7+~E7zz*Sz;jl(X=t=2=$@M<>rN^^sfW%`s&U$plep0)6z$*Jk1Dscocw!?Ia00BZ zFj+^+2q39a00I^e%NjM9zfx{ien`mWX zyNKnv;2*k3+#4##Aj0zCpd=W=kRKy)Wj`)eiQLB78@86Htjrvl1NrsiIm|}8^};VAcCSz<6$Q( zSx(`Tw*z1xwn>o-DOCr^AGEO+I;PQkm60LW0u`2=ZyTz-#l^#GD3@4cVLW2F`TNVO5s9`7T_KmB;@3Q zfK&>E?o|Wk!v-yk5V-^~3IOAA+zv7e1{@JuE$w@xmZ_^Yt=nJ6@Djeax8Lct`uTZ+ zCeoxU5i{-}j@aB)iRqRO7?Fd?I5?|ldETUgPnby~I5-Y6Gs!^U^dufITa5h3AA;?L zkwTKEAckehE=Vjm?f?u3Tzs|!psvx$Bq?2_oB+Fy?nqo@^(Q5`G?t&?w(sTU)t>9- zHM;BN+`PLcUBHe&B#dJ?B%F00FUWJqYz%RML4jnIu<8I|gMdjJaqrAwy>b|iSX7Aa zoGx$`3CG=Rf*D5`IU|P8-Z?$79PImCu0sS>+8gf_ae^{`xaD^a7lXTjin_Z_`hURl z^IbKyv@(<&TI}s^`u*N#9ja_(oxbv%ayl2m&fJ5KnEg3yfDTWZ>L{BP7bQzLUzCf^)+D@j+aW0cHblHN{s+H!UvH?frj|*+C|?+jZuwmEYs1mt)6un|+>gl1O5^ zH*yFCNXAJfKmxMh6R_aqt`D8x#1)xW=2QT02L!eedB7PPPXH-x-!=gGYt;4d428oN z3J@Z0LAl6v-JFavsLJ3L1dXREK=YkTle#>qW4TpNP1q;qARO|AP74g}z~ojEX{|Tg z)o=3G@-&oObz67r#%OBhR3%jJ#A?_hk{B-1c_1)hk+|iRa;F6QUYQyT6^;I2eo{*k z$~%HiazcOr!Dgr#F$j&fSklZ^q0087+vP$7jK@G`aUeTw3&}>1tINpUw z$jaxO05Tbz3>M0htKt4?19N^@MZ zgqKv;%`}>7Nj3Sq`%mc}620(!wy~pX3F2Sbx8o4id~@(8#1dPgzrxQRYSHQq;_rmM zAc{pdS~iE`U18&g>=&^;?u~hCuJ~5uMW{e-bRXvn(aCI<@mKVT@i$7+ej4f?FYteh;+pIB zbol9WJ-3N;;MXmud@1;~sv}xx{{RuR>o{bN2y|Z(Y7)V3;xv(=w9`CHnqIu`YhkMR zw(?KU4}1sZCw{h2Lv!QL2G~y5HWv_2GuU5Csp>u( z)-5c}nn8JccX?$tt$thWdacBNLq|KSiN(@{z1c~{N|!WST-N^pYLB#(QlzU#lB8pI zNzMtbM@~@WrO={AmfYPJhOmkda#~gPL9o@+F{{V}>4`+t*#6>uLIxq>S*wEM&Oye8^2(9Ib}$K zKlTIv00iv)q`YbHi^EzjvEtto>K_}wXWxn%1;>T_OLHcpJ@=1(8~D4yIzgLL*Qe00 zVvkzaygd(rBD2?ZYxdNmxQD|q!Q%+-Z?z3HTG!QNnS|v9LZasOUukdbp4`g*@`cIk@jjhv9-*Y_dX9swXb)^2*TXYhi8YHK4#fq^dB54Z6`r96mEjAyf*oH#(saFU z-;2pj74x@({9WNM3HZxH_}B2`Te0y6gFYf^T0g?CiSgU&j~w<|u)DdJ;U|x^5qk#a zV|fm(;d@D1*2?o)(|mj3o0j`zmQl@gSI|ms60~YY3RaR$=+kl4Z+%w%ZGBVM<7GG)6%IUb&XkHhQF;oQ?f{{TGq#yb6f z&UjwEy77*_-{C@kyV44(_ME59{wqp1-ehKcBY)_01lj;)9Pv?0+Ber3W27zo)N$qc}bI!K4QSA9_)NjGj2iz(1cqUO?&f#RRC` zUiR0wr}>Mxd!BR8ryO(Gqjj;D0JK+ijif|H3V`>h<W;NXM73^F@ly{z`t6>FxgWcE#Uw*LT<^+)o}{{RIO_;sduEB58q zz94D(TtC=8B>kT>TmJwWq;tn-=jwW=k2M_%(^9pC_FLa-cDmN3rb~G9?iSi?lFKWi zKI8l|e$diGapK<*YaeKu_-k60xvH(j%9WOP)ODNdsbrltqAb!ek>>IdA@doQB~>CZ z{*j-yABQjeNAY{Z-XIqGbaP+)GVz~lxi&w6*(3+i=b)SB@$b9jh!o z3Usd9=cPgwZx`9cTTMO1XRJ~`I(3L%OKa97nImYJ06M}pt>%NoaadSe+(T{_D9zRG%fvTjmI$D+xK`ZJqxoK{ zH(6dtpsdlozDVQ{7BSNtec~G@3`Zvz6}1fhM}?wmdyxy@+1=^)cF|l$##oKjjpy&} zz-eP$k~l#w)pU)TBEd?H=v3rWZE5eQ+e=<5D{UHA>vhx2>%~Kv#V2IlHuPTdQc_9V zwXc2dwDaTiO981}J)i@4)3s~WX&O~XmrSy`)Fj+uie}$3+O#mKPbkYG31xu`PZ#uq z{{RHg_^CI<@7a*}D^j^hd{6L0Rc{Zj7&XMc57m}^Q^M0uH*g>$R?zK0RaLdnVGLS8 z@;~#@@b<|i)wL~d;uvl;uL@~UYdXcWi1R(xn|ZHjdIQ>9M-=w*J;Oe;8vvI!%#oz? ziGxLk{SN;Cf>ZoS{{Vzv_LhGHT})!rJ}Y=bTF|yg`(u+^(TDsbnoRQnwH=bi!(OwA zO7k|Nb`g>fm&6!PtYvjtSDX~9)7t7(w`%*|9?~scZntRPDa5K7l{bHJxKXI}vQ=7K zzN?xOzm=}j)B0riORmiY(xG9o+xMT`P|6k1jO1=ykXW3s3K)ME=(oe2QYo6&MQw<| zcJx!VSvG->;(P#dK43UG86TCN5|<Ubwc&5T+*&~$l#|}X}hYIHl*sEiVD`4am1aACm6BMc`^lr^`)p}b?Ur)cH{aX(vp%>L? z_1&)j0DoJbsJ{;`8R3QHVk0PpTsdsx<=V!}N7uEizaQ5AOfOneq$6OKIl#)5B#pM%;PamF~wU`qlA83B**f-<5#_Ft#EwKW4S%wO-M(F4ZlADzl zX|(CuT^e7LUxU}nQ%dkkqm}HPn@_!x(@Q(s*GnE%nazV!7 z=z3?hiWZunj98JgY5i8|f5H~3sw;XlAKgp;37i#j_^TEFj3@>o2XXDGu$s`dx zN#zd=>gg1sc|>fYDP&3Fk~p1ZxJ0(MGTpQhH%?DJT;B;T`73C*=2C>Bm*Z~M^*Hkg zDdqU6D@96-Tb0^LDMDA4y4fcD(y~hWegpVs=I2J!E@d|gv+MVkM&OviOE$T&(_y~0 z+@%Uhw9f;87X&H;g_JhEqgmrr(_(G#!(*lx5eO22G`6=9xK{^oMlsvOepyG7`^1s9 z#`6siR)C+fUBt_2Z+oT~(PUuIT1zeDc6gB%K$44j)<=-VnC=L4h2Yq$e#cptO4h~1 zvWB<&5z*&_s=H4Dz-QCslOdEePYOI+oo87=U968WueFkruO&93;VDU4&gm+0jhAGa zi`RcQW67q}@U-Owy`uPWWx{2UXD~mR}Hf8$s4Q zRjph_#M9}s+xSyRp4K9gd9llJcYk+ijI4nDv_SCO#@CAn!yY8CxVnN^=J~uqr7g~# zs@wT4vujpbe8%Ei_=(&ly3=EpFzC1!7B=SbHyc}qf6yO+n(Y1!@CU`~yI&JNjiY$m z;kS--&k|chZEZ2sbgv5d$Kh4u+uO6smr>rR*Q{@Boh7%9Ynwo(M#Ql{z}_#^F5c?% zRfghATl;J63h+rA5UFz&jnp&VAW{3NC%%F=6Ah*34)U+uWAxLeqlUm#zclAgbCtTc zQc;7pno66d{Zm%DZTx*YlX$$&l#)=TQV@oXyQ)!@MAJ)H)KwBn{^hm1vE{`YIf9dv zDZVCAl$JKiqmD@Vf{?=`t1ByEl#12_ za4Qy1FHniDV}WhvT(s8lVNy9|Vq}uuCK>xArxH3N?Y4IgphnIUtMD6}ZFfw#bsH_F z6UxnirYn83Oso&x{mMI%K^Y*Ns+!JApWJHNH1%(%qV2xjb~fkz2?1vsvm;XpW_2(=C!4gmd#X)4Q|o3O;5sNsfS?F@s-IcyGf4L-=6?E}&0+ zW-bpP2XqpG2pr*zt+y-cM^J0$U3v@4uNBRyT&p+Q9@h2};1(-!B15OC&d|=g;+9Z1 zosmhn?F`lTZmpz*(R2+uFrfyNkOc$pFpf5MI2p+x@N?AQXEo*Hr|c=xgKjGGZF#O& zuitn0X>)oo`o&cDZAHDdNn7rHJvBa-{fpWBQ8$A0Cp+b9`zv|l-SaiItby*AKg6Qm zCs$L>*BoGGzp0;v_DcoYW8RReXGyebt$neDakHrmF z%>>){TEg~Yl^GXT_mElID-sD(*57aP*aBN)opRIa0D-^{@Qi^`FYxZSrU68Du#yk#^Q|wfm?j#`a6Qll%P7p*%c< zBxJ8D0o-?UjBai|WdkLNP&af3rag;G+{Apm1z5u1{L0%S&g>F0cVKNG9iZom^34u0 zoTwN9at=pKatQ+fmixS^AmA=BUazNTVh}h@r>9UjRn87of`tHd0|3{b70mrD{e8z| zR?gl3084%!spvXr0at^90l~`TC>#z02?lV=M^lvqS7!(TW7y?)0?1T03H3M(q_Z#q ze(4#=$gV3*V&Q<{gp0#5+&SSvZJ~xn3C=(mY-cCBvuymB=)ZSn%paIBA2v_S7is4s z9dnbgRM|UvzROSRe&*aL1WHf_ZHbeEfOt40VU#vY4ggFQBLr2o0JtTamDp7Ly$IpP z;es+SK*{472C2fX33eq&U889MdM-{J6?Di@3Hg;-fFt;=h06jMg1bq4j1kD)$Zo0t zZQSm`JGOyAo3gg6Wwz?+D?XaE{{H|ZJxb$y0HJts&nh_tjFXT+&Os}j6O5XbUvm`< zFvlozr*Ko8;0$K~jErOfjse;T)Gl!6=D=3QMo_82P{0F)D#YiWicSNFL@IH}!2=-j zSmde3;B(XvF@wRNsM`BqO}zB`wfw|T*aro$M$?reY2|?ckV>#47$gG2II7Z&oFfSG zaNH8h&KRgIjjRYic~8s%1miRBe3BKIV=cG2qfT`_U$CU%u3*bHiq4u>a5L$0I}P-up5lhYUtjZVoD(#hG^(Ast$6$b-!=w*S=`UUMk*J-)+4fojTjj;(_H38+T7$_XPQXjS8( zreA!UMh}=#jt&$?g*?E%g$D;8F*~xy+I$IjYMl;2~hXV;!911&PN1;~Pl?_az2$aaDxRl>tBp zJBtmUN$poQ!UW zo;l?7U}~+h{_Fdq4$3HII zWR@8@v~s`2@mpP8uin=FuFUFL*;`n(ub0c$PxvP%sRj+SlEs=q$Iihc*j0eQ`B+4U zjOQhf-2r^(Q$19v3c*y3*&}l!Fys;ljDj=roy-6vHF_qg9H6|8F@%-2CNaV=9ez`^ z2=Tau8)R%SHRpP{Z{Iox-1~^e+%_a-7-k?0BZcXKl^|gSb5zxOTHc#4!QAMgm6oej zYiO;vZi`!FY4guV*a0oTa$eB=BAwwEu4oG$g2*3v) zI-TDzEZnJJL9TY~Z8Uqni~9K*PvL*pR2piOn2b!hrZ*;7E0eov$S&Q!T<0ot$_=>2 zG3&M|`?&V5{6-?&afKA=^t@5`xBLv9q03h-5 z{pDrc`Z-1xX z*k4%cc2^eZExqNP%qB3ZvEJYfVikx9SX9q4=&Mi2~64Bl=O*=HwaZSao z0#cNy)}W;rdqmV`)!jKbrOuVtdp%RL(Whp94*Y5V0E8FziP9walkoD=?@0dN)1cKn zQ{lKR8s784elCXMEjPrPb=8`y$^QTn{Z2b=Ye>6MGhSO<$rREp%W8UkzvMTI^sAjO zTEAAd5lv%pJ(jg^Z6Ii1`!&h7o@k?1^8|J`QON{y10&p6ExpS~OHVxi0MVa|ehO-T z622r_{ATzU1%{F1pA}tN+k9yFXDr6kM%BI`>SIvTC%Ln{zj!Sz?>-@0Y91kYWo1XV z@jSO|AhEyI65CDuV*R5$6rLXOo~y2DNh?|Dz9Q5-IpSLzhy|{trrbuJbP!+ItAk;8 zZ)&Y!J&A8R&FyY1?#Q@Ff&1((DmAKJf^v#+q^hKy7LrTZ%1ORj(9#owNhcWcN=Z9> z+^D!k(XAy4v4^yDWhU!E^T*#w+n$WB=Sre}`~dqv1iu^RN>)B*)Aflg?$E5w36=qE za8;DE%>?_crJ0z!mNLZ!)Uvl15Zx-E*#x4$dOzTrpA&TrM@N@Z_;sXQ+IEp>JA zF55%?)z&WTJ}3M?Z7MiCOX0(yM|8IK_dW?-GFf!fYPR#=X?`ufT}S(GOwpp#t$zdV zEXBU6vD(SG5-9F%Cy67B>NZAqj^5=VR%Kg@WfNN7#2rWOV-b|y8%y-Z?7#7&#@_=z zF8C|Q{tMJ!MDZ_!Z=lq)YskY-9Jca9bv?WqtP3DbLc;4$xR*rMtY*cv_L#SNRm!)U zCzYl}Ib{ zOIx_qSEn_jN%Kco#jo!F0N_L(3jLsd5bL^EfMnGCE}s-UJF4mb01q`?dJpW4W5c@t z0E6yj)wC}OYS&3+XB4U6{{VT=xw0B%~X@5PSDenU$}3Z^O0`HOQj?6F zX9;^L$}(2GT&hx&moCam(VS9}x^2JfGd(fJF~_O(^rcrh13AIz$GGdqJ$v=*QSKa% zL7s9y`u_l>IdQ@3?r?nv(DdgA869f_l}V70S-ksj`f^5l`<%1<{{Wx!{HQc?Nng6U{{VyibY!9Odt>_N zkLk%Cv=;Bk9^FCbf)8Km-;QcNohd=;dLG1e^vBa3&p%VpGg7{i)qcM(nJ_(b$0UD; z>&N&W0mmPw`TqbT@x@1w0Q3Y59^4ReJu#eQ1MP}-c;MsEoE)BjoO7N#`|-iRXqr}w z-pl?Nbsy)S^Xb#`q{+a}2R#Yr9P{bG!93FbxEKTcpUcznpsm-F0r>m`I!1h0edJOP$j(TVOIjAmj*7GV5hs%CX zJw`h91oQ`yoE#D=T8d@e83f>D7ROzofgpCv0kjVJpl9Ys?VYDwcy3KM#TsRlb4{mM zuB~X2pmeyn@V#G>aUOYg#9ZCeu8%IY_?UaLFuCIA8Pc{{Vu6_)AUFyhGtl zGc#Xlx>tm)Ztt}{9?rtv)yAWzS?Y;lWXfc?ll~F;bxUm;m9?b*0P1D3 z)U7AlkU&H}ZfxA}@kuMjbnVqPs^QX$y|kR_M_a3Mtu<%SaLkn~T-$b1jN>PJT0X+F z=F?W;7)jY${O#HDpUs8jIkwc}bGYwfqXd1}<0vw`p1%Bpf(YWAGMO}cNY*ICj>s9~ z2Ycmwl`I1l+{PW4Ra~mCB;=l+_SIHxMgmlolY21Tw_yydNGqHuL(d#AAmfwDM!sFG zz(p(NT!_IuY{R^vh```SBt=d?i#V=IQojEH%>>h3Uix~|tqWOpi?#Q?)V}*) z^%G2Z?as6wC{LB7Mi^XAaRZlwQ?Yqrjwl{CmU*FyNK9_Y8bD{9e*QSkdI!MY9n0{; z;{O1{FNm>7e4hw-^TS%jeiQ+R?xdbTH4~}?c$8jYGPw-*LJUqYpGQ3>s}eW@ZP2U zm#JI6mv?1xd2e@Nc#_3;Yk6TLG2KHvZRVgN@LbzMBXKMl-jN{w3d-PEa7oHnAwbNyi{5Tx}%rfydc;ET~}&7#yJM zwYVXPQVt0?>Z{);{i;|wd)Ahl{+HM1zQ!2cl{GY}!@3)jGT!zaN!R1cj!RH`u2bCma1DthYlI2ZbN7erTUH<^B ziNQ)-{I6bZdTD07zf<5p5V6qwZQ+e&OWQ5Ch;;t|I^_q=6}9cau)mP+4uE}<@?hK7 zV+oaD0HM)5@ik};Fa^S;#_zdw9j z(nR`hp|EXuk=PJ0L67GEHyubA$3nRrgP&{g{o`xC6Y&1Fj9dFpN7Jw65sWl*&ua_Z zTZPJnXeaYwayO}Hn+(I|t}HulGK#yiQu~#<_e)(r6T1`2xg_4LxIWj?NxsilZ_M*A z8S2k(X?JlqoSs#@?=;g3ho8#>dk-*Zb2FlmgXGBRpSsPQ*Ya)u00pZ$rls)X!&>I2 z7>d|@O0|`(Cz@%VJ2?D3;yL2`On}0Q-?)k>ER{vHce58ITH(-tSpGQEp6=dQry*fd zTg%C9z-81pAc6rqj!5NHbR?hU_x=lyqczXK{X9Z(_Fss)6yG2!8+MuE7(glx83&l8 zgT{8T8O3*HF_-qX0VQSih(_;px+e42qad~z(Z+8zldML%U?_I53ufE6f z^WmLJNi|(gM<>iPSl&w-s)aE?l1me*Py(balqwF;jTt}$bv$!PEzPP(Ryf-3HX=v! z3xvplK`)U10B2caWA|GnumJ>P_+CY~)U_6pLa|F`%+9=`#S^W&aB^6;ny!Os&d>); zR<@BMUC(J|*6l2^YPxbr%D_tBY;rA991;+#B!np}CPHD2<2c>=E+Uiq)n^!_l{!nS z-U=?)R(5;eS9P)SnSFKj3^zRe=T{Ma&-a|si%F)Po89u=J$JvZ%keu?@PC8Njh&^G z&};S{Bhl_+xwI1^T6mjF(p~0?W`aw9G4FJUZdGEHCXMW1D$3?kJWpM`No*fb=gYdW z(Jb#EEStz*wnr?%a>RzY)8>^6VbVs4nNi_X0A`K0l2x|) zl;=58!$wWXQ-Xw5lI66UYelnZ+kYl__2URu#?CykbDN(wmXnktX8YTn-%a|vD`wfd z!8Gtb*`wOVHE`Hs6v&b$3c86S7zG)32|>vf>OKgHIqyW!Gl`f@1h%dNp^kW#+j7a! zfR4!O>Wl*}!zs=@sIc;EuE8X*SR_1d-D@I%4h}+#SuN2>7&|e~HSE6(;DNOXh07GT zRE=5Hcd{AMTXb(PAhQW(gaQMUC0_(7tzf@>3%e&JuWc3ImA5jCpVg+XdqqiGdr7+` z{{Vo!IvwAO^wS2TqFpvwR>#9lBz{t=td~O6N4bKiWMOe3M;njt5m|xYeZno0?@-X~ z+aI~M8;}9DK`}&~`hM}UIK~J)GCpYd;T-nX{vMj*$z!*F5BOjtkq<3aJ6$@)OB0f% zr29FH#Wv%YxH6sFaBJwV0p7N?uIa(m8U?V1S!7lLqCj9d18V}sg5++-GEU+EuNR1P zsRwtesNMenn$+EzTWZ(Iow+sU-nZq9cGpE~@7m7Y+uy(IC;Ss*;oIqOc<;pK5gfYb zif!zz$Qf6&(d?sjkywqmYt2^vCtbKdX9Q&6kKRuR+qm)&Wzix~S%3p_VMzml&=3g5 zGI5YN{N(+P{34zk_;KNQS|YN~Z6>ENKP!oKi;1;HR|7kkHPDZMKy_X?HHG8Y*n7W=u!UJmY+`ED+L(!E*RcG7$3nvK5Y{WJ8sG4@z`G~S%F;@^AE z-gjLc+wb=t!=fozljPxu$8}(&kO>@w8#{7H zD}$0oeA`C1-jN0zf%63fXMzZP<7*ShIUBm4L+P4ZIyy0B=o{Rpf4HDGDzr1C!BQ{E6Bjoj{&zZ z1Q2tR!Q3&y3zDRR!N3OxmQkG8$|{9X&;S4=WZ|%cfOhuUKJt(ULMuU61eFs9HrVISOjpnBxQhYzr}!hf~tKn*BCW4u2be2MknS9>IN{t?msb7 z9F@VxY;tOZlDTp+0U-#^R6p+91rH1f2Oq@BLBI%d6H40j)$eYX(*C>O(9vJDyLx$O zijtq*ZdX29vlfkx?ZL3Ci8iYcI)K4fCmV7XY!5E@_yr7M3E+nxIbx+T##M`QK4N*= zI>|h^Ld=So-s6CG9qPqN7Z(sOr^fy%HD{tFX)oJC@{)pLI#%3b` z#u#LVPzVH+W1euVA1%&4 z8!*Hv+w%d8kna0QT!d_ZNX2Q{%Iq+~w;iex437mBn23C><*AWR z-wNM#RH!F&2328(S7k+9v1D&N)Z-s}8QL<+pn^jt8Ak=dR##HkVDc`0^Qozxi(a~Y z-{t;A(~DZkY0j z%E3ZaPS!}-(U@*PayEuQM<8v$XU%rE$X&4K=S|(WDQ5(amuo57=$SbH@4?)yxbu@o zhmts$g*hQuk+E|iP@s^kaNM~if?$A28Ru!V*LS1sYkc><*EE;H{{XI~J4GT@NY#dZ zZtP`s+Kfmz0DvXQKQZK-mc@GJoZsl|Bg-*}Hta4)U<#a^1BZ1|58PdYECJ7!MEh8s zxl-kqZZH(9GaakHCoY5%OKog6(bLg%c@D+-vb#tN)R68EA&CWckfS`2f(n&pG-0lm zwYvWRz#po>&W<h1%_mGVoNY;N%A61GzSsmf560z5H3Im4%?MVpPasAAaFKhvV~*v=KzhlK0EP0K{|z(+v1DNp3Hfp zE5pW7gs_qa%aMXNe5Yt$r0(`uVKJVp%4A?bzy*fjU!tA6Lq0&-csa?e-G0~3w{MXa zIYAO~0NUIgr{-LMc;h)3JOV&OmF;csYx!B9&rj`f@JC(KuJvyjd_L5?L89HXcehs> ze}{E8(x&kim8gq{)O2Gr2`w$P5pi{@CWolc1IulwUdJGGvu#Oke;4&TIsPg?jdf<% zH9cEi*EK0LuN!JQ<+ao+uXv{8P@hoHej#01OK&1aCaNuT>u(+DQeRwN=w2wi)a)#! zyMtM?Hb2&n#oq(Re_^TEyfK;NNuI%oI}C{()bYo>VWEz6Y3-(TWsw$OP?t#a__gsL zz*=vGd^7P{EjL4&!V3YxLP>b599`sZO@GlqD9T+vnzlBhAX2aaW5|lKtN+_oEB7=U28r^PN*zXi2z6H%~bvYI1p_6wVrg5GVh&t-KRqiPyu#_YJ2 zAxlOv2QWB6!F+xY0B8QOUq2$ zMlA)(kF3Mijw+ohv6AGe3rRPmWSylKX5YIwwC`(MnQ3eJ7>X{1O0?w*&XoPulTJ&P z@tVI$Q+H3Zv(+|!zyAQiJHKh0kJF<(I;Uq^w*VsO-blqynDQ*B11s{5_l{JfBw zfyLsLdem_o^QRAfhqAQNYR*b-{P9+cYjmUbkM)})hRMe{BRTAN z?bnQcU8&jUsKM>uk(`gI>!0c>GIDdk;}}0qJDKLf{qew}hN$)w$!j-7h;>CO+=KSA$N^y|sN{Q2}b!3U@~Iq%uP0o@a(O(F z>67X{zMaQ@FlfBGBUJ9Z`maBkCVhXvfu2tXr(=#XJvj@UoM8U|FMrd4_~RTJgdV?! zKVCcJb|W;oAoRh>C+dIBKAFME$SuE{zu=eXG5NvifH=uK^PgW{G7lrE^#M{?7C$QB zsP%7F^~dmmjz}js0-K+F93K7g{vAI7&eKR+oR8<%jC45}{Qm$NnLBm-8|tt3AuUpU z(lC5cr$eggb6H(PCA7Fx1=MZP?XHyDO0EG1W+uz?fT53UkK(KT3JvgP)4-n1$YuQs`=Mq>K~)whT~Aov?tw6V6D2&|)q?#oW_uZm{Cm`aysCV4*BF7NHS z}>OxIjxciN!mo!!HWp?&$YjgbYJ}CG_JU8O)Z%Dd{Y&B~; zT}IDSwvCoscfYdLuG&Lt@Zv8bO9}0SK?c6 zhfuY()D|Z)G{P&HqC<9%C+AkbYWjAh&4|H*c_ShsWQ?qtibcx&tr^-efiv z-M@bF{i$Y}_U7v5;^B8sc_r25%u<$VNqAmZmd}~G=Nxm*e>Pw6 zNlz5Vr~FCyz2H$hq#E~xG>;V7B&TaL_)}hsPG#B9O7^}nX$VkN(g_N=3JCs*ejHtk zO?KDjP)w2gOD2_bF`48ft=&((>3|o@LumW7L3yT(jtI)+tjw)bBusF!N}|0zT@!C zz+{PoHu9^%XKawU+F6J!NC%QW@W~m?eAXIvzscUqMv`B4i}k&aV;2P^^u4;<(|sG$0BQE;U>!;BIYR4zdT46p|vmLzT%40E|gap(ReK=BgeI6@gm&7YWjs8?v@;{ziY z&H&`~5ZvZ9#|}PHAJdbMy}`f)k+kCs4i0Ob*2>I<3Bf=L-Hx~KhI`2PUnC5M{@>_sraSdH1+^OCv2 z&f$k3gOWD!&PdPrA*ma$0!yPiAGCODUe+{*8;EmjG^?yzx#VpDHA8I~95UN+^KLch zo;I~fe$d2j1~&jNO{zM82qfU{z~G*M9=-?gs^sZ@J@JNs@<|+e#+PZWTdEKgOQc=3 zjn>5{agu1YduMXF%36ZkL}VTs5^B4Px>Ac;Sv^{k*Hvq)Y3O=Y;-^KlmEhw$yWdC3 z^QqLira0r^gO&*zktU@G~2^hO7E(rChqrJY4cavpU7)lNv6%Io2d2}ZQ3M1!6F&f zR+(5FIr5cRFxkrGPUWtL!q$bgC?OKS>8KkQh@{HKE9h@l2vvsS>R~#f+`15s5%Piz7v(M|FDwh6-j0DH29RSsOmc&5erj{-aW#GO2a%Pmw0p$#Sdr*4o*xy=n1O zDk^cHqiI5qJC>Kcn|D@wX(y+W(XIIHX7=s0_F1kTX=K+mRF+mO=4JA2kh3!%pX6b; zab^hpMnO2TD&0pMZpDmNii>~&XGUoNB;b&uMg;U2;D8pkHRf1!trF0MX=RsH)qMU0 zw>G!(TU%L5$=lwHQpJGUW0&`TFh6-*Fc}#KLwC$^;(W)?nH2xxB5pF*?3Ndz7`+bPGk zdE*}6;2|v6I)Jk=Bh90ds#ke8mQoFZERd-zvA_!Dj?%8f=3G~k>Y8!4e=0MSn(Evx zIuNNUqb@)t2$*5AaCZa8HR>MSPeORFoW$4@aw+F_Q`NI~b$5}8{#KojKz zha$C%efXxgz4}|N-)%R2bn-D$aZ_8Qpre1~P2axW>U}Q$N4I=Q@e^M7O2tG*{o&B9 z?4IUk5={lnGRzW4$IhWr8*%{!K~_I^ZcouavhSbbzYutHO^L+Mt|pVFAjxvSYo6K{ zW>7{JHI&Hs7)6UYJ5GLA(baVYZw_9pX&vMjw$aHrWfs%Ix09wtZFlw}ybS)L`mJiR zUiB!+r)~M87$xO-MJryy!1 zCjk7o+mJEW9)YE-t`JBS8MkgLjjEu4I`YQ^7Wr~Hz-2YZ=@I1%0D6MkuzQRHjyMN~ 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 OwwdQUCejYwg7$v|og#(+ literal 0 HcmV?d00001 diff --git a/scripts/__pycache__/handlandmarks_with_realsense.cpython-38.pyc b/scripts/__pycache__/handlandmarks_with_realsense.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb4e442ee2e31071d1f844dabb8b433a87547f21 GIT binary patch literal 3048 zcmaJ@-ESPX5$Ar~-QM??WIK}OT$%u>3j2f#ar=@MY2&mp(zvnYKrZWGv074hl=e#` zPs*u#MgaHKfZu}xcST?N+CPU+0s5q(=pRr7NQd0h*Gum}ayT3gXNJES?w8GG4Z&}1 z_fH4^?j!V1J-Pn#VDb?(v27tl5V0bJEi>BKHlu?bGrHI{V+ohcSjH6??Z}I(xM~%9 zYq&=3!}`2I9q5~;Z_)O`BF@5ISVqc?I&l|w4PA5a9q?P$w3xwB}<2tPz-lezb8eKoIN%OUhH|WOv-U3;O*5)-@ zJA9koUf7qjK`}dPfK*dU?V)7oBKpoz4Yc34fCI7{^B)-vOBwnuX}tn3{(utuImBug zZMM&KG@oo*s{Hingih#LbvWD#(>P8OU^d4=LLz8!z>fql+B-Cec4;E$$3aYa0Ib#l zONh^bFEk%G-2)DbzD)fj^8?OmcLaPo6tUnCOjJ{)GAmrhss#RwGWYW=Ot3rcXj+; z?#;^!1p6AZrmW=6Z;|$%)MhP^au;aUeq)_UXdmRwc~wU$ZywfW9q8+M2Tp0chKR$g zF>mUXg=N-SFzYPo_BFb5jqVooya%UrWPiRQSM$#N)&eYmo!v{$?Iov|yYoAFH}AnY zZ!H`+70uUj_i$Z%l3RwpYiRo#-?`$;3Tfs`zw-7Sw2r<-f3dZ{d5ctkj%F>;wn5NQ z74Y$myf=TF7>>pi%m!d*Kkt+FM@YUyIz7bPZnr0WtvgxqzAjjD^0GM+Jq@F=SfAH|(`8}Y2vsqJR zLQhyoaWfz%ew-5OA4I_j*9*2Ury0eaFpW~~3kh(I{ew*44xyPGU+461$c!l)jV12g zV4gA}$GCrE>xJMAW+AvvmK96a31kNSI!ncb({u0%aowHu4f%42*fw$nkKt%#Ol$~VC4byDO%i8U>HmkT6 zBT_I5y9!22mq1Xj1Hsbd0x;k$cq~{bl#@*)t{O48Qw_2pNfQ==saXng0yhZ{PPIiW z4n|Zt;mNitvlwuFiXnti^ckHhC*=fp2?cPb(_cl=9+cJeRH(+zB+)Vdg!7bduBz6t zuG79gPamfm#k@F5^=_{EVzRF~*CjLuJL8DphH=ne0=Hhw3dDLLs847la3wT#9unoU z!b320qN%c=94-jnQ8O3H@^Om`U&Gihwy9E>g7wM~zT~>@<0^|sMZgQvgjzXAbc!o{ zl0aI>za#!Wi2nC@Yn;Y(iv)B!NwywQaRlJn8ZkMZ?8AEl&NF}}qr(3+8%-x5vy<+p z^1-JNnFr5!5FSCuAME^ocY8~OoMlpM>7ZRcXZ|Uux_Y>V*;L*Ae*#@FO6)_2tcG2) zT&rw1EYGr$ebv6Nl^VdU*)FWOy0^H2ni3kE}hbv+Y7`8Fgm8BTKZ`NeraAN%a0Z)t?hhcZVwOOfC8LYFGaL?i9n^1Dcn=2E&=K*MNvS+0bP}IXRlV3t zm3s&%hbx{6<Cxk0X$*8@gM-jpX)b3d42&T zAJmm)z#&nU3xhZ_w>Y@C#(};?@M-z^aZwE~ebXgQm6AyeDSsOja~(Wor-HZjY)#MF z@g$OL=_CY0*>R@o#}gJF`6hR`4nF|in66x?Ok-6JpnfKVKhR4R!gvCiqRoc#Lwz5w z$GW0sP*Hv8hc}Q_)ZDF|i;pS)OUWW80n5WnPt2|xGgE+zQml)Y0m)^s^y$8@N>6ol zz-43hPnYAisw^J~{u6C&NkBlQD(^o2?c*oUR0YOopX_|Dx=@Gq(}0u530yCqWRl<4 z2Wcc+yGNa!++3#jAw0B`i2hPPVB%-cU0k9bAv^4Q1=6jC<9+5;YUYZ2z;6NSZCL9V G&i??Lje_I= literal 0 HcmV?d00001 diff --git a/scripts/__pycache__/tcp_server.cpython-38.pyc b/scripts/__pycache__/tcp_server.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..304052572fa8b24bf314430a56ab089b9881d75c GIT binary patch literal 3443 zcmZuzTW=f36`q-0E|(NVU9Bjt+Oik4W@<}?(V(fD7Itm5ag!*H-!?J6kXJQXmE0(~eD1fb9-|Cj!Pd2L_(7xGZ_JF}ETrP;-vIXgR-v*�oAbNb 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

Fxi`fU%wfr69U{{Z znI6tCcSHze0MD}28CO{PjH@ievLpRf*4!K3{HfPlI2yndFi;J*!wSbHOmaaDTn8;d z-L)TdR=lOp;B=>c?wnsje`G-4dhg<1LycEH#?36g@|W1yUxv2jVRM9q(XcRbVBR%7 zT@+=`8W2xDw*Hh~+t2ML)Jv4*PU6H}1jIM`RQ{8wlZ0Gwo(|?9;5pRh{$Z!zgR9sM zV>4<$2!sbMvE>WlAI2v0dp=EwAiCps1F?#oOmPJ>j4--Qo&A2;5}ku+OuHQ(iBF() zELV}1LB4=DvOzSGh3CQI_8*s%zmnNmh=>YG6$Sn&n!tsLx_s%*U;7-;ONsZu#I^{+ z&iz2FgF}s7?u)lD@okiMP;hOrCH(!{L2U3~pPF6X>3IpYT2YhVq}I#lmbL+1cH}Rq zpEl=#o}q{Z5YHALAb*Hrpj<-1bn!08Z*V!0&kcv^9r=BFyRimD&FD_&Ky3X_;$?{S zUcu&Rebj%=Z!YP~|NEHQ= replace_th] = canonical_point[xyz_distances >= replace_th] - # print(f'distances(th=20 mm): {xyz_distances} / {xyz_distances >= replace_th}') - # print(f'replace_point(after): {replace_point}') - return canonical_point, world_point, world_point_iqr, replace_point - pass - - @staticmethod - def vector_to_rpy(x, y, z): - # Yaw (ψ) - yaw = np.arctan2(y, x) - # Pitch (θ) - pitch = np.arctan2(-z, np.sqrt(x ** 2 + y ** 2)) - # Roll (φ) is typically set to zero for a single vector - roll = 0.0 - return roll, pitch, yaw - - @staticmethod - def remove_outliers_iqr(data, q1_rate=25., q3_rate=75., alpha=1.5): - """ - # IQR 방법으로 이상치 제거 - :return: - """ - q1 = np.percentile(data, q1_rate) - q3 = np.percentile(data, q3_rate) - iqr = q3 - q1 - lower_bound = q1 - (alpha * iqr) - upper_bound = q3 + (alpha * iqr) - return data[(data >= lower_bound) & (data <= upper_bound)] - - @staticmethod - def replace_outliers_iqr_as_mean(data, q1_rate=25., q3_rate=75., alpha=0.5): - """ - # IQR 방법으로 이상치 제거하고 평균값으로 대체하는 함수 - :return: - """ - q1 = np.percentile(data, q1_rate) - q3 = np.percentile(data, q3_rate) - iqr = q3 - q1 - lower_bound = q1 - (alpha * iqr) - upper_bound = q3 + (alpha * iqr) - - # 이상치의 인덱스를 저장 - outliers_indices = np.where((data < lower_bound) | (data > upper_bound))[0] - - # 이상치가 아닌 값들로 평균을 계산 - mean_value = np.mean(data[(data >= lower_bound) & (data <= upper_bound)]) - - # 이상치를 평균값으로 대체 - data[outliers_indices] = mean_value - - # print(f'IQR: q1:{q1}, q3:{q3}, iqr:{iqr}, l_b:{lower_bound}, u_b:{upper_bound}, indices:{outliers_indices}, mean:{mean_value}') - return data - - - def get_hand_keypoint_pixel_xyz(self, hand_index=0, keypoint='index_finger_tip', coord='replace'): - try: - keypoint_index = self.keypoints['keypoints'][keypoint] - - if coord == 'canonical': - landmarks = self.canonical_points - x = landmarks[keypoint_index, 0] - y = landmarks[keypoint_index, 1] - z = landmarks[keypoint_index, 2] - return np.array([x, y, z]) - - elif coord == 'replace': - landmarks = self.replace_point - x = landmarks[keypoint_index, 0] - y = landmarks[keypoint_index, 1] - z = landmarks[keypoint_index, 2] - return np.array([x, y, z]) - - elif coord == 'normalized': - landmarks = self.hand_results[hand_index]['landmarks'] - x = landmarks[keypoint_index, 0] - y = landmarks[keypoint_index, 1] - z = landmarks[keypoint_index, 2] - return np.array([x, y, z]) - - except Exception as e: - print(f'[mediapipe_hands.py] Exception error: {e}') - finally: - pass - - def get_hand_world_xyz(self): - xyz_world = [] - for idx, xyz in enumerate(self.replace_point): - coordinate_xyz = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [xyz[0], xyz[1]], xyz[2]) - xyz_world.append(coordinate_xyz) - - xyz_world = np.asarray(xyz_world, dtype=np.float64) - return xyz_world - - def get_palm_pose(self, coord='replace'): - p1 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='wrist', coord=coord) - p2 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='pinky_mcp', coord=coord) - p3 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='index_finger_mcp', coord=coord) - - v1 = p2 - p1 - v2 = p3 - p1 - center_point = (p1 + p2 + p3) / 3. - normal_vector = np.cross(v1, v2) - normal_unit_vector = normal_vector / np.linalg.norm(normal_vector, 2) - - return center_point, normal_unit_vector - - def conversion_hand_keypoint_pixel_to_point(self, keypoints_array, top_point_n=None): - """Algorithm for annotating pixel. - -- Not Used -- - Select 3(or more, optional) points closest to the camera. - And, calculate of scale of x,y and z (distance_pixel : distance_world) - Finally, obtain all 21 x,y and z dimension values of keypoints on real world - - Landmarks - There are 21 hand landmarks, each composed of x, y and z coordinates. - The x and y coordinates are normalized to [0.0, 1.0] by the image width and height, respectively. - The z coordinate represents the landmark depth, with the depth at the wrist being the origin. - The smaller the value, the closer the landmark is to the camera. - The magnitude of z uses roughly the same scale as x. - source: https://developers.google.com/mediapipe/solutions/vision/hand_landmarker/python#handle_and_display_results - - - Author: DY - Args: - keypoints_array (ndarray): (21, 3) array - - Returns: - ndarray: (21,3) world dx,dy,dz coordinates - """ - - try: - keypoint_arr = np.reshape(keypoints_array, (21, 3)) # must be check - - if top_point_n == None: - align_z_keypoint_world_arr = [] - h, w = self.depth_image_filtered.shape - for idx, pixel_xyz in enumerate(keypoint_arr): - x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow - y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow - if x <= 0 or x >= w or y <= 0 or y >= h: - ''' out of index ''' - return - - z = self.depth_image_filtered[y, x] - xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) - align_z_keypoint_world_arr.append(xyz_world) - - align_z_keypoint_world_arr = np.asarray(align_z_keypoint_world_arr, dtype=np.float64) - return align_z_keypoint_world_arr - - elif isinstance(top_point_n, int): - z_arr = keypoint_arr[:, 2] # depth values - min_z = np.min(z_arr) - min_z_index = np.argmin(z_arr) - ########################################################## - ## select top N values and obtain scale of x,y and z - # - start - b_ids, b_values = self.get_bottom_n_values(z_arr, n=top_point_n) - - selected_keypoint_arr = keypoint_arr[b_ids] - - selected_keypoint_world_arr = [] - offset_min_z = 0 - h, w = self.depth_image_filtered.shape - for idx, pixel_xyz in enumerate(selected_keypoint_arr): - x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow - y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow - if x <= 0 or x >= w or y <= 0 or y >= h: - ''' out of index ''' - return - - z = self.depth_image_filtered[y, x] - if idx == min_z_index: - offset_min_z = z - xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) - selected_keypoint_world_arr.append(xyz_world) - - s_x, s_y, s_z = self.get_scales_xyz_coordinate_to_world(selected_keypoint_arr=selected_keypoint_arr, - selected_keypoint_world_arr=selected_keypoint_world_arr, - sz_type='sx') - # obtan scale of x,y and z - # - end - ########################################################## - - # calculate world xyz of all keypoints - # There is the keypoint which the nearest keypoint from camera, we make its z-value as 0. - # cf) Originally, wrist point is 0 on mediapipe algorithm. - ''' - TODO - Apply scale of x,y and z - and offset from top distance !!! 2024.05.13 - ''' - align_z_keypoint_arr = keypoint_arr - align_z_keypoint_arr[:, 2] = keypoint_arr[:, 2] - min_z - align_z_keypoint_world_arr = [] - for idx, pixel_xyz in enumerate(align_z_keypoint_arr): - up_x = int(pixel_xyz[0] * w) - up_y = int(pixel_xyz[1] * h) - x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow - y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow - if x <= 0 or x >= w or y <= 0 or y >= h: - ''' out of index ''' - return - # z = self.depth_image_filtered[y, x] - z = pixel_xyz[2] * s_z + offset_min_z - - print(f'scale: {s_z} : pixel_xyz={pixel_xyz[2]} / z={z}') - xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) - align_z_keypoint_world_arr.append(xyz_world) - - align_z_keypoint_world_arr = np.asarray(align_z_keypoint_world_arr, dtype=np.float64) - return align_z_keypoint_world_arr - - except Exception as e: - print(f'[mediapipe_hands.py] Exception error: {e}') - finally: - pass - - def get_top_n_values(self, arr, n=3): - arr = np.array(arr) - max_indices = np.argpartition(arr, -n)[-n:] # 가장 큰 값의 인덱스를 찾습니다. - max_values = np.partition(arr, -n)[-n:] # 배열에서 가장 큰 값 3개를 찾습니다. - return max_indices, max_values - - def get_bottom_n_values(self, arr, n=3): - arr = np.array(arr) - min_indices = np.argpartition(arr, n)[:n] # 가장 작은 값의 인덱스를 찾습니다. - min_values = np.partition(arr, n)[:n] # 배열에서 가장 작은 값 3개를 찾습니다. - return min_indices, min_values - - def get_scales_xyz_coordinate_to_world(self, selected_keypoint_arr, selected_keypoint_world_arr, sz_type='sx'): - """Obtain scales of x,y and z - -- Not Used -- - scale = abs(real_distance / point_distance) - It is the average of values that have several points and are selected as a combination of two points. - (nC2) - - Args: - selected_keypoint_arr (_type_): _description_ - selected_keypoint_world_arr (_type_): _description_ - - Returns: - _type_: _description_ - """ - n_arr = np.array(selected_keypoint_arr) - w_arr = np.array(selected_keypoint_world_arr) - - scale_xyz = [] - # n = len(selected_keypoint_arr) - for idx, _ in enumerate(selected_keypoint_arr): - for i in range(idx + 1, len(selected_keypoint_arr)): - scales = abs((w_arr[idx] - w_arr[i]) / (n_arr[idx] - n_arr[i])) - scale_xyz.append(scales) - scale_xyz = np.asarray(scale_xyz) # convert to numpay array - scale_x = np.mean(scale_xyz[:, 0]) - scale_y = np.mean(scale_xyz[:, 1]) - if (sz_type == 'sx'): - scale_z = scale_x - else: - scale_z = np.mean(scale_xyz[:, 2]) - - return scale_x, scale_y, scale_z - - # def get_hand_keypoint_normalized_xyz(self, hand_index=0, keypoint='index_finger_tip'): - # try: - # keypoint_index = self.keypoints['keypoints'][keypoint] - # landmarks = self.hand_results[hand_index]['landmarks'] - # x = landmarks[keypoint_index,0] - # y = landmarks[keypoint_index,1] - # z = landmarks[keypoint_index,2] - - # return x,y,z - # except Exception as e: - # print(f'[mediapipe_hands.py] Exception error: {e}') - # finally: - # pass - - def rs_init(self, fps=30): - # Realsense 카메라 객체 생성 - self.pipeline = rs.pipeline() - self.config = rs.config() - # config.enable_stream(rs.stream.color, 1280, 720, rs.format.bgr8, 30) - # config.enable_stream(rs.stream.depth, 1280, 720, rs.format.z16, 30) - width = self.image_width - height = self.image_height - self.config.enable_stream(rs.stream.color, width, height, rs.format.bgr8, fps) - self.config.enable_stream(rs.stream.depth, width, height, rs.format.z16, fps) - - # 카메라 시작 - self.profile = self.pipeline.start(self.config) - # self.align = rs.align(rs.stream.color) - - self.color_intrinsics = self.profile.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() - self.depth_intrinsics = self.profile.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() - - # color_intrinsics = align.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() - # depth_intrinsics = align.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() - - print(f'intrinsics(color): {self.color_intrinsics}') - print(f'intrinsics(depth): {self.depth_intrinsics}') - - self.depth_sensor = self.profile.get_device().first_depth_sensor() - if self.depth_sensor.supports(rs.option.depth_units): - self.depth_sensor.set_option(rs.option.depth_units, 0.001) - print(f'depth sensor: {self.depth_sensor} - change depth_units to : 0.001') - self.pipeline.stop() - print(f'Reopen the camera...') - time.sleep(1) - - self.profile = self.pipeline.start(self.config) - self.align = rs.align(rs.stream.color) - else: - print('depth sensor doesn''t support changing depth_units.') - - def get_frames(self): - frames = self.pipeline.wait_for_frames() - align_frames = frames - # align_frames = self.align.process(frames) - - depth_to_disparity_transform = rs.disparity_transform(True) # True for depth to disparity - align_frames = depth_to_disparity_transform.process(align_frames) - - align_frames = rs.spatial_filter().process(align_frames) - align_frames = rs.temporal_filter().process(align_frames) - - disparity_to_depth_transform = rs.disparity_transform(False) - align_frames = disparity_to_depth_transform.process(align_frames).as_frameset() - - color_frame = align_frames.get_color_frame() - depth_frame = align_frames.get_depth_frame() - - if not depth_frame or not color_frame: - return depth_frame, color_frame - - self.color_image = np.asanyarray(color_frame.get_data()) - self.depth_image = np.asanyarray(depth_frame.get_data()) - - # return - return self.color_image, self.depth_image - - def realsense_demo(self): - global g_hand_data - try: - image_width = self.image_width - image_height = self.image_height - # mphand = MediaPipeHandLandmarkDetector() - self.rs_init() - - while True: - image_color, image_depth = self.get_frames() - - # if not image_color or not image_depth: - # continue - - self.hand_detection(image_color, image_depth, self.depth_intrinsics) - - index_finger_tip_image = self.hand_landmarks['landmarks'] - index_finger_tip_world = self.hand_landmarks['world_landmarks'] - - if index_finger_tip_image is None or index_finger_tip_world is None: - continue - xyz_idx = index_finger_tip_image[8] - x = min(int(xyz_idx[0] * image_width), image_width - 1) # prevent the index overflow - y = min(int(xyz_idx[1] * image_height), image_height - 1) # prevent the index overflow - # if x <= 0 or x >= w or y <= 0 or y >= h: - # ''' out of index ''' - # return - z = self.depth_image_filtered[y, x] - z2 = index_finger_tip_world[8][2] - - finger_depth = z - cv2.line(self.color_image, (int(image_width / 2), int(image_height / 2)), - (int(image_width / 2), int(image_height / 2)), (255, 0, 0), 5) - cv2.putText(self.color_image, f"(basic: {finger_depth:.1f} mm", - (x, y - 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) - cv2.putText(self.color_image, f"(scale: {z2:.1f}) mm", - (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) - cv2.putText(self.color_image, - f"{x:.1f}, {y:.1f}, {z:.1f} mm", - (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) - cv2.line(self.depth_image_filtered, (x, y), (x, y), (0, 255, 0), 5) - cv2.putText(self.depth_image_filtered, f"{finger_depth:.1f} mm", - (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) - cv2.putText(self.depth_image_filtered, - f"{x:.1f}, {y:.1f}, {z:.1f} mm", - (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) - - - if self.color_image is None or self.depth_image_for_drawing is None: - continue - - cv2.imshow('MediaPipe Hands', self.color_image) - - depth_show_img = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image_filtered, alpha=0.3), cv2.COLORMAP_JET) - # cv2.imshow('depth image', depth_show_img) - - cv2.imshow('depth image2', self.depth_image_for_drawing) - - - - if cv2.waitKey(5) & 0xFF == 27: - break - except KeyboardInterrupt: - print(f'Keyboard Interrupt (SIGINT)') - finally: - pass - -def main(): - HLD = MediaPipeHandLandmarkDetector() - thread_mediapipe_hand = threading.Thread(target=HLD.realsense_demo) - thread_mediapipe_hand.daemon = True - thread_mediapipe_hand.start() - - print('RealTimePlot3D class is update...') - - real_time_plot = RealTimePlot3D() - real_time_plot.start() - - print('show start') - plt.show() - print('show end') - - # t = Process(target=HLD.realsense_demo(), args=(10,)) - # t.start() - # t.join() - -if __name__ == '__main__': - main() - diff --git a/src/handpose_pkg/handpose_pkg/mediapipe_hands_3D_realsense_demo.py b/src/handpose_pkg/handpose_pkg/mediapipe_hands_3D_realsense_demo.py deleted file mode 100644 index ba0a6f4..0000000 --- a/src/handpose_pkg/handpose_pkg/mediapipe_hands_3D_realsense_demo.py +++ /dev/null @@ -1,354 +0,0 @@ -import mediapipe as mp -import cv2 -import numpy as np -import uuid -import os -import pyrealsense2 as rs -import time -import matplotlib -import matplotlib.pyplot as plt -from mpl_toolkits.mplot3d import Axes3D -from matplotlib.animation import FuncAnimation -from functools import partial -import threading -# matplotlib.use('Agg') - - -import queue -queue = queue.Queue() - -g_hand_data = np.zeros((21, 3)) -g_hand_data_scaled = np.zeros((21, 3)) -g_hand_data_normalized = np.zeros((21, 3)) -g_hand_world_data = np.zeros((21, 3)) - -class RealTimePlot3D: - def __init__(self, num_points=21): - self.num_points = num_points - self.data = np.random.randn(self.num_points, 3) - self.fig = plt.figure() - self.ax = self.fig.add_subplot(111, projection='3d') - self.ax.set_xlabel('X Label') - self.ax.set_ylabel('Y Label') - self.ax.set_zlabel('Z Label') - self.ax.set_xlim(-0.1, 0.1) - self.ax.set_ylim(-0.1, 0.1) - self.ax.set_zlim(-0.1, 0.1) - # self.ani = None - self.ani = FuncAnimation(self.fig, self.update_data, frames=1, interval=100) - self.scatter = self.ax.scatter(g_hand_data[:, 0], g_hand_data[:, 1], g_hand_data[:, 2]) - self.update_thread = threading.Thread(target=self.update_data) - self.update_thread.daemon = True - - def update_data(self, frames): - - global g_hand_data, g_hand_world_data, g_hand_data_normalized - colors = ['black', 'blue', 'green', 'orange', 'red', 'black'] - intervals = [4, 8, 12, 16, 20] - - while True: - # 현재 점 삭제 - self.scatter.remove() - self.ax.cla() - self.ax.set_xlabel('X Label') - self.ax.set_ylabel('Y Label') - self.ax.set_zlabel('Z Label') - self.ax.set_xlim(0, 500) - self.ax.set_ylim(0, 500) - self.ax.set_zlim(-100, 400) - # data = g_hand_data - data = g_hand_data_scaled - # data = g_hand_world_data - # data = g_hand_data_normalized - - self.scatter = self.ax.scatter(data[:, 0], data[:, 1], data[:, 2], - color='black', - s=50, - alpha=1) - # self.scatter = self.ax.scatter(0,0,0, color='red',s=50, alpha=1) - for i in range(len(intervals)): - start_idx = 0 if i == 0 else intervals[i - 1] + 1 - end_idx = intervals[i] - self.ax.plot(data[start_idx:end_idx + 1, 0], - data[start_idx:end_idx + 1, 1], - data[start_idx:end_idx + 1, 2], - color=colors[i]) - - - - return self.scatter - - def start(self): - # 데이터 업데이트 쓰레드 시작 - self.update_thread.start() - self.ani = FuncAnimation(self.fig, self.update_data, frames=100, interval=30) - - -class MediaPipeHandLandmarkDetector: - pass -def mediapipe_hand_detection(): - global g_hand_data, g_hand_data_scaled, g_hand_data_normalized - hand_data = np.zeros((21, 3)) - - mp_drawing = mp.solutions.drawing_utils - mp_hands = mp.solutions.hands - - ## for filter - - # moving average - num_of_avg = 10 - finger_depth = np.zeros(num_of_avg) - - # low pass - finger_depth_prev = 0 - finger_depth_curr = 0 - filter_sensitivity = 0.3 - - # Realsense 카메라 객체 생성 - pipeline = rs.pipeline() - config = rs.config() - # config.enable_stream(rs.stream.color, 1280, 720, rs.format.bgr8, 30) - # config.enable_stream(rs.stream.depth, 1280, 720, rs.format.z16, 30) - config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) - config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) - - - # 카메라 시작 - profile = pipeline.start(config) - align = rs.align(rs.stream.color) - # align = rs.align(rs.stream.depth) - - color_intrinsics = profile.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() - depth_intrinsics = profile.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() - - # color_intrinsics = align.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() - # depth_intrinsics = align.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() - - print(f'intrinsics(color): {color_intrinsics}') - print(f'intrinsics(depth): {depth_intrinsics}') - - depth_sensor = profile.get_device().first_depth_sensor() - if depth_sensor.supports(rs.option.depth_units): - depth_sensor.set_option(rs.option.depth_units, 0.001) - print(f'depth sensor: {depth_sensor} - change depth_units to : 0.001') - pipeline.stop() - print(f'Reopen the camera...') - time.sleep(1) - - profile = pipeline.start(config) - align = rs.align(rs.stream.color) - else: - print('depth sensor doesn''t support changing depth_units.') - - p_time = time.time() - - with mp_hands.Hands( - static_image_mode=False, - min_detection_confidence=0.8, - min_tracking_confidence=0.7) as hands: - while True: - - frames = pipeline.wait_for_frames() - # align_frames = align.process(frames) - align_frames = frames - color_frame = align_frames.get_color_frame() - depth_frame = align_frames.get_depth_frame() - - # intrinsics = depth_frame.proflie.as_video_stream_profile().intrinsics - # # 내부 파라미터 출력 - # print("Width:", intrinsics.width) - # print("Height:", intrinsics.height) - # print("Principal Point [X, Y]:", intrinsics.ppx, intrinsics.ppy) - # print("Focal Length [X, Y]:", intrinsics.fx, intrinsics.fy) - # print("Distortion Model:", intrinsics.model) - - # depth_frame_spatial_filter = rs.spatial_filter().process(depth_frame) - # depth_frame_temporal_filter = rs.temporal_filter().process(depth_frame) - - # decimated_queue = rs.decimation_filter(2) - # depth_frame = decimated_queue.process(depth_frame) - depth_frame = rs.hole_filling_filter().process(depth_frame) - - - if not depth_frame or not color_frame: - continue - - color_image = np.asanyarray(color_frame.get_data()) - depth_image = np.asanyarray(depth_frame.get_data()) - depth_image_origin = depth_image - # depth_image_spatial_filter = np.asanyarray(depth_frame_spatial_filter.get_data()) - # depth_image_temporal_filter = np.asanyarray(depth_frame_temporal_filter.get_data()) - - cv2.imshow('MediaPipe Hands', color_image) - cv2.imshow('MediaPipe Hands', depth_image) - - ###################################################### - # choose image with filter - depth_image = depth_image - ###################################################### - - # depth_image_origin = cv2.flip(depth_image_origin, 1) - depth_image = cv2.flip(depth_image, 1) - - # Flip the image horizontally for a later selfie-view display, and convert - # the BGR image to RGB. - image = cv2.cvtColor(cv2.flip(color_image, 1), cv2.COLOR_BGR2RGB) - depth_norm_image = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.3), cv2.COLORMAP_JET) - - - # To improve performance, optionally mark the image as not writeable to - # pass by reference. - image.flags.writeable = False - results = hands.process(image) - image_height, image_width, _ = image.shape - # Draw the hand annotations on the image. - image.flags.writeable = True - image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) - - - hand_label = None - # class of hands (detected) - if results.multi_handedness: - for handedness in results.multi_handedness: - for ids, classification in enumerate(handedness.classification): - index = classification.index - score = classification.score - label = classification.label - hand_label = label - - if hand_label == "Right": - # print("Right Hand") - if results.multi_hand_landmarks: - for hand_landmarks in results.multi_hand_landmarks: - # Here is How to Get All the Coordinates - # print(f"{hand_landmarks.categories.index} / score: {hand_landmarks.categories.score} / categoryname: {hand_landmarks.categories.categoryName}") - - for ids, landmrk in enumerate(hand_landmarks.landmark): - cx, cy, cz = landmrk.x, landmrk.y, landmrk.z - - g_hand_data[ids, 0] = cx - g_hand_data[ids, 1] = cy - g_hand_data[ids, 2] = cz - - g_hand_data_scaled[ids, 0] = cx * image_width - g_hand_data_scaled[ids, 1] = cy * image_height - g_hand_data_scaled[ids, 2] = cz * image_width - - # 정규화 - min_vals = np.min(g_hand_data, axis=0) - max_vals = np.max(g_hand_data, axis=0) - g_hand_data_normalized = (g_hand_data - min_vals) / (max_vals - min_vals) - # g_hand_data_normalized[:, 2] = g_hand_data[:,2] - - mp_drawing.draw_landmarks( - image, - hand_landmarks, - mp_hands.HAND_CONNECTIONS, - # mp_drawing_styles.get_default_hand_landmarks_style(), - # mp_drawing_styles.get_default_hand_connections_style() - ) - - if results.multi_hand_world_landmarks: - for hand_world_landmarks in results.multi_hand_world_landmarks: - # Here is How to Get All the Coordinates - for ids, landmrk in enumerate(hand_world_landmarks.landmark): - # print(ids, landmrk) - cx, cy, cz = landmrk.x, landmrk.y, landmrk.z - # print(f'{ids}: {cx}, {cy}, {cz}') - g_hand_world_data[ids, 0] = cx - g_hand_world_data[ids, 1] = cy - g_hand_world_data[ids, 2] = cz - - # for hand_world_landmarks in results.multi_hand_world_landmarks: - # mp_drawing.plot_landmarks( - # hand_world_landmarks, mp_hands.HAND_CONNECTIONS, azimuth=5) - else: - # print("No Right Hand") - pass - - c_time = time.time() - fps = 1 / (c_time - p_time) - p_time = c_time - cv2.putText(image, f"FPS: {int(fps)}", (20, 20), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 255), 1) - # cv2.putText(image, f"index finger(basic) : x:{g_hand_data[8,0]}", - # (20, 60), cv2.FONT_HERSHEY_PLAIN, 1, (255, 20, 20), 1) - # cv2.putText(image, f"index finger(basic) : y:{g_hand_data[8,1]}", - # (20, 80), cv2.FONT_HERSHEY_PLAIN, 1, (255, 20, 20), 1) - # cv2.putText(image, f"index finger(basic) : z:{g_hand_data[8,2]}", - # (20, 100), cv2.FONT_HERSHEY_PLAIN, 1, (255, 20, 20), 1) - # cv2.putText(image, f"index finger(world) : x:{g_hand_world_data[8, 0]}", - # (20, 140),cv2.FONT_HERSHEY_PLAIN, 1, (255, 20, 255), 1) - # cv2.putText(image, f"index finger(world) : y:{g_hand_world_data[8, 1]}", - # (20, 160),cv2.FONT_HERSHEY_PLAIN, 1, (255, 20, 255), 1) - # cv2.putText(image, f"index finger(world) : z:{g_hand_world_data[8, 2]}", - # (20, 180),cv2.FONT_HERSHEY_PLAIN, 1, (255, 20, 255), 1) - - pixel_x = int(g_hand_data[8, 0] * image_width) - pixel_y = int(g_hand_data[8, 1] * image_height) - - # pixel_x = int(g_hand_world_data[8, 0] * image_width) - # pixel_y = int(g_hand_world_data[8, 1] * image_height) - - # print(pixel_x, pixel_y) - if pixel_x>0 and pixel_x0 and pixel_y= replace_th] = canonical_point[xyz_distances >= replace_th] - # print(f'distances(th=20 mm): {xyz_distances} / {xyz_distances >= replace_th}') - # print(f'replace_point(after): {replace_point}') - return canonical_point, world_point, world_point_iqr, replace_point - pass - - @staticmethod - def vector_to_rpy(x, y, z): - # Yaw (ψ) - yaw = np.arctan2(y, x) - # Pitch (θ) - pitch = np.arctan2(-z, np.sqrt(x ** 2 + y ** 2)) - # Roll (φ) is typically set to zero for a single vector - roll = 0.0 - return roll, pitch, yaw - - @staticmethod - def remove_outliers_iqr(data, q1_rate=25., q3_rate=75., alpha=1.5): - """ - # IQR 방법으로 이상치 제거 - :return: - """ - q1 = np.percentile(data, q1_rate) - q3 = np.percentile(data, q3_rate) - iqr = q3 - q1 - lower_bound = q1 - (alpha * iqr) - upper_bound = q3 + (alpha * iqr) - return data[(data >= lower_bound) & (data <= upper_bound)] - - @staticmethod - def replace_outliers_iqr_as_mean(data, q1_rate=25., q3_rate=75., alpha=0.5): - """ - # IQR 방법으로 이상치 제거하고 평균값으로 대체하는 함수 - :return: - """ - q1 = np.percentile(data, q1_rate) - q3 = np.percentile(data, q3_rate) - iqr = q3 - q1 - lower_bound = q1 - (alpha * iqr) - upper_bound = q3 + (alpha * iqr) - - # 이상치의 인덱스를 저장 - outliers_indices = np.where((data < lower_bound) | (data > upper_bound))[0] - - # 이상치가 아닌 값들로 평균을 계산 - mean_value = np.mean(data[(data >= lower_bound) & (data <= upper_bound)]) - - # 이상치를 평균값으로 대체 - data[outliers_indices] = mean_value - - # print(f'IQR: q1:{q1}, q3:{q3}, iqr:{iqr}, l_b:{lower_bound}, u_b:{upper_bound}, indices:{outliers_indices}, mean:{mean_value}') - return data - - - def get_hand_keypoint_pixel_xyz(self, hand_index=0, keypoint='index_finger_tip', coord='replace'): - try: - keypoint_index = self.keypoints['keypoints'][keypoint] - - if coord == 'canonical': - landmarks = self.canonical_points - x = landmarks[keypoint_index, 0] - y = landmarks[keypoint_index, 1] - z = landmarks[keypoint_index, 2] - return np.array([x, y, z]) - - elif coord == 'replace': - landmarks = self.replace_point - x = landmarks[keypoint_index, 0] - y = landmarks[keypoint_index, 1] - z = landmarks[keypoint_index, 2] - return np.array([x, y, z]) - - elif coord == 'normalized': - landmarks = self.hand_results[hand_index]['landmarks'] - x = landmarks[keypoint_index, 0] - y = landmarks[keypoint_index, 1] - z = landmarks[keypoint_index, 2] - return np.array([x, y, z]) - - except Exception as e: - print(f'[mediapipe_hands.py] Exception error: {e}') - finally: - pass - - def get_hand_world_xyz(self): - xyz_world = [] - for idx, xyz in enumerate(self.replace_point): - coordinate_xyz = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [xyz[0], xyz[1]], xyz[2]) - xyz_world.append(coordinate_xyz) - - xyz_world = np.asarray(xyz_world, dtype=np.float64) - return xyz_world - - def get_palm_pose(self, coord='replace'): - p1 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='wrist', coord=coord) - p2 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='pinky_mcp', coord=coord) - p3 = self.get_hand_keypoint_pixel_xyz(hand_index=0, keypoint='index_finger_mcp', coord=coord) - - v1 = p2 - p1 - v2 = p3 - p1 - center_point = (p1 + p2 + p3) / 3. - normal_vector = np.cross(v1, v2) - normal_unit_vector = normal_vector / np.linalg.norm(normal_vector, 2) - - return center_point, normal_unit_vector - - def conversion_hand_keypoint_pixel_to_point(self, keypoints_array, top_point_n=None): - """Algorithm for annotating pixel. - -- Not Used -- - Select 3(or more, optional) points closest to the camera. - And, calculate of scale of x,y and z (distance_pixel : distance_world) - Finally, obtain all 21 x,y and z dimension values of keypoints on real world - - Landmarks - There are 21 hand landmarks, each composed of x, y and z coordinates. - The x and y coordinates are normalized to [0.0, 1.0] by the image width and height, respectively. - The z coordinate represents the landmark depth, with the depth at the wrist being the origin. - The smaller the value, the closer the landmark is to the camera. - The magnitude of z uses roughly the same scale as x. - source: https://developers.google.com/mediapipe/solutions/vision/hand_landmarker/python#handle_and_display_results - - - Author: DY - Args: - keypoints_array (ndarray): (21, 3) array - - Returns: - ndarray: (21,3) world dx,dy,dz coordinates - """ - - try: - keypoint_arr = np.reshape(keypoints_array, (21, 3)) # must be check - - if top_point_n == None: - align_z_keypoint_world_arr = [] - h, w = self.depth_image_filtered.shape - for idx, pixel_xyz in enumerate(keypoint_arr): - x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow - y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow - if x <= 0 or x >= w or y <= 0 or y >= h: - ''' out of index ''' - return - - z = self.depth_image_filtered[y, x] - xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) - align_z_keypoint_world_arr.append(xyz_world) - - align_z_keypoint_world_arr = np.asarray(align_z_keypoint_world_arr, dtype=np.float64) - return align_z_keypoint_world_arr - - elif isinstance(top_point_n, int): - z_arr = keypoint_arr[:, 2] # depth values - min_z = np.min(z_arr) - min_z_index = np.argmin(z_arr) - ########################################################## - ## select top N values and obtain scale of x,y and z - # - start - b_ids, b_values = self.get_bottom_n_values(z_arr, n=top_point_n) - - selected_keypoint_arr = keypoint_arr[b_ids] - - selected_keypoint_world_arr = [] - offset_min_z = 0 - h, w = self.depth_image_filtered.shape - for idx, pixel_xyz in enumerate(selected_keypoint_arr): - x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow - y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow - if x <= 0 or x >= w or y <= 0 or y >= h: - ''' out of index ''' - return - - z = self.depth_image_filtered[y, x] - if idx == min_z_index: - offset_min_z = z - xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) - selected_keypoint_world_arr.append(xyz_world) - - s_x, s_y, s_z = self.get_scales_xyz_coordinate_to_world(selected_keypoint_arr=selected_keypoint_arr, - selected_keypoint_world_arr=selected_keypoint_world_arr, - sz_type='sx') - # obtan scale of x,y and z - # - end - ########################################################## - - # calculate world xyz of all keypoints - # There is the keypoint which the nearest keypoint from camera, we make its z-value as 0. - # cf) Originally, wrist point is 0 on mediapipe algorithm. - ''' - TODO - Apply scale of x,y and z - and offset from top distance !!! 2024.05.13 - ''' - align_z_keypoint_arr = keypoint_arr - align_z_keypoint_arr[:, 2] = keypoint_arr[:, 2] - min_z - align_z_keypoint_world_arr = [] - for idx, pixel_xyz in enumerate(align_z_keypoint_arr): - up_x = int(pixel_xyz[0] * w) - up_y = int(pixel_xyz[1] * h) - x = min(int(pixel_xyz[0] * w), w - 1) # prevent the index overflow - y = min(int(pixel_xyz[1] * h), h - 1) # prevent the index overflow - if x <= 0 or x >= w or y <= 0 or y >= h: - ''' out of index ''' - return - # z = self.depth_image_filtered[y, x] - z = pixel_xyz[2] * s_z + offset_min_z - - print(f'scale: {s_z} : pixel_xyz={pixel_xyz[2]} / z={z}') - xyz_world = rs.rs2_deproject_pixel_to_point(self.depth_intrinsics, [x, y], z) - align_z_keypoint_world_arr.append(xyz_world) - - align_z_keypoint_world_arr = np.asarray(align_z_keypoint_world_arr, dtype=np.float64) - return align_z_keypoint_world_arr - - except Exception as e: - print(f'[mediapipe_hands.py] Exception error: {e}') - finally: - pass - - def get_top_n_values(self, arr, n=3): - arr = np.array(arr) - max_indices = np.argpartition(arr, -n)[-n:] # 가장 큰 값의 인덱스를 찾습니다. - max_values = np.partition(arr, -n)[-n:] # 배열에서 가장 큰 값 3개를 찾습니다. - return max_indices, max_values - - def get_bottom_n_values(self, arr, n=3): - arr = np.array(arr) - min_indices = np.argpartition(arr, n)[:n] # 가장 작은 값의 인덱스를 찾습니다. - min_values = np.partition(arr, n)[:n] # 배열에서 가장 작은 값 3개를 찾습니다. - return min_indices, min_values - - def get_scales_xyz_coordinate_to_world(self, selected_keypoint_arr, selected_keypoint_world_arr, sz_type='sx'): - """Obtain scales of x,y and z - -- Not Used -- - scale = abs(real_distance / point_distance) - It is the average of values that have several points and are selected as a combination of two points. - (nC2) - - Args: - selected_keypoint_arr (_type_): _description_ - selected_keypoint_world_arr (_type_): _description_ - - Returns: - _type_: _description_ - """ - n_arr = np.array(selected_keypoint_arr) - w_arr = np.array(selected_keypoint_world_arr) - - scale_xyz = [] - # n = len(selected_keypoint_arr) - for idx, _ in enumerate(selected_keypoint_arr): - for i in range(idx + 1, len(selected_keypoint_arr)): - scales = abs((w_arr[idx] - w_arr[i]) / (n_arr[idx] - n_arr[i])) - scale_xyz.append(scales) - scale_xyz = np.asarray(scale_xyz) # convert to numpay array - scale_x = np.mean(scale_xyz[:, 0]) - scale_y = np.mean(scale_xyz[:, 1]) - if (sz_type == 'sx'): - scale_z = scale_x - else: - scale_z = np.mean(scale_xyz[:, 2]) - - return scale_x, scale_y, scale_z - - # def get_hand_keypoint_normalized_xyz(self, hand_index=0, keypoint='index_finger_tip'): - # try: - # keypoint_index = self.keypoints['keypoints'][keypoint] - # landmarks = self.hand_results[hand_index]['landmarks'] - # x = landmarks[keypoint_index,0] - # y = landmarks[keypoint_index,1] - # z = landmarks[keypoint_index,2] - - # return x,y,z - # except Exception as e: - # print(f'[mediapipe_hands.py] Exception error: {e}') - # finally: - # pass - - def rs_init(self, fps=30): - # Realsense 카메라 객체 생성 - self.pipeline = rs.pipeline() - self.config = rs.config() - # config.enable_stream(rs.stream.color, 1280, 720, rs.format.bgr8, 30) - # config.enable_stream(rs.stream.depth, 1280, 720, rs.format.z16, 30) - width = self.image_width - height = self.image_height - self.config.enable_stream(rs.stream.color, width, height, rs.format.bgr8, fps) - self.config.enable_stream(rs.stream.depth, width, height, rs.format.z16, fps) - - # 카메라 시작 - self.profile = self.pipeline.start(self.config) - # self.align = rs.align(rs.stream.color) - - self.color_intrinsics = self.profile.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() - self.depth_intrinsics = self.profile.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() - - # color_intrinsics = align.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics() - # depth_intrinsics = align.get_stream(rs.stream.depth).as_video_stream_profile().get_intrinsics() - - print(f'intrinsics(color): {self.color_intrinsics}') - print(f'intrinsics(depth): {self.depth_intrinsics}') - - self.depth_sensor = self.profile.get_device().first_depth_sensor() - if self.depth_sensor.supports(rs.option.depth_units): - self.depth_sensor.set_option(rs.option.depth_units, 0.001) - print(f'depth sensor: {self.depth_sensor} - change depth_units to : 0.001') - self.pipeline.stop() - print(f'Reopen the camera...') - time.sleep(1) - - self.profile = self.pipeline.start(self.config) - self.align = rs.align(rs.stream.color) - else: - print('depth sensor doesn''t support changing depth_units.') - - def get_frames(self): - frames = self.pipeline.wait_for_frames() - align_frames = frames - # align_frames = self.align.process(frames) - - depth_to_disparity_transform = rs.disparity_transform(True) # True for depth to disparity - align_frames = depth_to_disparity_transform.process(align_frames) - - align_frames = rs.spatial_filter().process(align_frames) - align_frames = rs.temporal_filter().process(align_frames) - - disparity_to_depth_transform = rs.disparity_transform(False) - align_frames = disparity_to_depth_transform.process(align_frames).as_frameset() - - color_frame = align_frames.get_color_frame() - depth_frame = align_frames.get_depth_frame() - - if not depth_frame or not color_frame: - return depth_frame, color_frame - - self.color_image = np.asanyarray(color_frame.get_data()) - self.depth_image = np.asanyarray(depth_frame.get_data()) - - # return - return self.color_image, self.depth_image - - def realsense_demo(self): - global g_hand_data - try: - image_width = self.image_width - image_height = self.image_height - # mphand = MediaPipeHandLandmarkDetector() - self.rs_init() - - while True: - image_color, image_depth = self.get_frames() - - # if not image_color or not image_depth: - # continue - - self.hand_detection(image_color, image_depth, self.depth_intrinsics) - - index_finger_tip_image = self.hand_landmarks['landmarks'] - index_finger_tip_world = self.hand_landmarks['world_landmarks'] - - if index_finger_tip_image is None or index_finger_tip_world is None: - continue - xyz_idx = index_finger_tip_image[8] - x = min(int(xyz_idx[0] * image_width), image_width - 1) # prevent the index overflow - y = min(int(xyz_idx[1] * image_height), image_height - 1) # prevent the index overflow - # if x <= 0 or x >= w or y <= 0 or y >= h: - # ''' out of index ''' - # return - z = self.depth_image_filtered[y, x] - z2 = index_finger_tip_world[8][2] - - finger_depth = z - cv2.line(self.color_image, (int(image_width / 2), int(image_height / 2)), - (int(image_width / 2), int(image_height / 2)), (255, 0, 0), 5) - cv2.putText(self.color_image, f"(basic: {finger_depth:.1f} mm", - (x, y - 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) - cv2.putText(self.color_image, f"(scale: {z2:.1f}) mm", - (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) - cv2.putText(self.color_image, - f"{x:.1f}, {y:.1f}, {z:.1f} mm", - (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0), 1) - cv2.line(self.depth_image_filtered, (x, y), (x, y), (0, 255, 0), 5) - cv2.putText(self.depth_image_filtered, f"{finger_depth:.1f} mm", - (x, y), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) - cv2.putText(self.depth_image_filtered, - f"{x:.1f}, {y:.1f}, {z:.1f} mm", - (x, y + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 0), 1) - - - if self.color_image is None or self.depth_image_for_drawing is None: - continue - - cv2.imshow('MediaPipe Hands', self.color_image) - - depth_show_img = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image_filtered, alpha=0.3), cv2.COLORMAP_JET) - # cv2.imshow('depth image', depth_show_img) - - cv2.imshow('depth image2', self.depth_image_for_drawing) - - - - if cv2.waitKey(5) & 0xFF == 27: - break - except KeyboardInterrupt: - print(f'Keyboard Interrupt (SIGINT)') - finally: - pass - -def main(): - HLD = MediaPipeHandLandmarkDetector() - thread_mediapipe_hand = threading.Thread(target=HLD.realsense_demo) - thread_mediapipe_hand.daemon = True - thread_mediapipe_hand.start() - - print('RealTimePlot3D class is update...') - - real_time_plot = RealTimePlot3D() - real_time_plot.start() - - print('show start') - plt.show() - print('show end') - - # t = Process(target=HLD.realsense_demo(), args=(10,)) - # t.start() - # t.join() - -if __name__ == '__main__': - main() - From 737bc14a29c6931027a1ae734709c23808c709a6 Mon Sep 17 00:00:00 2001 From: Bigyuun Date: Wed, 26 Jun 2024 08:35:23 +0900 Subject: [PATCH 08/11] update --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 67f2384..c868f39 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ install log .git venv +.vscode +.idea + From a1422b405f3fb9f2a9cc602bc881a217ce5a1746 Mon Sep 17 00:00:00 2001 From: Bigyuun Date: Tue, 9 Jul 2024 16:07:31 +0900 Subject: [PATCH 09/11] update multiprocessing part & update tcp code --- .../__pycache__/realsense_api.cpython-38.pyc | Bin 7455 -> 7476 bytes .../realsense_api/realsense_api.py | 8 +- .../__pycache__/handlandmarks.cpython-38.pyc | Bin 9986 -> 9998 bytes .../handlandmarks/handlandmarks.py | 13 +- .../handlandmarks_show_plot.cpython-38.pyc | Bin 3317 -> 3392 bytes ...dlandmarks_show_plot_legacy.cpython-38.pyc | Bin 0 -> 3326 bytes ...andlandmarks_with_realsense.cpython-38.pyc | Bin 3048 -> 3159 bytes scripts/__pycache__/tcp_server.cpython-38.pyc | Bin 3443 -> 3643 bytes scripts/handlandmarks_show_plot.py | 46 +++---- scripts/handlandmarks_show_plot_legacy.py | 117 ++++++++++++++++ scripts/handlandmarks_with_realsense.py | 39 +++--- scripts/main.py | 8 +- scripts/main_legacy.py | 18 --- scripts/tcp_client.py | 44 ++++-- scripts/tcp_server.py | 127 +++++++++--------- 15 files changed, 278 insertions(+), 142 deletions(-) create mode 100644 scripts/__pycache__/handlandmarks_show_plot_legacy.cpython-38.pyc create mode 100644 scripts/handlandmarks_show_plot_legacy.py delete mode 100644 scripts/main_legacy.py diff --git a/common/RealSense_Utilities/realsense_api/__pycache__/realsense_api.cpython-38.pyc b/common/RealSense_Utilities/realsense_api/__pycache__/realsense_api.cpython-38.pyc index 9b52f02c7067480e652f723b7da12bfbe18559b5..94805844b9c720c3a4fb72d82b64e973a802dc7e 100644 GIT binary patch delta 224 zcmbPlwZ)1rl$V!_0SFTB_oOMAZshwRz{)JZ#Kk(9Tksm=>&cGZdyrZWmLO7z{mjB&*WDn8(ox|m{XjZSDdPl zSdba3P>@-Wnv;tgK`3bQ~C;sF5zlOqr}3j=)zbO34!Y72Y=vt= self.replace_threshold] = canonical_point[xyz_distances >= self.replace_threshold] return canonical_point, world_point, world_point_iqr, replace_points pass @@ -309,7 +310,7 @@ def main(): # cv2.imshow('test_image', test_image) cv2.imshow('mp2_image', HLD.drawing_image) - test_image = cv2.imread("yj.png") + test_image = cv2.imread("yj.jpg") arbitrary_depth_image = np.random.randint(0, 601, (480, 640)) HLD.hand_detection(test_image, arbitrary_depth_image, ) diff --git a/scripts/__pycache__/handlandmarks_show_plot.cpython-38.pyc b/scripts/__pycache__/handlandmarks_show_plot.cpython-38.pyc index 3160e820d0043098d4cdf89353b318ee90e852f4..144bbba148a99049676160f4b95a23aa914bb2fb 100644 GIT binary patch delta 1607 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 VJ_Pvjx|gucygxW5(hl8%_J6aHCC>l= literal 0 HcmV?d00001 diff --git a/scripts/__pycache__/handlandmarks_with_realsense.cpython-38.pyc b/scripts/__pycache__/handlandmarks_with_realsense.cpython-38.pyc index bb4e442ee2e31071d1f844dabb8b433a87547f21..de70bc9cb0fa052557e570ac45739986b91e21dc 100644 GIT binary patch delta 1279 zcmZ8h&2QsG6rZu3*s){BaX#CoA7NW)7qJz)3tXxdu-X$JT2Y}CU!u^N-6pl2#&(uX zU4<9#xXX6!n&fPK+~bH?G*rSL~H5_9|6+YqUlibeXQu)dvzOoC$W5Hj|f9gb~#e zjcUDXw4Msjt#xkQMaOwaGgw*+c{e0PHx5;Jr2`BeNNy%C^AhtM`U){m;q0FvPuK%8 zchOcc{uBpB6}Z-6-h~-h@t^qf$)j_8{AQ#l8Y>X#z5Lh&sYfP}Nd64o1S}&dutqV*{$J5p&#BPN;mC2{}J&G;f)j(^Pjlg&`~C>+J#W^Zm}yKZpM|IC(;`i}D+9Zki)Pp0{g zhF;ip={?`?`&-qxB>#e|@o(}%&0mD>PsKwzvSokh(Z@&O_sHLj|CPVame|EOh-2m6 zrh-+RhcVZ(BIdCnD7b;uj0LeZzzX)S$Nwq6-rt0EJ{Mc8xDj+8dL5^I(D8^v{SK?j zKXh0z8~!bpr?lH{r|Y%bz6RzNp2}|LanL=cv82AczB$bdhIB}$8E@zwjr=;~_}grq z&=33qvr6&4`VPJkf2WQb*O}v4S+C>Lc6%y+(D6DCsUN?t)t2lmFL!IMZ%^g>et(|^ zf&Xf}t8F{4u>uwoFOKu#Ov;YiCqswcfj<-qc0eecfoCTIri2yF7_cTPA1bnn&H1Q8 N%mDTTh?|^&{{f@EGL`@U delta 1180 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�oAbNb z*($^Jx9vZ7=jIvvH@!?>E?(~9Nm2;OB=56U(ejqC?@r6Ht=n>c!=#YTXG}WJM5`oS zS^A8%JXMz7q0mDm#{L;=RVHm!iQbIzR7F+0LYAM4R!!B$vuBJmv~_AF-(gMv6?SG@ z9g@?Rz{_1c$=eW$wYX%kh)aPz9qC9HEi8~8+LA0wAFU@VvWm7WXJienFK4ks-Bcdm zf3&0YvCezob?3g|mzL@G zF`|Or%D8Iv8T8hyHY+hYs9QOg&X4D9?}B77(A&!9(#|mG#8EfgU+*PxWZZ)|NsT*< zb!ukzM%}K`K@w(4bJ*EjH1(sA8mZu*9m!#wC{rumhjAFCiJ9rgZ8=%bc*VM!epOSz zbqT_V!O)c7Z%6HYrA>J-QQUrreaoGGsAwVgy|{B|+&)QXI802b6OSSomWBgmoFqtJ zI>t>@zpFi3xeW1=>DSPF8EhQH1GORB>SPpcJW$DD8V@)2!}MUZ7ia~u!!*{RN`ha7 z`zIre*^c+(^wvB0r(2J8yK@*u`?t0~*txxtbaXgOlMV7xVgtE8JTZO{gi)9V0qvTs zLNM;(u1)SL+Nz+QZ1DmC>*td?gs}6Ad_$RHp>PvQ3NT3iOuSe<6)7K!T%7SIOt3fE zhiseu6Jeuv7rBA}iY>!+6OM?73ZW|kNFiuCdIgKMW{MC5-LS8WOVYZi5M;RaA!ukq z0b(#byLM^vR5Y&unBq8x$6Ea#C@FF(7X;PMk)_Z8&d=Ew?laC=_LuCpIUf^fy)%C5 zc;<&0ytN3)R*=sSaU)Of<8AG<8A99H!|I6HN*_9E7)<}OAH z8vO)*lKAqeyURXek=V68*qOh$iM5baJ#pyie^EPja--GI6Jol}2gz)?3-y<|iFBOv5;8gi(WXtFMA$^*fDb)s%)B>7_xWOxGcdr_~@n zR>%t4!MIv=j*IN_r0T>{naZ994mxclRpny!X34_B%ob}03DQd;soGL%WIFB=zompJBa?bQWv;$&ZAHBfHP#w1rnT39YVrUeHRa* z<4X2qs~4^z$6vS%PWPs~T~1Ua+x@=&A&k`DA@N;^rfa>a-+&IXv&^M`L|=)9rgH2D zc%|GS=H(*; zAnSY)x9`k5D?Dpl`u^(|=uk$VUlfE29vg`3_>ux{R2V$xr+i8m&~cLYKrgvK3F15# zM0y34q@{5wE%iJ+$Yk`ZN8R=SLs?n+4s}MEOcZ8)N)W2p27&Ujs zJ{G5?Q!lN7N@e zr}QD!DW*IDpT3P{O(}s1sqrSfSHAb_;NjNhV>7e!!TooGoyXgo_ue<|UKq*CqQ!Vr znW(6M;P+@5w})!Scx`Ln6i;~VACY z4JH6=c}1C_Z(t4GglN?#WIY-2RqWU7KTWEWcQ7F#x}lT2CYHG`=7IMrUlqjFYhdUV zXBk<5JP^LfRxUGOdYP?eg^HZ0Jy1blszES_ZzwANv1^iFYC4`Yse5YU;OXofG&C`MNpONhcpH*7_`GE2=q_z+MLrr zr{1~2sGo+DXaIK>Z<>z8g3{<^&J{ 63 points -> (63 * 4 = 252) bytes + points_num = 63 + points_byte_len = 252 + unpacked_data = struct.unpack(f'!{points_num}f', data[:points_byte_len]) + hand_points = np.array(unpacked_data).reshape((21, 3)) + print(f"Received data[hand points]: {hand_points}") + except Exception as e: print(f"Exception in receive_data: {e}") finally: - self.client_socket.close() + self.close() def send_data(self, data): try: - self.client_socket.sendall(data.encode('utf-8')) + self.client_socket.sendall(b'GET_HAND') except Exception as e: print(f"Exception in send_data: {e}") + def close(self): + self.client_socket.close() + print(f'client[{self.client_socket}] closed') + if __name__ == "__main__": client = TCPClient() client.connect() + print(f'TCP client on.') while True: - message = input("Enter message to send: ") - client.send_data(message) + try: + pass + except KeyboardInterrupt: + client.close() + diff --git a/scripts/tcp_server.py b/scripts/tcp_server.py index dc71286..082902f 100644 --- a/scripts/tcp_server.py +++ b/scripts/tcp_server.py @@ -1,19 +1,23 @@ import socket import multiprocessing as mp +import threading import json import time +import numpy as np +import struct class TCPServer: def __init__(self, queue_handpose, queue_points): self.queue_handpose = queue_handpose self.queue_points = queue_points + self.handpose = None + self.hand_points = np.zeros((21, 3)) self.config = self.load_config('tcp_config.json') self.host = self.config['host'] self.port = self.config['port'] self.buffer_size = self.config['buffer_size'] - self.manager = mp.Manager() - self.clients = self.manager.list() # 공유 리스트 - self.lock = mp.Lock() + self.lock = threading.Lock() + self.client = None self.pps = 0 self.count = 0 @@ -23,82 +27,81 @@ def load_config(self, config_file): with open(config_file, 'r') as file: return json.load(file) - def handle_client(self, client_socket, addr): - print(f"[*] Handling client {addr[0]}:{addr[1]}") + def handle_client(self): + print(f"[*] Handling client {self.client.getpeername()}") try: while True: - data = client_socket.recv(self.buffer_size) - if not data: + # request_flag = False + request_flag = self.client_callback() + if request_flag: + self.get_hand_landmarks() + self.broadcast(self.client) + else: break - print(f"Received data from {addr[0]}:{addr[1]}: {data.decode('utf-8')}") - self.broadcast(data) + + time.sleep(0.01) except Exception as e: print(f"Exception in handle_client: {e}") finally: - with self.lock: - if client_socket in self.clients: - self.clients.remove(client_socket) - print(f'client({client_socket}) closed.') - client_socket.close() - - def broadcast(self, data): - with self.lock: - for client in self.clients: - try: - client.sendall(data) - except Exception as e: - print(f"Exception in broadcast: {e}") - self.clients.remove(client) - - def process_hand_landmarks(self, queue_handpose, queue_points): - if self.count == 1: # start - self.s_t = time.time() - - while True: - try: - queue_handpose = self.queue_handpose.get() - queue_points = self.queue_points.get() - except (mp.queues.Empty): - print(f'{mp.queues.Empty} queue empty') - return - - # print(f'========================================================') - print(f'[TCP Process] pps = {self.pps}') - # print(f'{queue_handpose}') - # print(f'========================================================') - self.pps = self.count / (time.time() - self.s_t) - self.count += 1 + print(f"[*] Client {self.client.getpeername()} disconnected.") + self.client.close() - def start_server(self): - queue_handpose = mp.Queue(maxsize=1) - queue_points = mp.Queue(maxsize=1) - # Hand Landmarks 데이터를 처리할 프로세스를 시작합니다. - landmarks_process = mp.Process(target=self.process_hand_landmarks, args=(queue_handpose, queue_points)) - landmarks_process.start() + def client_callback(self): + request = self.client.recv(self.buffer_size) + if not request: + # self.client = None + return False + + if request.decode('utf-8') == 'GET_HAND': + return True + + + def broadcast(self, client_socket): + if self.handpose is None or self.handpose['index'] is None: + data = b'NONE' + b'\0' * (self.buffer_size - len('NONE')) + serialized_data = data + else: + world_landmarks = self.handpose['world_landmarks'] + data_flat = world_landmarks.flatten() + serialized_data = struct.pack(f'!{data_flat.size}f', *data_flat) + + padding_size = self.buffer_size - len(serialized_data) + serialized_data = serialized_data + b'\0' * padding_size + + print(f'serialized_data (byte={len(serialized_data)}): {serialized_data}') + + try: + client_socket.sendall(serialized_data) + except Exception as e: + print(f"Exception in broadcast: {e}") + raise + + def get_hand_landmarks(self): + try: + self.handpose = self.queue_handpose.get_nowait() + self.hand_points = self.queue_points.get_nowait() + except mp.queues.Empty: + print('Queue is empty') + return + def start_server(self): server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind((self.host, self.port)) - server.listen(5) # 최대 5개의 연결을 대기열에 추가할 수 있습니다. - print(f"[*] Listening on {self.host}:{self.port}") + server.listen(1) # 하나의 연결만 처리 try: while True: + print(f"[*] Listening on {self.host}:{self.port}") client_socket, addr = server.accept() + self.client = client_socket print(f"[*] Accepted connection from {addr[0]}:{addr[1]}") - - with self.lock: - self.clients.append(client_socket) - - # Start a new process to handle the client - client_process = mp.Process(target=self.handle_client, args=(client_socket, addr)) - client_process.start() + self.handle_client() except KeyboardInterrupt: print("Server shutting down.") finally: server.close() - landmarks_process.join() - def start_tcp_server(queue_handpose, queue_points): tcp_server = TCPServer(queue_handpose, queue_points) tcp_server.start_server() @@ -106,6 +109,6 @@ def start_tcp_server(queue_handpose, queue_points): if __name__ == "__main__": queue_handpose = mp.Queue() queue_points = mp.Queue() - plot_process = mp.Process(target=start_tcp_server, args=(queue_handpose, queue_points)) - plot_process.start() - plot_process.join() + tcp_process = mp.Process(target=start_tcp_server, args=(queue_handpose, queue_points)) + tcp_process.start() + tcp_process.join() From 51c51ad84ede9e15b959c57b36ea97331b09189e Mon Sep 17 00:00:00 2001 From: Bigyuun Date: Mon, 15 Jul 2024 10:32:33 +0900 Subject: [PATCH 10/11] real-world points update --- .../__pycache__/realsense_api.cpython-38.pyc | Bin 7476 -> 7476 bytes .../realsense_api/realsense_api.py | 1 + .../__pycache__/handlandmarks.cpython-38.pyc | Bin 9998 -> 10575 bytes .../handlandmarks/handlandmarks.py | 40 ++++++++++++++++-- .../handlandmarks_show_plot.cpython-38.pyc | Bin 3392 -> 3450 bytes ...andlandmarks_with_realsense.cpython-38.pyc | Bin 3159 -> 3296 bytes scripts/handlandmarks_show_plot.py | 23 +++++----- scripts/handlandmarks_with_realsense.py | 9 +++- 8 files changed, 58 insertions(+), 15 deletions(-) diff --git a/common/RealSense_Utilities/realsense_api/__pycache__/realsense_api.cpython-38.pyc b/common/RealSense_Utilities/realsense_api/__pycache__/realsense_api.cpython-38.pyc index 94805844b9c720c3a4fb72d82b64e973a802dc7e..1d71b3afa1c101fcbf43f9bcc80da0bd0422b23a 100644 GIT binary patch delta 81 zcmdmDwZ)1zl$V!_0SLC{O-XCo$g3^L$TZnfa0TO=$&Unc8Q*UX5PHkV_+_)5NE9O@ l$L5)$imcMgRn;7|s9y delta 81 zcmdmDwZ)1zl$V!_0SFTB_oOLpymy{NY_=G%+#y!yjt>tqGCDKmO6g;QO9U5#u@ep7XxX_g=qC zdt&sPG4CFa$0^|R)sg2XPTqahdrF2sct!p(s!L_r5Dn1W6H)~XAsN;@h|LfH#5}TsQ`ClrHi|)zF+S z=H!Zqu>i9ONktdSHstJvkW)0!#N#4rs%7EOBxE7yOuF#vE@K@zsDLSJ^4~mqTQ=z9 zU5bh}7`F~B9QdurZ$sHv5kSxs&Gy8cfP{aOFi%E)Jx~r*1XD5OTyQ~TkL!&j;Rwx( zn}h|}_sIjIX*2DHE!U*k!-AG__wqx!IB(mK?EUXTPAgl$U8PYw@D`a>JgB z&BG>P-&Ty}m@}P*GuMiv4M)2qh=S=d-KNK&9;1dsvrmW^&b_3$EsZ*-IS*+IZ~$k^ zD~PMW1B&T2>&$wy!SoqkY-*)}y(c>i>^ym!(SX=#c~jBeeye{$6ZT6Bz}~-l!zsAm%${m#_vWIVPp78h9?9&`)h z5(AX4-5`RbxLT94Gm|x0&m7ikQh`m5s}qI1KAcKt#vLT>N~fkXH6>k`F0h(IpUS59 z=QE|!xH_H9XLcVcW{w84c`b8zeQW}6U53T1duQdnW~Vg6lxDGpYdc9^$JP;lCqhk1 z&-U@MYx$rjRV+>)8Kf-RQ^i_cx{#mEu*K|&hf6j0;EruO#W*ZbTvqiOZnt%O-%QV%P91*^;EGBmuvC2<)6fC1OLF& zb?-);F1>^x$TqNvKCnTH>;$jm1fQsaDlUDY2^lxNq8ohB2wr@BlJka}cX(q7)d%to zS;P<^;%oa;w%b5ONw#$S{%%uk=>A_u#UxHR+RZ<;NBNAm6P(r4Ub`q8wh5(rzPT0hWXRMG<;qCCAbP)b7b}yL4vo2M&bKvF_eS;=a8u> zho&+t!=6An?qUmM^e=N#PZFFW-~`VTyucg7y~;d_Kk;qhJZ!GMAAS&mTWF4M4Wos$ z4mR7&S4U332>&p0AN*Mjv|I$=&B;g5Ebd?r@voNM?$XF7NboqfN0&pE-xlq(J&Z&I zs(YgEfa?{SJWnvfgR!nI>*gq|LJT?LEo6mKi9JcgQwVV*)e`>Wg8seudkeit-P&c6}-x;$ z8LJdEMrn~_G?1vfFC+yql8yLgVtj!oA4#^+Cm%2|K5JssbG9|ePQKrq^FNpGGGF$` zmzO6(hk`-Bpx>wWKb$_d{dVYz3J!Sw3$**Jz%ghxcwwNXhqu2{?kC^=XORRsuJwY7_a{P37q;su1u zkxHa0Jk3>|=F1>|DYvjiW7Co{CN9JACyyzf?isG`L~T7OJkvFuR_4_f9RI!ZlPmAdcT%xv8^Gh1F&UxiGH?)9f~r^Zi-PPT&7V{2|C>dIf~8EC|+nCq9fWUlGAKGTJ+H) zMPsxlU9s!NdSqvz#`^n8#De3Aj_copfMik(9djTCpGtvP^c?l5cU+ z|I*ogn{k1$#JI?K2amLE(@JFifS1~4VPEa9wiD3$9LM-J$Wg`^V;|17FT;NPyZtb% z)ed!Bhn9yyhcdEF@)ZoGAGeNjdMiWXczO#=Vlkc350mhxsC|oyUAKr*C+b`zwa(U3j4NR zjk7MV5vXgU@G}-Z$NO7Hp%W85lRI1%JjR=x=93SF_tu5R{@>?}eJlW-!1bQY-aV|G zWbn7D2TJ9s@=X3*px4s3)U_LVdH*qDChH?Bl(-FDCDF+x9V-= self.replace_threshold] = canonical_point[xyz_distances >= self.replace_threshold] - return canonical_point, world_point, world_point_iqr, replace_points + return canonical_point, world_point, world_point_iqr, replace_points, depth_avg pass @staticmethod diff --git a/scripts/__pycache__/handlandmarks_show_plot.cpython-38.pyc b/scripts/__pycache__/handlandmarks_show_plot.cpython-38.pyc index 144bbba148a99049676160f4b95a23aa914bb2fb..47b5c17cd550a72a50eabd3796e81f30f251a115 100644 GIT binary patch delta 986 zcmZXS%WKq76vpqplgG`SB+azbb{?${s?b8U3l+gdyKy6k8xdu!48xph%{&rK147ME zq1KHQDiIgzBC~fR-MVn2xD&yGOSkULEZ8qw@?K=CZA|lO2d(K z<3Y+$Dw3{(O6{un6wUEK1{~KG1HOWTONsXB;b5~IBfe+~C`@l-gX%cOb&TVLkHm-6 zj}Pf&dIHl1rj=nj{GpT=PWmSOf?o`zO}a_1lLrS~9&q3-w!^#+z{9dSofFMcAO~6? zfKDcVBfO!`oKHFhnSkS|Pi;&6fumDB=6t2jobA6em%0peDaTxU>dfW7E8lnRu*b<4 zHFx@!myJJjtzC1VQ}bGD72&vEr`ERD8xSt>@?u4+*BsZe>$SE=(Q7|r`1p--|67co z5ZA3IuGfY$b=UR4c4~gZ{`vRcKYN~rtGq+!!##d66xunVtu_3rZ~N^=ctQJmZ5bO7 zDsVBTQ;S)&z$U243RGfoRbVw)^5B=6@xp32C*IL|_(i;+OX1DzOS-cAD|??B6)tfa IuTi}J1C+w!xBvhE delta 908 zcmZWnO-mb56n*z)KHto|XpAvYgp^>Z^uvYy0O_KOLU&Rq#S#%Kxlxm7l1{Rc2`-9K zXa!+5EmD{)+C?{|_ygKa*ZmD$)%=Ab*gKgxCUhPH=iGPBdG}r3-{~LI^10&(M&I?{ z?>4_CzsVw>{X?|K7jYhnqUkoOIwVEUjwieR==UJwpkPIw*OtZR}mgl`iT!1XX|0QiisRU zRx?_kiRmG7zaV=S?pcA|We_4KMlwcLkVK_Rr}UL$sK$64HUF2ou&<-hXg%ew9N1;ah*X@Ku zQ!$-m9gUFQ(ZefLCp{Hu6bBqlzoO0TPi}G=jlc{7P92eQeUfwz>1a%mE>y$}M%e%E z47nw_wGsCvi`wmteNW9T=(FQib=p%s(-R0&QOj$3VXl9um+%bo zW{;F;_N3HDl%Mp%wWvKSR!LH6BdVTWcoL~(q&nuW4#Sr*pIdeEzwkwmw?zi&kSSf~cWbL9G?52IC@(nRJq7noK8SZOWt- z;!cFX6~SFb+~`ia5X6lemu?h=tX%jP+_~^fTDA9b?)lDlo^a3i_>Y8eI~WWQJR9|A zE8ik-1s4_KXa-T{QEI2yFn#2C-h!<=>=j+w5!)e~G(PqK1;HKtA}hC5R0^jux5Bqx4^iLXxMVEj@W=+ z=;Fg&On3G}siQG;)1n7LT?ax1#XmJXO^F%q&q6QD75d*RnHGNi0 z2{o})hTJ7Dz3bZ@skyE%mv`E&$+|Is z-=6i!nuayhj;ma#XMM(lN?}tsUlU`3O>r+kW1qNlDayGdkRVP)%0U2ly!+b6QOU(q z9{E8CcqH_WAm+fBVo84!LhPM?AvuAajP5gus3X)$YDLy^MY*DA1!KiozwT~g-rhA* zY&K90C!D;KP71Bo4AHT|Y&VdGS@tVX_f9!PikUr^VVZsDndzT#h>-LA@3_~NdH5tO Iv$OorALCERMgRZ+ delta 675 zcmYjP&1(}u6rVSnWIvMKY&M%Tjn&kTLTss_1ocw1A}T28p=dCdQrxupvS}vkN6RJ^ zaub!voV@LdmtKUT7e)UDkAfFHc=X^uAoykzwDXvGzxR8;eeW@|Kc>ItjN7`d5nNxs zKigQf4-APKSqydDmvQ$jUZ78+4@a1O<_JLQ>vE+9h) zpr883Oivigi}-mjYQi*7rPm zNGctY8jgCN^bIUC>yVa;;-{|SA9r-Y1QZBHC$O#U*^aS7+>=gn2rW8--dki$f!O;B z8A11Vg>(lI;+|@0$o&G+&j8uYy0VvXrcy&JRUvoD>sWVCA!mt$=|P4UBa2|YyAzoM z{ybWOIsQ5N(@xhr?b_N#qup+7Z3^$!824irxh`KZ^-XHkcB(RauvL4!?d}s+BHdf{zw2qw< z%95Ccc6ux+qBLKQUxG7y5Z{T-3!=>b#IL~uzmh2B7X@L7(4io=^>+rN2QowNV| diff --git a/scripts/handlandmarks_show_plot.py b/scripts/handlandmarks_show_plot.py index 31a443b..f321ad2 100644 --- a/scripts/handlandmarks_show_plot.py +++ b/scripts/handlandmarks_show_plot.py @@ -19,13 +19,13 @@ def __init__(self, queue_handpose, queue_points, num_points=21): self.fig = plt.figure() - self.ax = self.fig.add_subplot(231, projection='3d') + self.ax = self.fig.add_subplot(131, projection='3d') self.scatter = self.ax.scatter([], [], []) - self.ax_cp = self.fig.add_subplot(232, projection='3d') + self.ax_cp = self.fig.add_subplot(132, projection='3d') self.scatter_world_points = self.ax_cp.scatter([], [], []) - self.ax_wp = self.fig.add_subplot(233, projection='3d') + self.ax_wp = self.fig.add_subplot(133, projection='3d') self.scatter_canonical_points = self.ax_wp.scatter([], [], []) self.ani = FuncAnimation(self.fig, self.update_plot, frames=1, interval=10) @@ -40,7 +40,7 @@ def update_plot(self, frame): # if self.queue_handpose.full(): self.handpose = self.queue_handpose.get() self.hand_points = self.queue_points.get() - print(f"[Process-3D plot] handpose : {self.handpose}") + # print(f"[Process-3D plot] handpose : {self.handpose}") except Exception as e: return @@ -54,6 +54,7 @@ def update_plot(self, frame): self.ax_cp.cla() self.ax_wp.cla() + self.ax.set_title('normalized') self.ax.set_xlabel('X Label') self.ax.set_ylabel('Y Label') self.ax.set_zlabel('Z Label') @@ -61,19 +62,21 @@ def update_plot(self, frame): # self.ax.set_ylim(-1, 1) # self.ax.set_zlim(-1, 1) + self.ax_cp.set_title('canonical') self.ax_cp.set_xlabel('X Label') self.ax_cp.set_ylabel('Y Label') self.ax_cp.set_zlabel('Z Label') - self.ax_cp.set_xlim(-1000, 1000) - self.ax_cp.set_ylim(-1000, 1000) - self.ax_cp.set_zlim(0, 1000) + self.ax_cp.set_xlim(0, 640) + self.ax_cp.set_ylim(0, 480) + self.ax_cp.set_zlim(200, 700) + self.ax_wp.set_title('world coordinate') self.ax_wp.set_xlabel('X Label') self.ax_wp.set_ylabel('Y Label') self.ax_wp.set_zlabel('Z Label') - self.ax_wp.set_xlim(-1000, 1000) - self.ax_wp.set_ylim(-1000, 1000) - self.ax_wp.set_zlim(0, 1000) + self.ax_wp.set_xlim(-300, 300) + self.ax_wp.set_ylim(-300, 300) + self.ax_wp.set_zlim(200, 700) colors = ['black', 'blue', 'green', 'orange', 'red', 'black'] intervals = [4, 8, 12, 16, 20] diff --git a/scripts/handlandmarks_with_realsense.py b/scripts/handlandmarks_with_realsense.py index 37056ce..cb317f0 100644 --- a/scripts/handlandmarks_with_realsense.py +++ b/scripts/handlandmarks_with_realsense.py @@ -51,11 +51,13 @@ def handlandmarks_with_realsense(queue_handpose, queue_points, queue_handpose_su frameset = rs_main_camera.spatial_filter.process(frameset) frameset = rs_main_camera.temporal_filter.process(frameset) frameset = rs_main_camera.disparity_to_depth.process(frameset) - frameset = rs_main_camera.hole_filling_filter.process(frameset).as_frameset() + # frameset = rs_main_camera.hole_filling_filter.process(frameset) + frameset = frameset.as_frameset() # It is recommended to use a copy of the RGB image frame. img_color = np.copy(frame_to_np_array(frameset.get_color_frame())) img_depth = np.copy(frame_to_np_array(frameset.get_depth_frame())) + img_depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(img_depth, alpha=0.3), cv2.COLORMAP_JET) hld.hand_detection(img_color, img_depth, rs_main_camera.depth_intrinsics) @@ -74,10 +76,13 @@ def handlandmarks_with_realsense(queue_handpose, queue_points, queue_handpose_su # queue_points_sub.put(hld.canonical_points) count += 1 + # all_img = np.hstack([hld.drawing_image, img_color, img_depth_colormap]) + all_img = np.hstack([hld.drawing_image, hld.drawing_depth_image]) # use opencv to visualize results. if hld.drawing_image is not None: - cv2.imshow('RealSense_front', hld.drawing_image) + # cv2.imshow('RealSense_front', hld.drawing_image) + cv2.imshow('RealSense_front', all_img) key = cv2.pollKey() if key & 0xFF == ord('q') or key == 27: From 4a1f62e5379e2b124340b67d3d01293d5a520c28 Mon Sep 17 00:00:00 2001 From: Bigyuun Date: Mon, 15 Jul 2024 13:06:50 +0900 Subject: [PATCH 11/11] update --- .../__pycache__/realsense_api.cpython-38.pyc | Bin 7476 -> 7766 bytes .../realsense_api/realsense_api.py | 16 ++++++++++++++-- .../__pycache__/handlandmarks.cpython-38.pyc | Bin 10575 -> 10575 bytes .../handlandmarks/handlandmarks.py | 2 +- ...andlandmarks_with_realsense.cpython-38.pyc | Bin 3296 -> 3331 bytes scripts/handlandmarks_with_realsense.py | 2 +- 6 files changed, 16 insertions(+), 4 deletions(-) diff --git a/common/RealSense_Utilities/realsense_api/__pycache__/realsense_api.cpython-38.pyc b/common/RealSense_Utilities/realsense_api/__pycache__/realsense_api.cpython-38.pyc index 1d71b3afa1c101fcbf43f9bcc80da0bd0422b23a..e520e1d583159037d96e6d50de1bf57c5bb2fffb 100644 GIT binary patch delta 703 zcmYjNO=}ZT6n%F-l9@?n^3gP!^uuZk8W*(|T5G8ysC6M0wMy&L5@O$LiOwYH%pf+T zc9Gy-N2*q(4R$Glj4OYLi)=(U;z9~;gyO5k?zbZ3 zy)(HTL&hJBVVuWsHoe{4;q`{F9cdG11UbsYHUM!ICN<##S-7(%)-#w_8xZ8@2#}SH zIkGY#5m&pf*-wG2NkHmDZj8wd=@ns-hKLw_BR7LN@ok+c`<-LBqc!P~G*50}|2zgG zv!tNTOzgqYJveg19>XWqyKdXOWIDX!@M5V}9!%dmJkZ zhIc4Gdaa|Cog%N4?wXu+GH!Kw*~CWnpj27ptY}pkx4W^rqngzcE8cUem5zGx;UcfO zar*oEMHdj>c(kw`Xu@ToDyn$!JMjZ*cx-mz9Ja_yw3Q9I)S^ R@=o^th#W+r2ws0*_AhrXqyhi{ delta 395 zcmW+xze~eV5Pp}Jq-oNmNo=dNsoHjsI5-GJ5eGr6gD7Yz$c^$8hs2@&0fGi+M3c!3kkPi%4;w`&L zB^~&iU5Q`qGQcfbUuhHl$V!_0SG$gY~%{yX1uvMn){0^0B89K1ONa4 delta 26 gcmX>fbUuhHl$V!_0SL}iZsZE!W<0q$n){0^0BLCm6#xJL diff --git a/common/mediapipe_api/handlandmarks/handlandmarks.py b/common/mediapipe_api/handlandmarks/handlandmarks.py index bf6f5e9..e1e23a3 100644 --- a/common/mediapipe_api/handlandmarks/handlandmarks.py +++ b/common/mediapipe_api/handlandmarks/handlandmarks.py @@ -67,7 +67,7 @@ def hand_detection(self, color_frame, depth_frame, depth_intrinsic=None): # self.color_image = cv2.flip(self.color_image, 1) self.color_image = cv2.cvtColor(self.color_image, cv2.COLOR_BGR2RGB) self.depth_image = depth_frame - self.depth_image_colormap = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image, alpha=0.2), cv2.COLORMAP_JET) + self.depth_image_colormap = cv2.applyColorMap(cv2.convertScaleAbs(self.depth_image, alpha=0.4), cv2.COLORMAP_JET) # To improve performance, optionally mark the image as not writeable to # pass by reference. diff --git a/scripts/__pycache__/handlandmarks_with_realsense.cpython-38.pyc b/scripts/__pycache__/handlandmarks_with_realsense.cpython-38.pyc index 3123b1dfcd6f972809b0b6c25af3140dd92814a6..820140a5d7cd2ffd65ada7b6e0c785a791ac8456 100644 GIT binary patch delta 378 zcmaDL*(}8y%FD~e00cpOQ_`+%EQ$iM6lz$q6c;iAWf|+i93?P^391xK z1C_SaFd->rMpDU_!fDP>%LjCpGSDa$AXZIh0yi46z!q6afc@5{(qWX2xu$35><^w}3)IAZF2naE1v?g)-p`g>@_pC7Rh>6PSu5 zHnXtoU}V&qyqEQfh;T-JPHKEwW=>9KUOI>_NiEvEfNd2MW8P$MP8()M9>&cboDs|b D_oQps delta 343 zcmZpcdLYRg%FD~e00d=~Q_`+&