Software

Visión instantánea

Por qué WaveMe

¿Busca una solución que incluya una cámara de visión? ¿Desea una aplicación de alto rendimiento que le permita llevar la voz cantante? Entonces debería echar un vistazo a WaveMe. WaveMe es una plataforma que resuelve los problemas comunes que se encuentran cuando se construyen aplicaciones de visión que necesitan acceso a gráficos de alta gama. WaveMe es para usted que encuentra que Labview es demasiado pesado, y escribir una aplicación desde cero es demasiado.

Con esta charla técnica, me gustaría profundizar un poco más en lo que WaveMe ofrece como entorno de programación genérico y por qué tú, o Senslogic, podríais construir una herramienta de alto rendimiento con muy poco esfuerzo.

Arquitectura básica

¿Cómo lo consigue WaveMe? Desde el principio, WaveMe se diseñó para manejar un conjunto fundamentalmente diverso de aplicaciones con la cámara de visión como componente común. El núcleo de la plataforma es un pipeline manejado por un pipeline manager que añade y elimina módulos (ese es tu código) con tipos de entrada y salida definidos.

El pipeline, así como el resto de la aplicación, se basa en un paradigma productor-consumidor. Esto se aplica a todo, desde las imágenes hasta la asignación de memoria. El productor suele ser una cámara, pero puede ser cualquier cosa que genere datos. Todo el mundo puede ser productor. El consumidor (último) es un compositor que se encarga de todas las tareas relacionadas con la visualización de imágenes, la respuesta a comandos gráficos, la transmisión de eventos y, finalmente, la retirada de los datos asignados por el productor cuando ya no se necesitan. Lo único especial del compositor es que se ejecuta en un contexto OpenGL, lo que significa que tenemos acceso al conjunto completo de comandos OpenGL.

La plataforma viene con un montón de primitivas gráficas predefinidas, como dibujar líneas, polígonos, círculos, retículas, renderizar texto e incluso mostrar polinomios de Zernike. Si no encuentras lo que te gusta, puedes añadir fácilmente las tuyas propias. Eso viene con un poco de esfuerzo adicional, pero nunca estamos limitados por la plataforma que. Si lo necesitamos, nos expone toda la gloria de OpenGL.

Módulos cooperativos

Un módulo WaveMe es una biblioteca que incluye su propia interfaz de usuario, define sus tipos de entrada y salida y se añadirá a un canal en vivo cuando se disponga de los datos adecuados. Los módulos funcionan como filtros y son cooperativos. Ven todos los datos de la canalización. Un módulo suele hacer lo siguiente

  • Observe el tipo de datos
    • Si el dato es una petición de salida, retorna con un código de salida. Este módulo se va. La limpieza se hará con las funciones de limpieza registradas que proporcionaste al iniciar el módulo
  • Empujar el mensaje hacia abajo si no es del tipo correcto y devolverlo con un código continue
  • Si los datos son los que buscamos,
    • Hacer el trabajo y cuando ya no necesitemos los datos, devolverlos a la tubería. Tal vez algún otro módulo también lo quiera. Depende de ti. Puedes "soltar" los datos, invocando así sus funciones de limpieza.
    • También podemos generar mensajes adicionales para ser empujados por la tubería para, finalmente, ser manejado por el compositor.
    • Cuando todo haya terminado, vuelve con un código continue. El módulo se despertará de nuevo cuando llegue el siguiente mensaje.

Eventos de ratón y teclado

Cuando se escribe una aplicación GUI completa, hay muchos eventos estándar que manejar. WaveMe viene con una plantilla donde los eventos de ratón y teclado están predefinidos para que cooperen con el resto de la plataforma. Por defecto, tu aplicación vive dentro de una pestaña junto a otros módulos. Uno de ellos es el módulo que maneja la cámara. Cuando seleccionas la pestaña de la cámara, WaveMe espera que los módulos que actualmente manejan los eventos de teclado y ratón los suelten y, a la inversa, los agarren cuando la pestaña del módulo es seleccionada. Todo eso es manejado por la plantilla estándar. Todo lo que tenemos que hacer es cambiar el nombre de las funciones callback de la plantilla y añadir su propio código, al menos si queremos interactuar con esos eventos.

Conjunto de herramientas gráficas e interfaz de usuario

WaveMe se basa en GTK4 y glib-2.0 para su interfaz de usuario, y gran parte de la forma en que los módulos interactúan con la tubería sigue los patrones utilizados por esas bibliotecas.

Asume que la cámara proporciona un flujo constante de imágenes con módulos que responden generando mensajes basados en lo que ven. Esta semántica encaja bien con los elementos gráficos que rastrean alguna propiedad de cada imagen.

Este comportamiento puede no ajustarse a todo, por lo que puede ser necesario cambiarlo. El compositor, a menos que se le indique lo contrario, asume que todos los objetos que recibe son persistentes y que otro mensaje con el mismo ID está a sólo unos milisegundos de distancia. Hay cosas que podemos querer hacer que no se ajustan a esa descripción. Por ejemplo, si queremos cambiar un mapa de colores, ese es definitivamente un mensaje que no necesita seguimiento. Para este tipo de mensajes, debemos marcar el mensaje como único. Disparar y olvidar. La parte de acción del mensaje se ejecutará una vez y nunca más.

Una última cosa que vale la pena mencionar al menos una vez, todos los mensajes pueden tener una función de limpieza, y la función de limpieza se ejecuta dentro del contexto OpenGL. Si necesitamos echar un vistazo al estado de OpenGL y enviarlo de vuelta a la aplicación, este es el lugar para hacerlo.

Resumen

Espero haber dado una idea de lo que WaveMe puede hacer y cómo. Algunas cosas no se han cubierto, como la forma en que construimos la interfaz de usuario, o al menos las partes de la interfaz de usuario que son específicas de WaveMe. Gran parte de esto está cubierto en la plantilla de la que derivan todos los módulos actualmente disponibles para WaveMe. La filosofía general es mantener una plantilla que cubra todas las bases y ampliarla con las particularidades de cada aplicación. Habiendo escrito ya un par de ellas, creo que WaveMe ha evolucionado hasta convertirse en una plataforma reutilizable a partir de la cual muchas aplicaciones pueden construirse rápidamente. Piénsalo. Quizás incluso lo intentes. No dude en ponerse en contacto conmigo en contact@senslogic.de si quieres saber si WaveMe también puede encajar contigo.

jarek

Entradas recientes

EUV y el estado de la litografía

Litografía óptica de alta gama, de qué se trata La litografía EUV parece ciencia ficción hecha realidad: espejos con suavidad a nivel atómico, luz...

hace 2 semanas

Óptica física en la GPU Nvidia

Intro Durante la mayor parte de mi carrera en óptica, he simulado imágenes de moduladores espaciales de luz y, sobre todo, de SLM...

hace 3 semanas

El dilema del integrador de sistemas

Este Tech-Talk trata sobre el desarrollo tecnológico en general, pero quizá más concretamente sobre el desarrollo tecnológico incremental. Obviamente, está influida por...

hace 2 meses

¿Puede la IA hacer tu código?

Supongo que estoy en una misión, una misión para moderar el asombro que la gente parece sentir por lo relacionado...

hace 3 meses

Modelado físico y OSS

Introducción Con esta charla técnica, me gustaría ofrecer algunas perspectivas sobre la construcción de un marco de modelado físico con Open...

hace 5 meses

Código abierto y acceso a Gitlab

Herramientas abiertas para el ecosistema WaveMe A partir de hoy, vamos a trasladar las plantillas WaveMe y todo el código abierto a...

hace 5 meses