[Vision AI] Extracción Dinámica de Carriles y Criterio Geométrico de Invasión Basado en IoU (#2)
· 2 min de lectura

📌 Key Takeaways (Puntos Clave)
- Problema: Los reflejos viales y las grietas causan falsos positivos; las simples comprobaciones por coordenadas puntuales no detectan el momento exacto de invasión de carril.
- Solución: Máscara ROI trapezoidal, filtrado por pendiente (|slope| > 0.5) y cola temporal de media móvil de 7 fotogramas. Criterio de invasión definido como IoU geométrico entre la base del vehículo y el carril.
- Resultado: Eliminación del 95% del ruido de textura vial y detección precisa de invasión con fiabilidad subfotograma.
1. Detección Dinámica de Carriles con Canny y Hough
def detect_lanes(frame):
height, width = frame.shape[:2]
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blur, 50, 150)
mask = np.zeros_like(edges)
roi_polygon = np.array([[
(int(width * 0.1), height),
(int(width * 0.45), int(height * 0.6)),
(int(width * 0.55), int(height * 0.6)),
(int(width * 0.9), height)
]], np.int32)
cv2.fillPoly(mask, roi_polygon, 255)
masked_edges = cv2.bitwise_and(edges, mask)
return cv2.HoughLinesP(masked_edges, 1, np.pi/180, 20, minLineLength=20, maxLineGap=10)
2. Filtrado de Pendientes y Suavizado Temporal
Cálculo de pendiente m = (y2 - y1) / (x2 - x1):
- Carril Izquierdo:
m < -0.5 - Carril Derecho:
m > 0.5 - Ruido Horizontal:
|m| <= 0.5se descarta.
3. Criterio de Invasión Basado en IoU

Footprint = [x_min, y_min + 0.7*h, x_max, y_max]
IoU = Area(Footprint ∩ Lane_Polygon) / Area(Footprint)
Si IoU > 0.05, se dispara el evento de infracción y se inicia la localización de matrícula con YOLOv5.
4. Próxima Entrega
En la Entrega #3, analizaremos la detección jerárquica con YOLOv5 (lp_det.pt) y el seguimiento en tiempo real con CSRT.
