Adquisición de Video en Tiempo Real

05.06.2026
Tercer Parcial - Introducción a la Visión Activa

🎥 Sesión 1: Adquisición de Video en Tiempo Real

Módulo de Entrada al Tercer Parcial: Del procesamiento estático a la Visión Activa

🎯 ¿Qué queremos lograr hoy?

Ingenieros, hasta el momento hemos trabajado con imágenes fijas (archivos .jpg o .png) almacenadas en el disco duro. En el mundo industrial real, un brazo robótico o un sistema de inspección de calidad no puede detenerse a esperar que guardemos una foto.

El objetivo de hoy es conectar MATLAB con una cámara física (ya sea la integrada en su laptop o la cámara de su teléfono celular de forma inalámbrica) para capturar, procesar y desplegar modificaciones a una matriz de píxeles de manera continua y en tiempo real.

🔬 Conceptos Clave para la Comprensión

Para dominar la visión en tiempo real, un ingeniero mecatrónico debe comprender los siguientes tres pilares fundamentales:

1. ¿Qué es técnicamente el Video Digital?

El video no es una señal continua o mágica; **es una sucesión rápida de matrices estáticas llamadas "fotogramas" (Frames)**. Si tu cámara captura a color, cada fotograma es una matriz tridimensional (Filas × Columnas × 3 Canales). Al desplegar estas matrices una detrás de otra a gran velocidad, engañamos al cerebro humano creando la ilusión de movimiento continuo.

Estructura de un Flujo de Video Digital (Stream de Matrices 3D en el tiempo):

Frame (t - 2) Frame (t - 1) Frame t (Actual) Matriz M x N x 3 Tiempo (t)

2. Frames Per Second (FPS) y el Presupuesto de Tiempo

El estándar industrial mínimo para considerar un flujo como "tiempo real" es de **30 FPS**. Esto significa que la cámara envía 30 matrices completas cada segundo a la computadora.

💡 La Regla del Ingeniero: Si dividimos 1 segundo entre 30 fotogramas (1 / 30), el resultado es **0.0333 segundos (33.3 milisegundos)**. Como ingenieros mecatrónicos, este es nuestro "Presupuesto de Tiempo". Todo algoritmo de filtrado, segmentación o control que programemos **DEBE ejecutarse en menos de 33 milisegundos**. Si tarda más, el video se ralentizará, perderemos fotogramas y el sistema fallará en la línea de producción.

⚙️ Ejemplo en la Industria (El Contexto Mecatrónico)

Imagina una banda transportadora de botellas que avanza a 2 metros por segundo. Tu cámara detecta botellas sin tapa y manda una señal a un brazo neumático para expulsarlas de la banda. Si tu algoritmo de visión en MATLAB tarda 50 milisegundos en procesar la imagen (superando el presupuesto límite de 33 ms), en ese tiempo de retraso la botella ya avanzó 10 centímetros adicionales. ¡El brazo neumático golpeará el aire y la botella defectuosa llegará al cliente!

📚 Nota Teórica: En los libros de texto de sistemas dinámicos y control automático, este fenómeno de la vida real se conoce como cumplimiento de Restricciones de Tiempo Real (Real-Time Constraints) o mantenimiento de una Latencia Determinística. En mecatrónica, una respuesta matemática correcta entregada un segundo tarde, es una respuesta incorrecta.

3. El Búfer de Memoria y el Bloqueo de Hardware

Cuando inicializamos una cámara, el sistema operativo le asigna un canal de comunicación exclusivo. Si tu código termina de forma abrupta por un error y no le indicas explícitamente a la computadora que "libere" la cámara, el hardware se quedará bloqueado en un búfer fantasma. Al intentar correr tu script de nuevo, recibirás el típico error: Device is busy o Webcam in use. Aprenderemos a recolectar esta "basura" al final del código.

🔌 ¿Qué significa esto exactamente para quien no es experto en sistemas?

Vamos a desglosarlo con analogías simples de la vida cotidiana conectadas a la teoría de las computadoras:

  • El Canal de Comunicación Exclusivo: Imagina que la cámara y MATLAB se comunican por una "línea telefónica privada". El Sistema Operativo (Windows/Mac) es el operador que conecta esa línea. Mientras MATLAB tenga la línea levantada, ninguna otra aplicación (como Zoom o Teams) puede usar la cámara. En teoría de Sistemas Operativos, este concepto de préstamo de hardware se llama Asignación de Recursos Mutuamente Excluyentes (Mutex).
  • El Búfer (Buffer): Como la cámara envía fotos extremadamente rápido, tu procesador no siempre puede analizarlas al instante. Para no perder fotos, la computadora crea una "sala de espera" temporal en la memoria RAM llamada Búfer. Funciona como una fila del supermercado: el primero que llega es el primero en ser atendido. En ciencias de la computación, a esta estructura se le conoce como cola FIFO (First-In, First-Out).
  • El Bloqueo (El Problema): Si tu código tiene un error matemática a la mitad y el programa se cierra de golpe sin "colgar" la línea telefónica, el canal exclusivo se queda abierto y el búfer se sigue llenando hasta atascarse por completo. Los libros de arquitectura de software llaman a esta falla un Interbloqueo (Deadlock) o una Fuga de Memoria (Memory Leak). Por eso veremos que limpiar el código al final es vital en ingeniería.

💻 Práctica Guiada Paso a Paso

Sigan las siguientes instrucciones detalladas para configurar su hardware (Laptop o Celular) y construir su primer entorno de Visión Activa en MATLAB.

Paso 1: Preparación e Instalación del Hardware (Elige tu Opción A o B)

Antes de programar, MATLAB necesita un puente de comunicación según la cámara que vayas a usar hoy. Elige **una** de las siguientes dos opciones de instalación:

Opción A: Usar la cámara web integrada de tu Laptop (Directo)

  1. En MATLAB, ve a la barra superior y busca la pestaña Home.
  2. Haz clic en el ícono de Add-Ons (rompecabezas) y selecciona Get Add-Ons.
  3. En el buscador escribe: MATLAB Support Package for USB Webcams e instálalo.
  4. Para verificar que se instaló bien, escribe webcamlist en la Command Window de MATLAB. Verás el nombre de tu cámara integrada.

Opción B: Usar la cámara de tu Celular vía WiFi (Inalámbrico)

  1. Descarga en tu teléfono celular una aplicación gratuita de cámara IP (ejemplos populares: DroidCam o IP Webcam en Android/iOS).
  2. Abre la app en tu celular e inicia el servidor. Asegúrate de estar conectado al mismo WiFi que tu laptop. La app te mostrará una dirección URL en pantalla (ejemplo: https://192.168.1.100:8080/video). ¡Anótala!
  3. En MATLAB de tu computadora, ve a Home -> Add-Ons -> Get Add-Ons.
  4. Busca e instala exactamente el paquete: MATLAB Support Package for IP Cameras.
Paso 2: Capturando el primer "Snapshot" estático

Antes de hacer un ciclo continuo, verifiquemos que podemos "congelar" un único fotograma de nuestra cámara elegida y cargarlo como una matriz estándar en la memoria.

Creen un nuevo script (Ctrl + N), guárdenlo como captura_estatica.m y escriban el siguiente código adaptable:

%% 1. Inicializar el objeto de la camara (Activa SOLO una opción) % ---> SI ELIGIO OPCION A (LAPTOP), use esta linea: cam = webcam(); % ---> SI ELIGIO OPCION B (CELULAR), borre el '%' de abajo y ponga su URL: % cam = ipcam('https://192.168.1.100:8080/video'); %% 2. Congelar el instante actual (Snapshot) % La función snapshot congela el instante actual del flujo de video % y lo guarda como una matriz tridimensional en la variable 'foto'. foto = snapshot(cam); %% 3. Desplegar la matriz en pantalla figure(1); imshow(foto); title('Mi primer Snapshot congelado'); %% 4. REGLA DE ORO: Liberar el hardware de la memoria RAM % Si no borramos la variable 'cam', el puerto se queda bloqueado y dará error después. clear cam; disp('Objeto camara destruido de la RAM y puerto liberado.');

Ejecuten el script. Verán cómo se activa su dispositivo por un segundo, se despliega la foto fija en una ventana de MATLAB y el puerto se cierra limpiamente.

Paso 3: El Pipeline de procesamiento en Tiempo Real (Ciclo Infinito)

Ahora uniremos la captura secuencial de fotos con un procesamiento en vivo. Para lograr que corra de forma continua pero se detenga de manera segura cuando cierren la ventana sin trabar la computadora, usaremos la función condicional ishandle().

Creen un nuevo script, guárdenlo como vision_tiempo_real.m e implementen este pipeline estructurado:

%% 1. Inicialización del Entorno y Hardware (Activa solo tu opción) % Opción A: Laptop cam = webcam(); % Opción B: Celular (Descomenta abajo si usas este método) % cam = ipcam('https://192.168.1.100:8080/video'); fig = figure(1); % Crear la ventana de visualización disp('Iniciando flujo en vivo. Cierre la ventana grafica para terminar...'); %% 2. El Pipeline Continuo (Ciclo Principal) % Mientras la ventana de visualización 'fig' exista y esté abierta, % el ciclo while se ejecutará infinitamente fotograma por fotograma. while ishandle(fig) % A. ADQUISICIÓN: Extraer el fotograma actual de la cámara frame_rgb = snapshot(cam); % B. PROCESAMIENTO: Convertir el fotograma en vivo a Escala de Grises % Aquí eliminamos el color transformándolo en luminancia pura. frame_procesado = rgb2gray(frame_rgb); % C. DESPLIEGUE: Actualizar la ventana gráfica con la matriz modificada imshow(frame_procesado); title('Pipeline de Vision Activa: Escala de Grises en Vivo'); % D. FLUSH GRÁFICO: Comando crítico drawnow % Obliga a MATLAB a dibujar la pantalla inmediatamente antes de saltar al siguiente ciclo. drawnow; end %% 3. Recolección de Basura (Garbage Collection) % Cuando el usuario cierra la ventana, el ciclo se rompe. % Es imperativo destruir el objeto para no dejar congelada la cámara. clear cam; disp('Flujo terminado. Hardware liberado correctamente.');
Paso 4: El Reto de Rendimiento (Medir los FPS Reales)

El Reto: En la sección de conceptos hablamos de que necesitamos correr nuestro código en menos de 33 milisegundos para lograr 30 FPS. Pero, ¿cómo comprobamos a qué velocidad real está corriendo nuestro código MATLAB en nuestra computadora?

Modifiquen su ciclo while del Paso 3 para integrar un cronómetro utilizando las funciones nativas de MATLAB tic (iniciar reloj) y toc (detener reloj y leer tiempo).

Código de Integración:

while ishandle(fig) % 1. Iniciar el cronómetro justo al empezar el ciclo tic; frame_rgb = snapshot(cam); frame_procesado = rgb2gray(frame_rgb); imshow(frame_procesado); % 2. Detener cronómetro y obtener el tiempo transcurrido en segundos tiempo_del_ciclo = toc; % 3. Calcular Fotogramas Por Segundo (FPS) % Si tardó 0.05 seg en dar una vuelta, 1 / 0.05 = 20 FPS. fps_reales = 1 / tiempo_del_ciclo; % 4. Mostrar la velocidad dinámicamente en el título title(sprintf('Visión Activa | FPS Reales: %.1f', fps_reales)); drawnow; end
💡 Reto de Cierre: Intenta tapar la luz de tu cámara con la mano. Notarás que los FPS bajan drásticamente. ¿Por qué? Porque el hardware de la cámara debe compensar la falta de luz dejando el obturador abierto más tiempo para capturar fotones, lo que destruye tu "presupuesto de tiempo". ¡Por eso en la industria la iluminación potente es ley!

🎯 Reto Individual para la Sesión

Modifiquen de forma individual el código del **Paso 3**. En lugar de utilizar la función rgb2gray() para transformar a escala de grises, apliquen la indexación matricial que dominaron en el segundo parcial para **aislar y mostrar en tiempo real únicamente el canal Rojo de su cámara** (es decir, el canal 1 de la matriz tridimensional frame_rgb(:,:,1)).

🏁 Conclusión del Resultado Esperado

Al finalizar los 150 minutos de esta sesión, el ingeniero en mecatrónica debe haber consolidado y observado el siguiente comportamiento técnico en su estación de trabajo:

Flujo Lógico y de Renderizado Esperado en el Laboratorio:

1. Snapshot (RGB) 2. Procesamiento (Matriz o Canales) 3. drawnow (Render) ¿Ventana abierta? Si -> Regresa a Paso 1
  • Comportamiento visual: Se debe desplegar una ventana continua de video que capture sus movimientos a una tasa fluida (mínimo 24-30 FPS) mostrando la transformación en grises o del canal rojo en vivo.
  • Cierre seguro: Al dar clic en la "X" para cerrar la ventana de la figura, el programa debe terminar inmediatamente sin congelar la interfaz de MATLAB, arrojando el mensaje de éxito en la terminal.
  • Comprensión alcanzada: Los alumnos habrán roto el miedo a la interacción con variables físicas externas. Han asimilado que procesar video es simplemente realizar operaciones de álgebra lineal sobre bucles secuenciales de matrices rápidas en la RAM sin rebasar el presupuesto de tiempo.

Esta base sólida nos permitirá, en las próximas sesiones, programar la detección activa de contornos, calibración de lentes y el cálculo de trayectorias espaciales para el guiado de servomecanismos. ¡Bienvenidos a la Visión Activa!

🛠️ La Caja de Herramientas (Troubleshooting)

En ingeniería mecatrónica, el código casi nunca funciona a la primera cuando interactuamos con hardware físico. Si experimentan problemas, revisen estas soluciones antes de llamar al profesor.

Error: "Webcam in use" o "Device is busy"

El problema: Tu código anterior falló antes de llegar a la instrucción clear cam. Por lo tanto, el sistema operativo (Windows/Mac) sigue creyendo que MATLAB tiene el "teléfono descolgado" y no te permite abrir otra conexión.

La solución rápida: Ve a la Command Window de MATLAB y fuerza la liberación de la memoria escribiendo:

clear all;
imaqreset;

Si esto no funciona, desconecta físicamente el USB de tu cámara y vuélvelo a conectar.

El video del celular tiene mucho retraso (Lag de varios segundos)

El problema: Estás usando la Opción B (cámara IP) y el video llega tardísimo. Esto ocurre porque la aplicación del celular está enviando video en Full HD (1080p o 4K) y tu router WiFi de la escuela no soporta enviar esas matrices gigantes 30 veces por segundo. Estás saturando el ancho de banda.

La solución: En la aplicación de tu celular (DroidCam o IP Webcam), entra a las configuraciones de video y baja la resolución a 640x480 (VGA) o incluso 320x240. En visión industrial, usualmente no necesitamos 4K para detectar una pieza, ¡necesitamos velocidad!

MATLAB no reconoce el comando webcam() o ipcam()

El problema: No instalaste correctamente los Add-Ons en el Paso 1 de la Práctica.

La solución: Vuelve a la pestaña Home -> Add-Ons. Asegúrate de tener iniciada tu sesión con el correo UVM. Recuerda que son dos paquetes distintos: uno para USB y otro para IP Cameras.

✏️ Cuestionario Rápido de Autoevaluación

Verifica que comprendiste los conceptos técnicos de la sesión antes de retirarte del laboratorio.

1. ¿Cuál es el "Presupuesto de Tiempo" máximo que debe tardar nuestro ciclo while para mantener un video fluido a 30 FPS en la industria?

2. ¿Qué función cumple el comando drawnow al final de nuestro ciclo?

3. Desde la teoría de Sistemas Operativos, ¿por qué es crítico ejecutar clear cam al romper el ciclo infinito?

💡 Módulo de Introducción a la Visión Activa en Tiempo Real

Ingeniería Mecatrónica | Universidad del Valle de México | 2026

Share
Maestro Víctor Manuel García Ríos
Todos los derechos reservados 2022
Creado con Webnode Cookies
¡Crea tu página web gratis! Esta página web fue creada con Webnode. Crea tu propia web gratis hoy mismo! Comenzar