File size: 1,963 Bytes
09ebca6
1a64f28
774dccf
1a64f28
 
68ee00e
 
1a64f28
4ff5df1
774dccf
1a64f28
 
 
 
 
 
 
 
774dccf
 
 
 
 
 
 
68ee00e
774dccf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1a64f28
 
774dccf
 
 
09ebca6
 
1a64f28
 
 
4ff5df1
1a64f28
03ea674
 
 
 
09ebca6
1a64f28
4ff5df1
1a64f28
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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