Cómo crear imágenes estereoscópicas en 3D utilizando MATLAB con la herramienta de imagen?

StackOverflow https://stackoverflow.com/questions/4720857

Pregunta

¿Cómo se crea una imagen estereoscópica en 3D a partir de una imagen 2D utilizando MATLAB?

¿Fue útil?

Solución

O yo estoy malentendido su pregunta (personas ya han señalado que no está claro), o si está mala interpretación de las obras de visión modo 3D. No "ve la imagen en 2D usando vidrio 3D". la visión 3D se logra al servir dos imágenes diferentes, imagen de la izquierda y la imagen de la derecha, para el ojo izquierdo y el ojo derecho, respectivamente. En un nivel fundamental MATLAB no tiene nada que ver con ello.

Por lo tanto, en ausencia de una cuestión fácilmente comprensible y coherente, lo mejor que puedo hacer es asumir que desea algo así como este : que tienes es una única imagen en 2D, pero todavía quiere "que se ve al formato de imágenes en 3D". En ese caso, es necesario dividir de alguna manera que una sola imagen en dos nuevas imágenes:

  1. Imagen de la izquierda para el ojo izquierdo
  2. Imagen de la derecha para el ojo derecho

Esto no es trivial. En general, se empieza por inferir la profundidad de cada píxel de la imagen 2D en. Puesto que usted es "adivinar" la información de profundidad, las dos nuevas imágenes no serán una perfecta representación de una escena 3D.

A continuación, separar la imagen en capas que utilizan esa información en profundidad. En esencia, se verá como un recorte emergente de un libro para niños:

text alt

Los más capas que puede llegar a, y cuanto más precisa sea su estimación de profundidad, más realista que su representación en 3D será.

Por último, se proyecta que volver capas representación en 2D desde dos posiciones diferentes - una para el ojo izquierdo, y una para el ojo derecho. Esto le da las dos imágenes diferentes que es necesario.

Editar

El segundo que vincula a describe el simplificada creación de lo que comúnmente se conoce como un anaglifo imagen . Requiere 3D gafas rojo-cian - estos son no las gafas polarizadas que utilizan en la mayoría de los cines ahora en 3D. La razón que digo simplificada es que no discrimina entre el primer plano y el fondo.

Para un mejor efecto, se había separado del primer plano del fondo, y aplicar el enfoque sólo al primer plano. Esto se debe a que normalmente fondo tiene una profundidad infinita y no cambia al pasar de mono a la visión estereoscópica. En el caso del piano, todo es más o menos plano, por lo que los trabajos de aproximación.

El algoritmo del video describe es:

  • Comenzar con dos imágenes, im1 y im2. Son idénticos
  • Establecer los canales verde y azul de im1 a cero. Esto creará la imagen roja
  • Ajuste el canal rojo de im2 a cero. Esto creará la imagen cian.
  • Offset las dos imágenes por alguna cantidad especificada (dependiendo de la profundidad a la materia) de tal manera que im1 está a la izquierda y im2 está a la derecha. Es necesario para conseguir este fin correctamente porque 3D de color rojo-cian gafas han rojo a la izquierda, y cian a la derecha.
  • Realizar Además elemento a elemento de las dos imágenes desplazadas. Tenga en cuenta que no hay canales saturarán.

Aquí hay un código Python / OpenCV escribí:

import cv
SHIFT=8

if __name__ == '__main__':
    import sys
    _, fname = sys.argv
    im  = cv.LoadImage(fname)

    size = cv.GetSize(im)
    width, height = size
    left  = cv.CreateImage(size, im.depth, im.nChannels)
    right = cv.CreateImage(size, im.depth, im.nChannels)
    anaglyph = cv.CreateImage((width - SHIFT, height), im.depth, im.nChannels)

    #
    # This would be easier if we had COI support for cv.Set, but it doesn't
    # work that way.
    # OpenCV uses BGR order (even if input image is greyscale):
    # http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html
    # red goes on the left, cyan on the right:
    # http://en.wikipedia.org/wiki/Anaglyph_image
    #
    b = cv.CreateImage(size, im.depth, 1)
    g = cv.CreateImage(size, im.depth, 1)
    r = cv.CreateImage(size, im.depth, 1)
    cv.Split(im, b, g, r, None)

    zeros = cv.CreateImage(size, r.depth, 1)
    cv.Merge(zeros, zeros, r, None, left)
    cv.Merge(b, g, zeros, None, right)

    #
    # cvRect is ( x, y, width, height ) and it MUST be a tuple, not a list
    # 
    cv.SetImageROI(left,  ( SHIFT, 0, width - SHIFT, height ))
    cv.SetImageROI(right, ( 0,     0, width - SHIFT, height ))
    cv.Add(left, right, anaglyph, None)

    cv.SaveImage('anaglyph.jpeg', anaglyph)

Aquí está una imagen similar a lo que se usa en el video:

text alt

Aquí está la salida:

text alt

vasos

Por desgracia no tengo 3D rojo-cian para verificar que esto funciona. Pero parece que debe ser, al menos en teoría. Tal vez alguien me puede corregir si he cometido un error.

Otros consejos

Esto es mucho más fácil de hacer si tiene dos imágenes tomadas desde un poco diferentes puntos de vista. Se puede crear un anaglifo estéreo mediante la rectificación de las dos imágenes. Las funciones relevantes son estimateUncalibratedRectifiation y stereoAnaglyph en el ordenador Vision System Toolbox. Véase el ejemplo de la Sin calibrar rectificación de imágenes estéreo .

Como alternativa, se puede calibrar sus cámaras usando el estéreo cámara calibrador aplicación y, a continuación, utilizar la función recifyStereoImages. Vea la calibración estéreo y reconstrucción de la escena .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top