"""Parameter sensitivity tests for edge detection. Verifies that adjusting parameters in expected directions produces expected changes in detection counts. Uses synthetic frames with known geometry. """ import importlib.util from pathlib import Path import cv2 import numpy as np import pytest # Load edges module directly _spec = importlib.util.spec_from_file_location( "cv_edges", Path("gpu/models/cv/edges.py"), ) _edges_mod = importlib.util.module_from_spec(_spec) _spec.loader.exec_module(_edges_mod) detect_edges = _edges_mod.detect_edges detect_edges_debug = _edges_mod.detect_edges_debug def _frame_with_lines(n_pairs: int = 3, line_thickness: int = 2) -> np.ndarray: """Create a frame with multiple horizontal line pairs.""" image = np.zeros((1080, 1920, 3), dtype=np.uint8) y_start = 300 for i in range(n_pairs): y_top = y_start + i * 120 y_bot = y_top + 40 + i * 10 # varying gap cv2.line(image, (100, y_top), (1800, y_top), (255, 255, 255), line_thickness) cv2.line(image, (100, y_bot), (1800, y_bot), (255, 255, 255), line_thickness) return image def test_canny_low_sensitivity(): """Lowering canny_low should find same or more horizontal lines.""" image = _frame_with_lines() high_threshold = detect_edges_debug(image, canny_low=100, canny_high=200) low_threshold = detect_edges_debug(image, canny_low=30, canny_high=200) assert low_threshold["horizontal_count"] >= high_threshold["horizontal_count"] def test_hough_threshold_sensitivity(): """Lowering hough_threshold should find same or more lines.""" image = _frame_with_lines() strict = detect_edges_debug(image, hough_threshold=150) lenient = detect_edges_debug(image, hough_threshold=40) assert lenient["horizontal_count"] >= strict["horizontal_count"] def test_pair_distance_range(): """Widening pair distance range should find same or more pairs.""" image = _frame_with_lines() narrow = detect_edges_debug(image, pair_min_distance=30, pair_max_distance=50) wide = detect_edges_debug(image, pair_min_distance=10, pair_max_distance=200) assert wide["pair_count"] >= narrow["pair_count"] def test_hough_min_length_sensitivity(): """Shorter min_length should find same or more lines.""" image = _frame_with_lines() long_min = detect_edges_debug(image, hough_min_length=500) short_min = detect_edges_debug(image, hough_min_length=50) assert short_min["horizontal_count"] >= long_min["horizontal_count"] def test_blank_frame_no_false_positives(): """All parameter combinations on blank frame should produce zero regions.""" image = np.zeros((720, 1280, 3), dtype=np.uint8) # Very lenient parameters results = detect_edges( image, canny_low=10, canny_high=50, hough_threshold=10, hough_min_length=20, pair_min_distance=5, pair_max_distance=500, ) assert results == []