2011-01-18 5 views
5

¿Cómo creo una imagen estereoscópica 3D a partir de una imagen 2D utilizando MATLAB?¿Cómo crear imágenes 3D estereoscópicas usando MATLAB con la herramienta de imagen?

+3

¿Cuál es la pregunta? ¿Qué has intentado? – carlosdc

+1

Creo que sería más fácil crearlo si tienes datos en 3D, ya que entonces todo lo que necesitas es crear 2 proyecciones con diferentes ángulos de visión. –

+0

@carlosdc @Itamar Katz: si quiero ver una imagen 2D usando un cristal 3D, vea en formato de imagen 3D ... así. ¿O de otra manera puede verlo con 3 dimensiones? –

Respuesta

11

O estoy malinterpretando su pregunta (la gente ya ha señalado que no está claro) o está malinterpretando la forma en que funciona la visión 3D. No "ve imágenes en 2D con vidrio 3D". La visión 3D se logra al servir dos imágenes diferentes, imagen izquierda e imagen derecha, en el ojo izquierdo y el ojo derecho, respectivamente. En un nivel fundamental, MATLAB no tiene nada que ver con eso.

Por lo tanto, en ausencia de una pregunta coherente o comprensible, lo mejor que puedo hacer es asumir que desea algo como this: tiene una sola imagen 2D, pero aún desea "ver en formato de imagen 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. la derecha por el ojo derecho

Esto no es trivial. Generalmente, comienza por inferring the depth de cada píxel en la imagen 2D. Como está "adivinando" la información de profundidad, las dos nuevas imágenes no serán una representación perfecta de una escena en 3D.

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

alt text

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

Finalmente, proyecta esa representación en capas de nuevo en 2D desde dos posiciones diferentes: una para el ojo izquierdo y otra para el ojo derecho. Esto te da las dos imágenes diferentes que necesitas.

EDITAR

El segundo video se ha vinculado a la creación describe simplificada de lo que comúnmente se conoce como un anaglyph image. Requiere gafas rojo-cian 3D: éstas son y no las gafas polarizadas que usan en la mayoría de los cines 3D ahora. La razón por la que digo simplificado es que no discrimina entre el primer plano y el fondo.

Para obtener el mejor efecto, separa el primer plano del fondo y aplica el enfoque solo al primer plano. Esto se debe a que, por lo general, el fondo tiene una profundidad infinita y no cambia al pasar de la visión monoaural a la estéreo. En el caso del piano, todo es más o menos en primer plano, por lo que el enfoque funciona.

El algoritmo del video describe es:

  • de inicio con dos imágenes, im1 y im2. Son idénticos
  • Establezca los canales verde y azul de im1 en cero. Esto creará la imagen roja
  • Establezca el canal rojo de im2 en cero. Esto creará la imagen cian.
  • Desplace las dos imágenes en una cantidad específica (según la profundidad del sujeto) de modo que im1 esté a la izquierda y im2 a la derecha. Debe obtener esta orden correctamente porque las gafas rojo-cian 3D tienen rojo a la izquierda y cian a la derecha.
  • Realice la adición de elementos de las dos imágenes desplazadas. Tenga en cuenta que ningún canal se saturará.

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:

alt text

Aquí está la salida:

alt text

Lamentablemente no tengo gafas 3D rojo-cian para verificar que esto funcione. Pero parece que debería, al menos en teoría. Quizás alguien me corrija si me equivoco.

+0

muchas gracias @misha .. pero quiero que vea los enlaces del video http://www.youtube.com/watch?v=3r4M_KHt6aw, http://www.youtube.com/watch?v=g_JRHtHpuSY, http : //www.youtube.com/watch? v = zdXxS2KHXlo así .. - gracias Abhi. –

+1

Básicamente, el primer enlace describe más o menos lo que hice. Calcula el mapa de profundidad, crea una segunda imagen. No estoy seguro acerca de la implementación del filtro de desplazamiento real. El segundo enlace no es realmente tan relevante: no es una imagen estéreo, solo logra un efecto pseudo-3D. Si esto es lo que quieres, entonces es bastante simple de implementar, solo haz exactamente lo que el chico decía en el video. Es posible que vea el tercer video más tarde, es un poco largo, y es tarde aquí. Ponga el enlace relevante en su pregunta original para que sea obvio lo que quiere. – misha

+0

Gracias @misha sí lo tienes. Quiero agregar el efecto pseudo-3D de la imagen 2d. Acabo de lograr un simple efecto 3D según los enlaces de video. Si tienes un código con respecto me responde ... - Abhi –

0

Esto es mucho más fácil de hacer si tiene dos imágenes tomadas desde puntos de vista ligeramente diferentes. Puede crear un anáglifo estéreo rectificando las dos imágenes. Las funciones relevantes son estimateUncalibratedRectifiation y stereoAnaglyph en Computer Vision System Toolbox. Vea el ejemplo Uncalibrated Stereo Image Rectification.

Como alternativa, puede calibrar sus cámaras usando el Stereo Camera Calibrator app, y luego usar la función recifyStereoImages. Vea el Stereo Calibration and Scene Reconstruction.

+0

gracias por su respuesta ... si solo tenemos una imagen, ¿podemos hacer una imagen estereoscópica? –

Cuestiones relacionadas