"""Executável interno isolado para evitar que falhas nativas do MediaPipe derrubem o Scanner.""" import json import sys from pathlib import Path def _pontos(landmarks, visibilidade: bool = False): return [{"x": ponto.x, "y": ponto.y, "z": ponto.z, **({"visibilidade": getattr(ponto, "visibility", None)} if visibilidade else {})} for ponto in landmarks] def executar(carga: dict) -> list[dict]: import cv2 import mediapipe as mp imagem_bgr = cv2.imread(carga["frame"]) if imagem_bgr is None: raise FileNotFoundError(f"Frame não encontrado: {carga['frame']}") imagem = mp.Image(image_format=mp.ImageFormat.SRGB, data=imagem_bgr[:, :, ::-1]) resultado: list[dict] = [] if carga.get("pose"): opcoes = mp.tasks.vision.PoseLandmarkerOptions( base_options=mp.tasks.BaseOptions(model_asset_path=carga["pose"], delegate=mp.tasks.BaseOptions.Delegate.CPU), running_mode=mp.tasks.vision.RunningMode.IMAGE, ) with mp.tasks.vision.PoseLandmarker.create_from_options(opcoes) as detector: for pose in detector.detect(imagem).pose_landmarks: resultado.append({"tipo": "pose", "valor": {"pontos": _pontos(pose, visibilidade=True)}}) if carga.get("maos"): opcoes = mp.tasks.vision.HandLandmarkerOptions( base_options=mp.tasks.BaseOptions(model_asset_path=carga["maos"], delegate=mp.tasks.BaseOptions.Delegate.CPU), running_mode=mp.tasks.vision.RunningMode.IMAGE, num_hands=4, ) with mp.tasks.vision.HandLandmarker.create_from_options(opcoes) as detector: for mao in detector.detect(imagem).hand_landmarks: resultado.append({"tipo": "mao", "valor": {"pontos": _pontos(mao)}}) return resultado if __name__ == "__main__": try: print(json.dumps(executar(json.loads(sys.stdin.read())))) except Exception as erro: print(str(erro), file=sys.stderr) raise