def process_video()

in data-analytics/minigolf-demo/helper.py [0:0]


def process_video(file):
    """Processes a video, tracking the ball's movement and printing relevant data."""
    cap = cv2.VideoCapture(file)
    tracker = cv2.legacy.TrackerCSRT_create()  # Create a CSRT tracker

    ret, frame = cap.read()  # Read the first frame
    tracker.init(frame, BALL)  # Initialize the tracker with the ball's ROI

    shot_data = []  # List to store shot data
    frame_number = 0
    num_shots = 0

    # Initialize deques to store recent distances and movement statuses
    dist_history = deque(maxlen=30)
    status_history = deque(maxlen=30)

    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        
        success, bbox = tracker.update(frame)

        if success:
            frame_number += 1
            x, y, w, h = bbox
            center_x, center_y = int(x + w // 2), int(y + h // 2)

            # Draw ROIs for the ball and hole
            cv2.rectangle(frame, (int(x), int(y)), (int(x + w), int(y + h)), (0, 0, 255), 2)
            cv2.rectangle(frame, (HOLE[0], HOLE[1]), (HOLE[0] + HOLE[2], HOLE[1] + HOLE[3]), (0, 0, 255), 2)
            distance = calculate_distance(center_x, center_y)
            is_moving = check_if_moving(dist_history, distance)
            dist_history.append(distance)

            # Detect new shots based on movement
            if not any(status_history) and is_moving:
                num_shots += 1
                shot_data.append({
                    "user_id": "test",
                    "shot_number": num_shots,
                    "frame_number": frame_number,
                    "distance": f"{distance:.2f}"
                })

            status_history.append(is_moving)
            
            # Print tracking data for the current frame
            print({
                "user_id": "test",
                "frame_number": frame_number,
                "x": int(center_x),
                "y": int(center_y),
                "distance": f"{distance:.2f}",
                "is_moving": is_moving,
                "shot_number": num_shots,
            })
            cv2.imshow("Tracking", frame)
            if cv2.waitKey(1) == ord('q'):
                break

    print(shot_data)  # Print shot data at the end

    cap.release()
    cv2.destroyAllWindows()