import cv2 from ultralytics import YOLO import os import time import requests # <--- ADICIONADO: Necessário para falar com a API # --- REMOVIDO: from inteligencia import ... # Não importamos mais a inteligência aqui, pois ela roda no servidor (api.py) # Cria pastas para organizar os.makedirs('resultados/recortes', exist_ok=True) print("Carregando modelo YOLO (Visão)... aguarde.") model = YOLO('yolov8m.pt') print('Modelo carregado com sucesso!') def read_image(): cap = cv2.VideoCapture(0) cap.set(3, 1280) cap.set(4, 720) print('\n--- SISTEMA CLIENTE INICIADO ---') print('📷 Aponte para o produto.') print('📡 O processamento será feito pela API.') print('🔘 Pressione "ESPAÇO" para enviar.') print('❌ Pressione "q" para SAIR.\n') while True: success, frame = cap.read() if not success: print('Falha ao capturar imagem.') break # Faz a detecção results = model.predict(frame, conf=0.5, verbose=False) frame_anotado = frame.copy() recorte_atual = None # Loop por cada detecção for box in results[0].boxes: classe_id = int(box.cls[0]) name = model.names[classe_id] # Filtro de pessoas if name == 'person': continue confianca = float(box.conf[0]) if confianca > 0.6: x1, y1, x2, y2 = map(int, box.xyxy[0]) # Desenha o retângulo cv2.rectangle(frame_anotado, (x1, y1), (x2, y2), (0, 255, 0), 2) texto = f"{name.upper()} {confianca:.2f}" cv2.putText(frame_anotado, texto, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # Prepara o recorte com limites seguros h, w, _ = frame.shape x1, y1 = max(0, x1), max(0, y1) x2, y2 = min(w, x2), min(h, y2) recorte_atual = frame[y1:y2, x1:x2] cv2.putText(frame_anotado, "PRODUTO DETECTADO! (Espaco para Enviar)", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2) cv2.imshow("Camera Cliente", frame_anotado) key = cv2.waitKey(1) if key == ord('q'): break elif key == 32: # ESPAÇO if recorte_atual is not None: # Salva temporariamente para envio nome_arquivo = "temp_envio.jpg" cv2.imwrite(nome_arquivo, recorte_atual) print("📡 Enviando imagem para a API...") try: url = "http://127.0.0.1:8000/analisar" # CORREÇÃO DO ARQUIVO ABERTO: # Usamos 'with open' para garantir que o arquivo feche após o envio with open(nome_arquivo, 'rb') as f: arquivos = {'arquivo': f} resposta = requests.post(url, files=arquivos) # Agora o arquivo já está fechado, o código pode continuar if resposta.status_code == 200: dados = resposta.json() # Verifica se dados não veio vazio if dados: print("\n" + "="*40) print(f"📖 Texto Lido: {dados.get('texto_lido')}") print(f"🤖 Análise IA: {dados.get('analise_ia')}") print("="*40 + "\n") else: print("⚠️ A API retornou dados vazios.") else: print(f"❌ Erro na API: {resposta.status_code}") except Exception as e: print(f"❌ Erro: {e}") # Agora sim pode deletar, pois o 'with open' já fechou o arquivo if os.path.exists(nome_arquivo): try: os.remove(nome_arquivo) except: pass # Se não der pra deletar, tudo bem, ele sobrescreve na próxima else: print("⚠️ Nada detectado para enviar.") cap.release() cv2.destroyAllWindows() # Limpa o arquivo temporário ao sair, se existir if os.path.exists("temp_envio.jpg"): os.remove("temp_envio.jpg") print("Programa encerrado.") if __name__ == "__main__": read_image()