Spaces:
Sleeping
Sleeping
| import cv2 | |
| import tempfile | |
| import os | |
| import time | |
| import base64 | |
| from langchain_core.messages import HumanMessage | |
| from langchain_google_genai import ChatGoogleGenerativeAI | |
| os.environ["GOOGLE_API_KEY"] = "SUA_CHAVE_GEMINI_AQUI" # Ajuste essa chave | |
| gemini_model = ChatGoogleGenerativeAI(model="gemini-2.0-flash") | |
| FRAME_FOLDER = "full_frames" | |
| os.makedirs(FRAME_FOLDER, exist_ok=True) | |
| def parse_irregularity(observation): | |
| detected_irregularities = [] | |
| lines = observation.split("\n") | |
| for line in lines: | |
| parts = line.split("|") | |
| if len(parts) >= 4: | |
| tipo = parts[1].strip() | |
| observado = parts[2].strip().lower() | |
| descricao = parts[3].strip() or "Não especificado" | |
| if observado == "yes": | |
| detected_irregularities.append({"tipo": tipo, "descricao": descricao}) | |
| return detected_irregularities | |
| async def processar_video(video_file): | |
| temp_path = tempfile.mktemp(suffix=".mp4") | |
| with open(temp_path, "wb") as f: | |
| f.write(video_file.file.read()) | |
| cap = cv2.VideoCapture(temp_path) | |
| total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) | |
| fps = cap.get(cv2.CAP_PROP_FPS) | |
| duration = total_frames / fps | |
| SEND_INTERVAL = 1.5 if duration <= 30 else (2 if duration <= 180 else 4) | |
| irregularidades = [] | |
| def analyze_with_gemini(image_path): | |
| with open(image_path, "rb") as img_file: | |
| base64_image = base64.b64encode(img_file.read()).decode("utf-8") | |
| message = HumanMessage(content=[ | |
| {"type": "text", "text": "Analyze this football play image using FIFA Laws..."}, | |
| {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}} | |
| ]) | |
| response = gemini_model.invoke([message]) | |
| return parse_irregularity(response.content.strip()) | |
| frame_count, last_sent_time = 0, 0 | |
| while cap.isOpened(): | |
| ret, frame = cap.read() | |
| if not ret: | |
| break | |
| frame = cv2.resize(frame, (640, 360)) | |
| if time.time() - last_sent_time >= SEND_INTERVAL: | |
| last_sent_time = time.time() | |
| frame_path = os.path.join(FRAME_FOLDER, f"frame_{time.strftime('%Y-%m-%d_%H-%M-%S')}.jpg") | |
| cv2.imwrite(frame_path, frame) | |
| irregularidades.extend(analyze_with_gemini(frame_path)) | |
| cap.release() | |
| os.remove(temp_path) | |
| return irregularidades | |