Adquisición de Video en Tiempo Real
🎥 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):
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.
⚙️ 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.
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)
- En MATLAB, ve a la barra superior y busca la pestaña Home.
- Haz clic en el ícono de Add-Ons (rompecabezas) y selecciona Get Add-Ons.
- En el buscador escribe:
MATLAB Support Package for USB Webcamse instálalo. - Para verificar que se instaló bien, escribe
webcamlisten 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)
- Descarga en tu teléfono celular una aplicación gratuita de cámara IP (ejemplos populares: DroidCam o IP Webcam en Android/iOS).
- 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! - En MATLAB de tu computadora, ve a Home -> Add-Ons -> Get Add-Ons.
- Busca e instala exactamente el paquete:
MATLAB Support Package for IP Cameras.
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:
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.
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:
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:
🎯 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:
- 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.
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:
imaqreset;
Si esto no funciona, desconecta físicamente el USB de tu cámara y vuélvelo a conectar.
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!
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.