import cv2 import numpy as np from typing import List, Tuple, Dict, Any def process_earthwork(frame: np.ndarray) -> Tuple[List[Dict[str, Any]], np.ndarray]: """ Detect earthwork activity in the frame. Args: frame: Input frame as a numpy array. Returns: Tuple of (list of detections, annotated frame). """ # Convert to grayscale gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Apply edge detection edges = cv2.Canny(gray, 100, 200) # Find contours contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) detections = [] for i, contour in enumerate(contours): area = cv2.contourArea(contour) if area < 500: # Ignore small contours continue x, y, w, h = cv2.boundingRect(contour) x_min, y_min, x_max, y_max = x, y, x + w, y + h detections.append({ "box": [x_min, y_min, x_max, y_max], "label": f"Earthwork {i+1}", "type": "earthwork" }) return detections, frame