Question

Comment puis-je créer une image stéréoscopique 3D à partir d'une image 2D en utilisant MATLAB?

Était-ce utile?

La solution

Soit je suis malentendu votre question (les gens ont déjà fait remarquer que ce n'est pas clair), ou vous êtes mal compris la façon dont fonctionne la vision 3D. Vous ne « voir l'image 2D en utilisant du verre 3D ». vision 3D est obtenue en servant deux images différentes, l'image gauche et l'image droite, à l'œil gauche et l'œil droit, respectivement. A un niveau fondamental de Matlab n'a pas rien à voir avec elle.

Ainsi, en l'absence d'une question facilement compréhensible et cohérente, le mieux que je puisse faire est de supposer que vous voulez quelque chose comme cette : vous avez une image 2D simple, mais vous voulez encore « vu dans le format d'image 3D ». Dans ce cas, vous devez diviser en quelque sorte que seule image en deux nouvelles images:

  1. Image de gauche pour l'oeil gauche
  2. Image de droite pour l'oeil droit

Ce n'est pas trivial. En général, vous commencez par déduisant profondeur de chaque pixel dans l'image 2D. Puisque vous êtes « deviner » les informations de profondeur, les deux nouvelles images ne seront pas une représentation parfaite d'une scène 3D.

Ensuite, vous séparer l'image en couches à l'aide de cette information en profondeur. Il se penchera essentiellement comme une découpe de pop-up à partir d'un livre pour enfants:

text alt

Les couches plus vous pouvez venir avec, et votre estimation de la profondeur plus précise est la votre représentation 3D plus réaliste sera.

Enfin, vous projetez que dos de représentation en couches sur 2D à partir de deux positions différentes - l'un pour l'oeil gauche et l'autre pour l'œil droit. Cela vous donne les deux images différentes dont vous aviez besoin.

EDIT

La seconde vidéo liée à décrit la simplifiée la création de ce qui est communément appelé anaglyphe l'image . Il nécessite des lunettes rouge-cyan 3D - ce sont pas les verres polarisés qu'ils utilisent dans la plupart des salles 3D. La raison pour laquelle je dis simplifiée est qu'il ne fait pas de discrimination entre le premier plan et arrière-plan.

Pour un meilleur effet, vous auriez séparé au premier plan de l'arrière-plan, et d'appliquer l'approche uniquement au premier plan. En effet, généralement arrière-plan a une profondeur infinie et ne change pas quand on passe de mono à la vision stéréo. Dans le cas du piano, tout est au premier plan plus ou moins, de sorte que les travaux d'approche.

L'algorithme décrit la vidéo est:

  • Démarrer avec deux images, im1 et im2. Ils sont identiques
  • Définissez les canaux vert et bleu de im1 à zéro. Cela va créer l'image rouge
  • Régler le canal rouge de im2 à zéro. Cela va créer l'image cyan.
  • compenser les deux images d'une certaine quantité déterminée (en fonction de la profondeur de l'objet) de telle sorte que im1 est sur la gauche et im2 est sur la droite. Vous devez obtenir cet ordre correctement car les lunettes rouge-cyan 3D ont rouge sur la gauche, et cyan à droite.
  • effectuer des additions élément par élément des deux images décalées. Notez que aucune chaîne ne sature.

Voici un code Python / OpenCV je l'ai écrit:

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)

Voici une image similaire à ce qui est utilisé dans la vidéo:

text alt

Voici la sortie:

text alt

Malheureusement, je n'ai pas de lunettes rouge-cyan 3D pour vérifier que cela fonctionne. Mais il semble que cela devrait, au moins en théorie. Peut-être que quelqu'un peut me corriger si je l'ai fait une erreur.

Autres conseils

Il est beaucoup plus facile à faire si vous avez deux images prises à partir de points de vue légèrement différents. Vous pouvez créer un anaglyphe stéréo en rectifiant les deux images. Les fonctions concernées sont estimateUncalibratedRectifiation et stereoAnaglyph dans la boîte à outils système de vision par ordinateur. Voir la sRGB image stéréo exemple de Rectification.

Vous pouvez étalonner votre appareil photo en utilisant le Stereo app calibrateur caméra , puis utilisez la fonction recifyStereoImages. Voir étalonnage stéréo et la reconstruction Scène .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top