Come creare immagini stereoscopiche in 3D con MATLAB con lo strumento di immagine?
-
12-10-2019 - |
Domanda
Come si crea un'immagine stereoscopica in 3D da un'immagine 2D utilizzando MATLAB?
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:
- immagine a sinistra per l'occhio sinistro
- 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:
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
eim2
. 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 eim2
è 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:
Ecco l'output:
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 .