criado repositório jhonny-editor no Gitea adicionado script admin/deploy.command com commit automático atualizado admin/DEV-NOTES.md com template limpo Resumo: - 48 arquivos alterados - 26 novos - 19 modificados - 3 removidos 22 files changed, 658 insertions(+), 568 deletions(-) Arquivos: - AGENTS.md - admin/DEV-NOTES.md - admin/OpenCut.command - admin/commit.command - admin/deploy.command - admin/update.command - code/cep-plugin/index.html - code/cep-plugin/main.js - code/cep-plugin/styles.css - code/engine/ARQUITETURA.md - code/engine/arquitetura/README.md - code/engine/gerar_relatorio_timeline.py - code/engine/integracoes/apple_speech/apple_speech_transcriber.swift - code/engine/integracoes/apple_speech/provider_de_transcricao_apple.py - code/engine/integracoes/midia/__init__.py - code/engine/integracoes/whisper/provider_de_transcricao_local.py - code/engine/scanner/__init__.py - code/engine/scanner/coordenacao/__init__.py - code/engine/scanner/descoberta/__init__.py - code/engine/scanner/modelos.py - code/engine/scanner/transcricao_da_timeline.py - code/src/tools/discovery.ts - :memory:.ses - admin/Jhonny.command - admin/inativos/OpenCut.command - admin/inativos/update.command - code/docs/glossario-analise-emocional.md - code/docs/levantamento-apple-vision-e-apple-intelligence.md - code/docs/levantamento-ferramentas-analise-visual-local.md - code/engine/arquitetura/biblioteca-inteligente-de-videos.md - code/engine/executar_scanner.py - code/engine/integracoes/huggingface/ - code/engine/integracoes/midia/extracao_de_metadados.py - code/engine/integracoes/visual/ - code/engine/requirements-visual.txt - code/engine/scanner/configuracao_visual.py - code/engine/scanner/descoberta/descoberta_de_arquivos.py - code/engine/scanner/metadados.py - code/engine/scanner/relatorio_visual.py - code/engine/scanner/retakes/ - code/engine/scanner/visual.py - code/engine/testes/test_analise_visual_local.py - code/engine/testes/test_arquivos_e_metadados.py - code/engine/testes/test_provider_de_transcricao_apple.py - code/relatorios/analise-brools/ - code/relatorios/analise-visual/ - code/relatorios/audio/arquivos/ - code/relatorios/transcricao-timeline.md
48 lines
2.0 KiB
Python
48 lines
2.0 KiB
Python
"""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
|