3D reconstruction system through fringe projection - opi-lab/lab-docs GitHub Wiki

Sistema Básico de Reconstrucción 3D por Proyección de Franjas


1. Introducción.
2. Estructura General
3. Fundamentación Teórica
    3.1. Técnicas de Extracción de Fase.
        3.1.1. Transformada de Fourier.

        3.1.2. Corrimiento de Fase.

    3.2. Técnicas de Desenvolvimiento de Fase.
4. Generación de Patrones de Franjas


1. Introducción.

La reconstrucción 3D mediante franjas, consiste en proyectar patrones sinusoidales sobre un objeto o superficie con el fin de recuperar la profundidad {Z}. Su naturaleza no invasiva y sin contacto le brinda un plus a la hora de implementarlo en diferentes campos de aplicación (control de calidad, inspección industrial, etc.) puesto que cuenta con elevada resolución espacial (precisión), velocidad (procesamiento), versatilidad y flexibilidad. El desarrollo del presente instructivo para sistemas de reconstrucción 3D fue realizado en C++.


2. Estructura General.

La implementación de sistemas de reconstrucción 3D por proyección de franjas sigue una estructura general, que puede tener ciertas variaciones dependiendo de la aplicación, y para efectos prácticos se dividirá en 5 etapas principales:

  1. Configuración del montaje experimental. Se seleccionan los elementos de proyección (proyector) y adquisición (cámara) necesarios según los requerimientos metrológicos.

  2. Calibración del sistema. Búsqueda del modelo matemático que describa el sistema de reconstrucción 3D para obtener la mayor precisión posible.

  3. Proyección y captura de patrones de franjas. Se proyectan los patrones sinusoidales de franjas generados previamente sobre el objeto a medir y se capturan las imágenes.

  4. Algoritmos de extracción de fase y desenvolvimiento de fase. Se debe realizar debido a que la fase extraída presenta discontinuidades que impiden efectuar la reconstrucción.

  5. Conversión de la fase continua a unidades métricas. Proceso final en el cual se obtiene la correspondiente coordenada Z desconocida para cada región analizada.

Un diagrama con los bloques y la secuencia que se debe seguir para el desarrollo del sistema de reconstrucción 3D por proyección de franjas es el siguiente:


3. Fundamentación Teórica

Todo sistema de reconstrucción 3D por proyección de franjas está compuesto por 3 etapas fundamentales: una etapa de proyección (generación de patrones de franjas), una etapa de observación (captación de imágenes de franjas) y una etapa de procesamiento (calibración del sistema y desenvolvimiento de fase). Una breve descripción de las etapas sería:

A. Etapa de Proyección. Cuenta con un dispositivo capaz de proyectar patrones de franjas sinusoidales analógicos o digitales, considerando las bondades que ofrece cada uno, en el caso del proyector analógico permite una mayor resolución y simplicidad de hardware; mientras que, el proyector digital brinda la posibilidad de modificar los parámetros de los patrones de franjas proyectados para ajustarse a los requerimientos de la aplicación.

B. Etapa de Observación. El montaje de adquisición generalmente se compone a través de una cámara, por simplicidad, sin embargo, para aplicaciones específicas puede ser que requiera utilizarse dos elementos captores.

C. Etapa de Procesamiento. Está compuesto normalmente por un computador con acceso a software de codificación, a través del cual se desarrollan los algoritmos e interfaces para el control de las etapas previamente descritas, se considera la central de mando.

El montaje experimental que implementa cualquier sistema de reconstrucción 3D por proyección de franjas es el siguiente:

3.1. Técnicas de Extracción de Fase.

Al momento de proyectar los patrones de franjas sobre la superficie del objeto de estudio seleccionado para la reconstrucción tridimensional se generan curvaturas que se les conoce como la modulación de la fase introducida a través de la función sinusoidal descrita en la ecuación 4.1 (Zhang, 2016). Debido a que la información de profundidad requerida ha sido codificada, se hace necesario la implementación de algoritmos para la extracción de la fase envuelta, de modo que se pueda recuperar la coordenada Z desconocida.

En la literatura existen una variedad de algoritmos para la extracción de fase, sin embargo, aquí solo se describiran en detalle los 2 más implementados y generan mejores resultados: los métodos basados en la transformada de Fourier y el corrimiento de fase.

3.1.1. Transformada de Fourier.

Este tipo de técnica de extracción de fase utiliza el espectro de frecuencias. El algoritmo a desarrollar para obtener la fase del patrón de franjas proyectado es el siguiente:

  1. Aplicar la transformada de Fourier al patrón de franjas de interés.
  2. Implementar una etapa con filtros para el espectro de frecuencias.
  3. Aplicar la transformada inversa de Fourier al espectro post-filtrado.
  4. Realizar la recuperación de la fase envuelta en unidades de radian.

3.1.2. Corrimiento de Fase.

A través de esta técnica se logra la extracción de la fase para un conjunto de N imágenes de patrones de franjas sinusoidales que se encuentran desfasadas en forma constante cada 2 * pi / N entre ellas. Por lo que, la expresión para calcular la modulación de intensidad de los patrones de franjas estaría descrita por la siguiente relación matemática:

equation 3.1

Donde f_0 es la frecuencia inicial (conocido) y es igual para todos los N patrones de franjas proyectados; mientras que, a(x,y) representa la intensidad constante, b(x,y) corresponde al contraste de los patrones y phi(x,y) (x,y)es la fase introducida al objeto (atributos desconocidos).

El desplazamiento de fase que se le debe aplicar a cada patrón de franjas se calcula como:

equation 3.2

Consideremos un caso particular en el cual se utilizan 3 imágenes de franjas para extraer la fase, implementando la ecuación 3.1, tomando a k = 1, 2, 3 se puede obtener lo siguiente:

equation 3.3

      equation 3.4

equation 3.5

Donde ya conocemos el significado de la notación utilizada, y cabe recordar que son iguales para las imágenes de franjas. Resolviendo simultáneamente las ecuaciones (3.3) - (3.5) se obtiene la siguiente expresión para recuperar la fase envuelta desconocida phi(x,y) :

equation 3.6

3.2. Técnicas de Desenvolvimiento de Fase.

Las técnicas de extracción de fase estudiadas en el apartado 3.1. solamente recuperan una fase discontinua phi(x,y) envuelta en un rango de valores de -pi|pi con discontinuidades de 2pi. Para realizar una reconstrucción 3D, la fase recuperada no debe tener ambigüedades en los valores que la comprenden, por lo que es necesario obtener una fase continua.

El procedimiento llevado a cabo para desenvolver una fase empieza por la identificación de las discontinuidades sobre phi(x,y) y adicionar valores de 2pi a la fase discontinua con el fin de eliminarlas y obtener una fase continua Phi(x,y), matemáticamente puede expresarse así:

equation 3.7

Donde K(x,y) es una función escalón apropiada que permite eliminar las discontinuidades.


4. Generación de Patrones de Franjas

Los patrones de franjas sinusoidales pueden ser generados mediante la siguiente expresión matemática (Zhang, 2016):

equation 4.1

De la anterior ecuación, vemos que es necesario establecer una serie de parámetros para la generación de patrones franjas sinusoidales, cuya notación y definición es la siguiente:

u_p,v_p son las coordenadas píxel del sistema de proyección, f_0 es la frecuencia inicial del patrón de franjas proyectado, y varphi corresponde al corrimiento de fase. La generación de patrones de franjas sinusoidales puede hacerse desde cualquier lenguaje de programación (Matlab, C++, Python) siempre y cuando se lleven a cabo los procedimientos adecuados de parametrización, cómputo y graficación de las imágenes de franjas resultantes.

A continuación se detalla una serie de pasos para construir un algoritmo básico de generación de proyección de patrones de franjas en Visual Studio C++:

  1. Se crea un vector u_p que va desde cero a un valor deseado. Por lo general, este valor es la resolución horizontal del proyector a utilizar. Este procedimiento se puede realizar utilizando la función iota() de la librería numeric.

  2. Se crea la función de modulación de intensidad I(u_p,v_p) mostrada anteriormente, definiendo un valor de frecuencia f_0 y un corrimiento de fase varphi. En este caso utilizaremos el vector u_p creado en el paso anterior. Para realizar este paso, se recomienda utilizar la clase Mat de OpenCV la cual permite trabajar con matrices fácilmente.

  3. Se crea una matriz a partir del vector de intensidad I(u_p,v_p) descrito en el paso anterior. Básicamente, se copia el vector en un determinado número de filas. Por lo general, este valor es la resolución vertical del proyector a utilizar. Este procedimiento se puede realizar utilizando la función repeat().

  4. Se normaliza la matriz creada en valores de entre 0 y 1 para poder graficarla en escala de grises con la función imshow() de OpenCV.

  5. Por último, se construye una ventana para graficar la imagen, la cual se mueve a una segunda pantalla (proyector) y se visualiza utilizando la función imshow() anteriormente mencionada. Para mover la ventana, se recomienda utilizar la función movedwindow() de la libreria Windows.h.


⚠️ **GitHub.com Fallback** ⚠️