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()