Domanda

Come si crea un'immagine stereoscopica in 3D da un'immagine 2D utilizzando MATLAB?

È stato utile?

Soluzione

O io sto equivoco tua domanda (persone hanno già fatto notare che non è chiaro), o si sta fraintendendo le opere di visione modo 3D. Non è "vedi immagine 2D utilizzando il vetro 3D". la visione 3D è ottenuto servendo due immagini diverse, immagine a sinistra e l'immagine a destra, per l'occhio sinistro e l'occhio destro, rispettivamente. A un MATLAB fondamentale livello non ha nulla a che fare con esso.

Quindi, in assenza di una domanda di facile comprensione e coerenti, il meglio che posso fare è assumere che si desidera qualcosa di simile a questo : che hai è una singola immagine 2D, ma si vuole ancora "visto in formato immagine 3D". In tal caso, è necessario dividere in qualche modo che un'unica immagine in due nuove immagini:

  1. immagine a sinistra per l'occhio sinistro
  2. giusta immagine per l'occhio destro

Questa non è banale. In generale, si inizia con la inferire l' profondità di ogni pixel dell'immagine 2D in. Dal momento che si è "indovinando" le informazioni di profondità, le due nuove immagini non sarà una perfetta rappresentazione di una scena 3D.

Successivamente, è separare l'immagine in livelli utilizzando le informazioni di profondità. Sarà essenzialmente l'aspetto di un ritaglio di pop-up da un libro per bambini:

alt text

Gli strati più si può trovare con, e il più accurato vostra stima profondità è, il più realistico il tuo rappresentazione 3D sarà.

Infine, progetto che torna a strati rappresentazione su 2D da due posizioni diverse - una per l'occhio sinistro e una per l'occhio destro. Questo vi dà le due immagini differenti che avete avuto bisogno.

Modifica

:

Il secondo si è collegato al descrive il semplificato creazione di ciò che è comunemente noto come anaglifi immagine . Si richiede occhiali rosso-ciano 3D - questi sono non gli occhiali polarizzati che utilizzano nella maggior parte dei teatri 3D ora. Il motivo dico semplificato che è essa non discrimina tra il primo piano e lo sfondo.

Per un migliore effetto, devi separare il primo piano dallo sfondo, e applicare l'approccio solo al primo piano. Questo perché di solito sfondo ha una profondità infinita e non cambia quando si passa da mono a stereo visione. Nel caso del pianoforte, tutto è più o meno in primo piano, in modo che i lavori di approccio.

L'algoritmo del video descrive è:

  • Inizia con due immagini, im1 e im2. Sono identici
  • Imposta i canali verde e blu di im1 a zero. Questo creerà l'immagine rossa
  • Imposta il canale rosso di im2 a zero. Questo creerà l'immagine ciano.
  • Offset due immagini da una certa quantità specificata (a seconda della profondità di soggetto) tale che im1 è sulla sinistra e im2 è sulla destra. È necessario per ottenere questo ordine correttamente perché 3D rosso-ciano occhiali hanno rossa sulla sinistra, e ciano sulla destra.
  • Eseguire elemento-saggio aggiunta delle due immagini spostate. Si noti che nessun canale saranno saturare.

Ecco un po 'di codice Python / OpenCV ho scritto:

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)

Ecco un'immagine simile a ciò che è utilizzato nel video:

alt text

Ecco l'output:

alt text

occhiali

??Purtroppo non ho 3D rosso-ciano per verificare che questo funziona. Ma sembra come dovrebbe, almeno in teoria. Forse qualcuno mi può correggere se ho fatto un errore.

Altri suggerimenti

Questo è molto più facile da fare se si dispone di due immagini prese da un po 'diversi punti di vista. È possibile creare un anaglifo stereo raddrizzando le due immagini. Le funzioni rilevanti sono estimateUncalibratedRectifiation e stereoAnaglyph in Computer Vision System Toolbox. Vedere la sRGB Stereo Immagine rettifica esempio.

Alternativamente, è possibile calibrare le telecamere usando il Stereo Camera calibratore app , e quindi utilizzare la funzione recifyStereoImages. Vedere la calibrazione stereo e Scene ricostruzione .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top