Либо я неправильно понимаю ваш вопрос (люди уже отметили, что он неясен), либо вы неправильно понимаете, как работает трехмерное зрение.Вы не «видите 2D-изображение, используя 3D-стекло».Трехмерное зрение достигается путем подачи двух разных изображений, левого изображения и правого изображения, левому глазу и правому глазу соответственно.На фундаментальном уровне MATLAB не имеет к этому никакого отношения.
Итак, в отсутствие легко понятного или связного вопроса, лучшее, что я могу сделать, это предположить, что вы хотите что-то вроде this : у вас есть одно 2D-изображение, но вы все равно хотите «увидеть в формате 3D-изображения».В этом случае вам нужно как-то разделить это одиночное изображение на два новых изображения:
- Левое изображение для левого глаза
- Правое изображение для правого глаза
Это не тривиально.Обычно вы начинаете с , определяя глубину каждого пикселя в 2D-изображении.Поскольку вы «угадываете» информацию о глубине, два новых изображения не будут идеальным представлением 3D-сцены.
Затем вы разделяете свое изображение на слои, используя эту информацию о глубине.По сути, это будет выглядеть как всплывающее окно из детской книги:
Чем больше слоев вы сможете придумать, и чем точнее будет ваша оценка глубины, тем большереалистичным будет ваше трехмерное представление.
Наконец, вы проецируете это слоистое представление обратно на 2D из двух разных позиций - одной для левого глаза и одной для правого глаза.Это дает вам два разных изображения, которые вам нужны.
РЕДАКТИРОВАТЬ
Второе видео , с которым вы связаны, описывает упрощенное создание так называемого анаглифного изображения .Для этого требуются красные красно-голубые очки - это , а не поляризованные очки, которые они сейчас используют в большинстве 3D-кинотеатров.Причина, по которой я говорю упрощенный , заключается в том, что он не различает передний план и фон.
Для лучшего эффекта вы должны отделить передний план от фона и применить подход только к переднему плану.Это потому, что обычно фон имеет бесконечную глубину и не меняется при переходе от моно к стереозрению.В случае с пианино все более или менее на переднем плане, поэтому подход работает.
Алгоритм, описанный в видео:
- Начните с двух изображений,
im1
иim2
.Они идентичны - Установите зеленый и синий каналы
im1
на ноль.Это создаст красное изображение - Установите красный канал
im2
на ноль.Это создаст голубое изображение. - Смещение двух изображений на определенную величину (в зависимости от глубины объекта), так что
im1
слева и im2
справа.Вам нужно правильно получить этот порядок, потому что красные красно-голубые очки имеют красный слева и голубой справа. - Выполните поэлементное добавление двух сдвинутых изображений.Обратите внимание, что каналы не будут насыщаться.
Вот код Python / OpenCV, который я написал:
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)
Вот изображение, аналогичное тому, что используется в видео:
Вот вывод:
К сожалению, у меня нет красных красно-голубых очков, чтобы убедиться, что это работает.Но, похоже, так и должно быть, по крайней мере, в теории.Возможно, кто-то может исправить меня, если я допустил ошибку.