tech_challenge_fase_4_backend / app /video_processor.py
CLMARRARA's picture
tratamento do cv2.destroyAllWindows() para local (no HF funciona)
03ea674
import gc
import os
from app.llm import load_yolo
import cv2
from app.config import FRAME_SKIP_YOLO, FRAME_OUTPUT_PATH
from app.logger import log
def extract_motion_and_frame(video_path, logger=None):
yolo_model = load_yolo()
cap = cv2.VideoCapture(video_path)
prev_center = None
movements = []
saved_frame = None
frame_count = 0
try:
log(f"Abrindo vídeo: {video_path}", level="info", logger=logger)
while True:
ret, frame = cap.read()
if not ret:
break
if frame_count % FRAME_SKIP_YOLO != 0:
frame_count += 1
continue
results = yolo_model(
frame,
imgsz=640,
conf=0.4,
max_det=50,
verbose=False)
for r in results:
for box in r.boxes:
if int(box.cls[0]) == 0:
x1, y1, x2, y2 = box.xyxy[0].tolist()
center = ((x1 + x2) / 2, (y1 + y2) / 2)
if prev_center:
dist = ((center[0]-prev_center[0])**2 + (center[1]-prev_center[1])**2) ** 0.5
movements.append(dist)
prev_center = center
saved_frame = frame
frame_count += 1
finally:
log("Liberando recursos do vídeo", level="info", logger=logger)
cap.release()
del yolo_model
gc.collect()
if saved_frame is not None:
cv2.imwrite(FRAME_OUTPUT_PATH, saved_frame)
log(f"Frame salvo para análise de emoção: {FRAME_OUTPUT_PATH}", level="info", logger=logger)
try:
cv2.destroyAllWindows()
except:
pass
motion = sum(movements)/len(movements) if movements else 0
log(f"Movimento médio: {motion}", level="info", logger=logger)
return motion