import requests
import cv2
import numpy as np
from PIL import Image
import json
def ar_parse_request(image_path: str):
url = "http://localhost:8080/parse"
with open(image_path, 'rb') as f:
files = {'image': f}
response = requests.post(url, files=files)
if response.status_code == 200:
result = response.json()
masks = result['masks']
labels = result['labels']
colors = result['colors']
width = result['width']
height = result['height']
return {
'segmentation_map': decode_masks(masks, labels, colors, width, height),
'body_parts': extract_key_joints(labels, masks)
}
else:
raise Exception(f"Request failed: {response.text}")
def decode_masks(masks_b64, labels, colors, w, h):
"""Decode base64 masks into a single colored segmentation image"""
seg_image = np.zeros((h, w, 3), dtype=np.uint8)
import base64
from io import BytesIO
for mask_b64, (r, g, b) in zip(masks_b64, colors):
img_data = base64.b64decode(mask_b64.split(',')[1])
mask_img = Image.open(BytesIO(img_data)).convert('L')
mask = np.array(mask_img) > 128
seg_image[mask] = [b, g, r]
return seg_image
def extract_key_joints(labels, masks_b64):
"""Extract approximate positions of head, hands, feet"""
joints = {}
for label, mask_b64 in zip(labels, masks_b64):
if 'head' in label or 'face' in label:
pos = get_centroid_from_mask(mask_b64)
joints['head'] = pos
elif 'hand' in label:
pos = get_centroid_from_mask(mask_b64)
joints['hand_' + label.split('_')[0]] = pos
return joints
def get_centroid_from_mask(mask_b64):
import base64
from io import BytesIO
from PIL import Image
img_data = base64.b64decode(mask_b64.split(',')[1])
mask_img = Image.open(BytesIO(img_data)).convert('L')
mask = np.array(mask_img) > 128
moments = cv2.moments(mask.astype(np.uint8))
if moments['m00'] != 0:
cx = int(moments['m10'] / moments['m00'])
cy = int(moments['m01'] / moments['m00'])
return (cx, cy)
return None