El procesamiento de secuencias de video para identificar y seguir elementos móviles es un pilar fundamental en la visión por computadora. Esta implementación utiliza la sustracción de fondo para la segmentación inicial y el Filtro de Kalman para otorgar continuidad y estabilidad a la trayectoria del objeto detectado. El sistema se divide en cuatro etapas principales: modelado de fondo, detección de movimiento, filtrado predictivo y actualización dinámica del modelo.
1. Inicialización y Modelado de Fondo Estático
Para extraer los objetos en movmiiento, primero se debe generar una representación del entorno estático. Se utiliza un promedio temporal de los primeros fotogramas para minimizar el ruido y establecer una base comparativa sólida.
% Configuración del lector de video
fuenteVideo = VideoReader('input_video.mp4');
framesEntrenamiento = 45;
acumuladorFondo = zeros(fuenteVideo.Height, fuenteVideo.Width, 'double');
for i = 1:framesEntrenamiento
frameActual = readFrame(fuenteVideo);
acumuladorFondo = acumuladorFondo + double(rgb2gray(frameActual));
end
% Generación del modelo de fondo inicial
modeloReferencia = acumuladorFondo / framesEntrenamiento;
2. Segmentación y Procesamiento Morfológico
La detección se basa en la diferencia absoluta entre el fotograma actual y el modelo de referencia. Tras aplicar un umbral de binarización, se emplean operaciones morfológicas para eliminar falsos positivos y consolidar la masa del objeto.
% Captura y diferencia
imgGris = double(rgb2gray(readFrame(fuenteVideo)));
mapaDiferencia = abs(imgGris - modeloReferencia);
% Binarización mediante umbral adaptativo
mascaraBinaria = mapaDiferencia > 30;
% Limpieza mediante operaciones de apertura y cierre
elementoEstrucutrante = strel('disk', 4);
mascaraLimpia = imopen(mascaraBinaria, elementoEstrucutrante);
mascaraFinal = imclose(mascaraLimpia, strel('square', 20));
% Extracción de propiedades de regiones
propiedades = regionprops(mascaraFinal, 'BoundingBox', 'Area', 'Centroid');
indicesValidos = [propiedades.Area] > 400;
detecciones = propiedades(indicesValidos);
3. Seguimiento con Filtro de Kalman
El Filtro de Kalman permite estimar el estado futuro del objeto basándose en su trayectoria previa, compensando las posibles oclusiones o fallos en la detección por sustracción. Se asume un modelo de velocidad constante para la transición de estados.
% Inicialización del filtro (Estado: [x, y, vx, vy])
filtroK = configureKalmanFilter('ConstantVelocity', ...
[detecciones(1).Centroid], [20, 20], [10, 10], 5);
% Fase de predicción
posicionPredicha = predict(filtroK);
% Fase de corrección si existe una detección válida
if ~isempty(detecciones)
centroideActual = detecciones(1).Centroid;
posicionCorregida = correct(filtroK, centroideActual);
else
posicionCorregida = posicionPredicha;
end
4. Actualización Dinámica del Fondo
Para que el sistema sea robusto ante cambios de iluminación o desplazamientos lentos en el entorno, el modelo de fondo se actualiza en cada iteración mediante un factor de aprendizaje (alpha).
factorAprendizaje = 0.015;
modeloReferencia = (1 - factorAprendizaje) * modeloReferencia + ...
factorAprendizaje * imgGris;
5. Visualización de Resultados
La salida gráfica permite distinguir entre el dato crudo de la detección (rectángulo rojo) y la estimación estabilizada del rastreador (rectángulo verde).
imshow(imgGris, []);
hold on;
% Dibujar detección original
if ~isempty(detecciones)
rectangle('Position', detecciones(1).BoundingBox, 'EdgeColor', 'r', 'LineWidth', 1.5);
end
% Dibujar seguimiento estimado por Kalman
cajaSeguimiento = [posicionCorregida(1)-40, posicionCorregida(2)-40, 80, 80];
rectangle('Position', cajaSeguimiento, 'EdgeColor', 'g', 'LineWidth', 2, 'Curvature', [0.2, 0.2]);
hold off;
Este enfoque combina la simplicidad del aálisis de píxeles con la robustez estadística del Filtro de Kalman. Mientras que la sustracción de fondo es sensible al ruido ambiental, el filtro actúa como un sistema de control que suaviza las fluctuaciones, permitiendo un seguimiento más fluido incluso cuando el objeto se detiene momentáneamente o cruza zonas de bajo contraste.