# File: processing.pyx # cython: language_level=3, boundscheck=False, wraparound=False, nonecheck=False, cdivision=True import numpy as np cimport numpy as np import pandas as pd cimport pandas as pd from libc.math cimport isnan from cpython.mem cimport PyMem_Malloc, PyMem_Free # Define C types for better performance ctypedef np.float32_t DTYPE_t ctypedef np.int32_t ITYPE_t def process_bbox_depth_cy(np.ndarray[DTYPE_t, ndim=2] depth_map, int y_min, int y_max, int x_min, int x_max): """ Optimized bbox depth calculations using Cython """ cdef: int i, j, count = 0 double sum_val = 0.0 double mean_val = 0.0 np.ndarray[DTYPE_t, ndim=1] flat_vals int flat_size = 0 for i in range(y_min, y_max): for j in range(x_min, x_max): if not isnan(depth_map[i, j]): sum_val += depth_map[i, j] count += 1 if count > 0: mean_val = sum_val / count # Create array for trimmed mean calculation flat_vals = np.zeros(count, dtype=np.float32) flat_size = 0 for i in range(y_min, y_max): for j in range(x_min, x_max): if not isnan(depth_map[i, j]): flat_vals[flat_size] = depth_map[i, j] flat_size += 1 return mean_val, np.median(flat_vals), np.percentile(flat_vals, [20, 80]) def handle_overlaps_cy(np.ndarray[DTYPE_t, ndim=2] depth_map, np.ndarray[ITYPE_t, ndim=2] boxes): """ Optimized overlap handling using Cython """ cdef: int n_boxes = boxes.shape[0] int i, j int y_min1, y_max1, x_min1, x_max1 int y_min2, y_max2, x_min2, x_max2 double area1, area2, area_intersection bint* to_remove = PyMem_Malloc(n_boxes * sizeof(bint)) if not to_remove: raise MemoryError() try: for i in range(n_boxes): to_remove[i] = False for i in range(n_boxes): if to_remove[i]: continue y_min1, x_min1, y_max1, x_max1 = boxes[i] for j in range(i + 1, n_boxes): if to_remove[j]: continue y_min2, x_min2, y_max2, x_max2 = boxes[j] # Calculate intersection y_min_int = max(y_min1, y_min2) y_max_int = min(y_max1, y_max2) x_min_int = max(x_min1, x_min2) x_max_int = min(x_max1, x_max2) if y_min_int < y_max_int and x_min_int < x_max_int: area1 = (y_max1 - y_min1) * (x_max1 - x_min1) area2 = (y_max2 - y_min2) * (x_max2 - x_min2) area_intersection = (y_max_int - y_min_int) * (x_max_int - x_min_int) if area_intersection / min(area1, area2) >= 0.70: if area1 < area2: to_remove[i] = True break else: to_remove[j] = True return np.array([i for i in range(n_boxes) if not to_remove[i]], dtype=np.int32) finally: PyMem_Free(to_remove)