M
en
Análisis de video de rotametro
Completado

Análisis de video de rotametro

Python OpenCV Tkinter Matplotlib

Este proyecto surgió para ayudar a mi hermana, que necesitaba extraer información de un rotámetro para su trabajo de fin de grado. Los experimentos que tenía que realizar duraban alrededor de una hora, y tenía que estar pendiente de las oscilaciones del flotador para ir tomando datos.

Cuando me dijo que se pasaba casi dos horas al día mirando para un rotámetro (palabra que me sigue costando creer que existe), le dije que grabase un vídeo del rotámetro y me lo enviase a ver si se me ocurría una solución, y así ella podría dedicarle tiempo a otras cosas.

Un rotámetro es un instrumento para medir caudales que consiste en un tubo por el que circula un fluido. En su interior, un flotador (la bolita) asciende o desciende según el caudal: al aumentar el flujo, la bolita sube hasta alcanzar una posición de equilibrio.

rotametro

Para ilustrar el problema, se muestra el vídeo del experimento a continuación.

En un escenario real, el movimiento de la bolita es mucho más estable. Sin embargo, decidimos aumentar la velocidad para experimentar un caso más extremo.

El objetivo final era graficar la posición de la bolita en función del tiempo. El proceso se dividió en tres etapas:

  1. Extracción de fotogramas: Dado un valor de FPS, se muestrea el vídeo para obtener los fotogramas individuales.
  2. Detección de la bolita mediante Template Matching: En cada fotograma, se localiza la bolita utilizando la técnica de coincidencia de plantillas (template matching) con correlación cruzada normalizada (cv2.TM_CCOEFF):
    • Se carga una imagen de referencia de la bolita.
    • Con cv2.matchTemplate(), se compara esta plantilla con el fotograma para generar un mapa de similitud.
    • La posición de máxima correlación (max_loc) se identifica mediante cv2.minMaxLoc(), obteniendo las coordenadas (x,y) de la bolita.
    • Se registra la posición vertical (eje y) para el análisis temporal.
  3. Normalización espacial: Como las coordenadas están en píxeles, es necesario convertirlas a unidades físicas. Para ello, se muestra por pantalla la posición más alta de la bolita detectada, y se le pide la posición real máxima alcanzada por la bolita. Mediante interpolación lineal (np.interp), los valores detectados se escalan al rango [0, maxReal], convirtiendo así los píxeles a la unidad de medida deseada.

max_bolita

A continuación, se muestra la gráfica resultante que representa la posición normalizada de la bolita en función del tiempo:

figure