From bee2dfa944b4ba86c2d9dc4893b97841f4ddbd26 Mon Sep 17 00:00:00 2001 From: Arkadiy Strelnikov Date: Mon, 29 Nov 2021 14:28:49 +0700 Subject: [PATCH] Arguments parser in hpe_json.py --- README.md | 37 ++-- hierarchy_data.json | 434 ++++++++++++++++++++++++++++++++++++++++++++ hpe_json.py | 89 +++++++++ 3 files changed, 540 insertions(+), 20 deletions(-) create mode 100644 hierarchy_data.json create mode 100644 hpe_json.py diff --git a/README.md b/README.md index 1a3817d..48804bb 100644 --- a/README.md +++ b/README.md @@ -2,28 +2,28 @@ ## Запуск -Для вебкамеры, где 0 - индекс самой вебкамеры, если отличается, то следует заменить на нужный. +Для тестового запуска через вебкамеру с индексом 0. ```console -python3 hpe_videocapture.py 0 scale_pose +python3 hpe_json.py --address_input 0 --show_image True ``` -Для чтения из файла +Скрипт принимает следующие аргументы: + +* '--address_input' (type=str, default="0"): путь к файлу или индекс вебкамеры +* '--scale_pose' (type=float, default=0.42): ширина плеч в метрической системе +* '--crop_image' (type=float, default=1.0): коэффициент, если нужно изменить размер изображения +* '--osc_address' (type=str, default="0.0.0.0"): ip-адрес для osc клиента +* '--osc_port' (type=int, default="5005"): порт для osc клиента +* '--osc_message_address' (type=str, default="/pose/0"): адрес для вывода сообщения через osc клиент +* '--output_method' (type=str, default='file', choices=['file', 'osc']): тип вывода через файл или osc клиент +* '--mirror_image' (type=bool, default=True): горизнтальное отображение выходного изображения +* '--show_image' (type=bool, default=False): вывод выходного изображения через opencv + +Для теста с matplotlib нужно запустить скрипт (пример с вебкамерой с индексом 0): ```console -python3 hpe_videocapture.py path_to_video scale_pose +python3 hpe_videocapture.py 0 ``` -Параметр scale_pose - ширина плеч. По умолчанию равен 0,42. - -Есть экспериментальная версия для взаимодействия с ffmpeg и osc: -```console -python3 hpe_ffmpeg.py -``` -Внутри кода записаны параметры для osc соединения: -* osc_address = "10.199.0.14" -* osc_port = 5005 - -Предполагается вывести выше указанные параметры либо в аргументы, либо в конфиг-файл. - ## Зависимости Библиотеки python: @@ -32,7 +32,7 @@ python3 hpe_ffmpeg.py * matplotlib (можно сделать опциональной) * opencv-python * json -* python-osc (в файле hpe_ffmpeg.py) +* python-osc Библиотека mediapipe требует cudatoolkit и cudnn для работы с gpu. @@ -76,6 +76,3 @@ python3 hpe_ffmpeg.py * hol_smooth_landmarks = True * hol_min_detection_confidence = 0.7 * hol_min_tracking_confidence = 0.5 - -Физические параметры человека (ширина плеч в метрах): -* scale_pose = 0,42 diff --git a/hierarchy_data.json b/hierarchy_data.json new file mode 100644 index 0000000..d715af4 --- /dev/null +++ b/hierarchy_data.json @@ -0,0 +1,434 @@ +{ + "hip_r": { + "visible": 3.283990008640103e-05, + "translation": { + "x": 0.23185212236810918, + "y": 0.00371596784027843, + "z": -1.3490804656954876 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "hip_l": { + "visible": 3.066848512389697e-05, + "translation": { + "x": 0.49386722361764196, + "y": -0.004551878615287206, + "z": -1.3717949211023943 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "root": { + "visible": 1.0, + "translation": { + "x": 0.32104200438618696, + "y": -2.4274882656989587, + "z": 1.2036544053764062 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "pelvis": { + "visible": 3.1754192605149e-05, + "translation": { + "x": 0.32104200438618696, + "y": 0.00036978822761340243, + "z": 1.2036544053764062 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "head": { + "visible": 1.0, + "translation": { + "x": 0.4018470055921379, + "y": 1.4863796147074047, + "z": -0.49572140460617947 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "spine_01": { + "visible": 0.9558884007726984, + "translation": { + "x": 0.3523824967200987, + "y": 1.2570843949458836, + "z": -0.3722668270030201 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "spine_02": { + "visible": 0.8642053121876015, + "translation": { + "x": 0.3458276216245312, + "y": 1.136539767039317, + "z": -0.23441402075809645 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "spine_03": { + "visible": 0.7177959614459576, + "translation": { + "x": 0.335360096787125, + "y": 0.9440412269098308, + "z": -0.014275932352623016 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "spine_04": { + "visible": 0.5484203400028553, + "translation": { + "x": 0.323250600260258, + "y": 0.7213467084507186, + "z": 0.24039376830583514 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "spine_05": { + "visible": 0.2289994832763534, + "translation": { + "x": 0.3004136316210739, + "y": 0.30137320064339257, + "z": 0.7206683985833275 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "knee_r": { + "visible": 0.021311474964022636, + "translation": { + "x": 0.224715555879875, + "y": 0.04331640486588048, + "z": -1.848822215632786 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "knee_l": { + "visible": 0.01792996935546398, + "translation": { + "x": 0.479653365369021, + "y": 0.04956380758879055, + "z": -1.8599454030851834 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "ankle_r": { + "visible": 0.004003077745437622, + "translation": { + "x": 0.22040579799855411, + "y": -0.6035946591415875, + "z": -2.2528606986185435 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "ankle_l": { + "visible": 0.005025549326092005, + "translation": { + "x": 0.46486163125941043, + "y": -0.49356652566551906, + "z": -2.266784775168302 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "ball_r": { + "visible": 0.0033030910417437553, + "translation": { + "x": 0.2533501274660685, + "y": -0.2277205314512301, + "z": -2.4257652906916354 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "ball_l": { + "visible": 0.007918210700154305, + "translation": { + "x": 0.4167605323921076, + "y": -0.07112429439358949, + "z": -2.4274882656989587 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "heel_r": { + "visible": 0.003357355482876301, + "translation": { + "x": 0.214153237082301, + "y": -0.6405563543831717, + "z": -2.3297296844741737 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "heel_l": { + "visible": 0.009946711361408234, + "translation": { + "x": 0.4684025052154504, + "y": -0.5260255564826632, + "z": -2.3472397765876565 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "shoulder_r": { + "visible": 0.9999551773071289, + "translation": { + "x": 0.18561357625361946, + "y": 0.7721517346988932, + "z": -0.69730114825041 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "shoulder_l": { + "visible": 0.9999798536300659, + "translation": { + "x": 0.60345881243435, + "y": 0.7539580847363371, + "z": -0.7356984098989899 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "clavicle_r": { + "visible": 0.3903829998635262, + "translation": { + "x": 0.29915971923785645, + "y": 0.6344740294859538, + "z": 0.30770636512969557 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "clavicle_l": { + "visible": 0.45094530122838333, + "translation": { + "x": 0.3989762273134593, + "y": 0.6323009442726204, + "z": 0.3072717480870289 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "elbow_r": { + "visible": 0.3276873528957367, + "translation": { + "x": 0.09727160822155982, + "y": 0.6303470208087711, + "z": -1.0638687217845344 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + "elbow_l": { + "visible": 0.3048570454120636, + "translation": { + "x": 0.6504693670538582, + "y": 0.5472289809491672, + "z": -1.1147813886926048 + }, + "rotation": { + "rotx": 0, + "roty": 0, + "rotz": 0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + } +} \ No newline at end of file diff --git a/hpe_json.py b/hpe_json.py new file mode 100644 index 0000000..0e859a4 --- /dev/null +++ b/hpe_json.py @@ -0,0 +1,89 @@ +import cv2 +import time +from hpe_mp_class import hpe_mp_class +import json +import argparse +from pythonosc import udp_client + +# Arguments +parser = argparse.ArgumentParser() +parser.add_argument('--address_input', type=str, default="0", help='input video path or webcam index') +parser.add_argument('--scale_pose', type=float, default=0.42, help='shoulder width') +parser.add_argument('--crop_image', type=float, default=1.0, help='coefficient of image cropping') +parser.add_argument('--osc_address', type=str, default="0.0.0.0", help='osc_address') +parser.add_argument('--osc_port', type=int, default="5005", help='port') +parser.add_argument('--osc_message_address', type=str, default="/pose/0", help='osc address for message in send_message function') +parser.add_argument('--output_method', type=str, default='file', choices=['file', 'osc'], help='type os output data method') +parser.add_argument('--mirror_image', type=bool, default=True, help='horizontal image mirroring just for show') +parser.add_argument('--show_image', type=bool, default=False, help='show image in opencv interface') +args = parser.parse_args() +address_input = args.address_input +for i in range(0, 100): + if address_input == str(i): + address_input = i +scale_pose = args.scale_pose +osc_address = args.osc_address +osc_port = args.osc_port +osc_message_address = args.osc_message_address +output_method = args.output_method +crop = args.crop_image +mirror_image = args.mirror_image +show_image = args.show_image + +# OSC client +client = udp_client.SimpleUDPClient(osc_address, osc_port) + +# Videocapture +cap = cv2.VideoCapture(address_input) + +# Preprocessing parameters +frame_width = int(crop*cap.get(cv2.CAP_PROP_FRAME_WIDTH)) +frame_height = int(crop*cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) + +# FPS variables +pTime = 0 +cTime = 0 + +# Mediapie class +mp_cl = hpe_mp_class() + +while True: + # Reading frame + success, img = cap.read() + + # Image preprocessing + if crop != 1.0: + img = cv2.resize(img, (frame_width, frame_height)) + + # Mediapipe + mp_cl.process(img, scale_pose=scale_pose) + mp_cl.show(img) + + # FPS + cTime = time.time() + fps = 1. / (cTime - pTime) + pTime = cTime + + # Showing + if show_image: + if mirror_image: + img = cv2.flip(img, 1) # mirror + cv2.putText(img, str(int(fps)), (22, 32), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 0), 2) + cv2.putText(img, str(int(fps)), (20, 30), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2) + cv2.imshow("Main", img) + + # Output + if output_method == 'file': + # JSON + res = mp_cl.getJSON() + with open('hierarchy_data.json', 'w', encoding='utf-8') as f: + json.dump(res, f, ensure_ascii=False, indent=4) + else: + # OSC + res = mp_cl.getJSON() + client.send_message(osc_message_address, res) + + # Interface + key = cv2.waitKey(1) + if key == 27: + break