Как создать трехмерные стрелка с использованием Matlab с помощью инструмента изображения?
-
12-10-2019 - |
Вопрос
Как создать трехмерное стереоскопическое изображение с 2D -изображения с помощью Matlab?
Решение
Либо я неправильно понимаю ваш вопрос (люди уже отметили, что это не ясно), либо вы неправильно понимаете, как работает 3D -видение. Вы не видите 2D -изображение, используя 3D Glass ». 3D -зрение достигается путем подачи двух разных изображений, левого изображения и правого изображения, к левому глазу и правому глазу соответственно. На фундаментальном уровне Matlab не имеет к этому никакого отношения.
Итак, в отсутствие легко понятного или последовательного вопроса, лучшее, что я могу сделать, это предположить, что вы хотите что -то вроде это: У вас есть одно 2D -изображение, но вы все еще хотите «увидеть в формате трехмерного изображения». В этом случае вам нужно каким -то образом разделить это единственное изображение на два новых изображения:
- Левое изображение для левого глаза
- Правильное изображение для правого глаза
Это не тривиально. Как правило, вы начинаете с вывод о глубине каждого пикселя в 2D -изображении. Поскольку вы «угадаете» информацию о глубине, два новых изображения не будут идеальным представлением 3D -сцены.
Затем вы разделяете свое изображение на слои, используя эту информацию о глубине. По сути, это будет похоже на всплывающее вырез из детской книги:
Чем больше слоев вы можете придумать, и чем точнее ваша оценка глубины, тем более реалистичным будет ваше 3D -представление.
Наконец, вы проецируете, что наложенное представление обратно на 2D из двух разных позиций - одно для левого глаза и одно для правого глаза. Это дает вам два разных изображения, которые вам нужны.
РЕДАКТИРОВАТЬ
Секунда видео Вы связаны с описанием упрощен создание того, что обычно называют Анаглиф изображение. Анкет Требуются 3D Красные очки-это нет Поляризованные очки, которые они используют в большинстве 3D -театров сейчас. Причина, по которой я говорю упрощен это то, что он не различает передний план и фон.
Для наилучшего эффекта вы отделяете передний план от фона и применили подход только к переднему плану. Это связано с тем, что, как правило, фон имеет бесконечную глубину и не меняется при переходе от моно к стереозвучному видению. В случае с пианино все более или менее передовое, поэтому подход работает.
Алгоритм, который описывает видео, является:
- Начните с двух изображений,
im1
а такжеim2
. Анкет Они одинаковые - Установить зеленые и синие каналы
im1
ноль. Это создаст красное изображение - Установить красный канал
im2
ноль. Это создаст голубое изображение. - Сметить два изображения на некоторую указанную сумму (в зависимости от глубины к субъекту) так, чтобы
im1
слева иim2
находится справа. Вам нужно правильно получить этот заказ, потому что 3D Red-Cyan очки имеют красный слева, а голубой справа. - Выполните элементный добавление двух смещенных изображений. Обратите внимание, что каналы не будут насыщаться.
Вот какой -то код 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)
Вот аналогичное изображение с тем, что используется в видео:
Вот выход:
К сожалению, у меня нет 3D-очков Red-Cyan, чтобы убедиться, что это работает. Но кажется, что это должно, по крайней мере, в теории. Возможно, кто -то сможет исправить меня, если я ошибся.
Другие советы
Это намного проще сделать, если у вас есть два изображения, снятые с немного разных точек зрения. Вы можете создать стерео -анаглиф, исправляя два изображения. Соответствующие функции estimateUncalibratedRectifiation
а также stereoAnaglyph
В наборе инструментов System Computer Vision. Увидеть Некалиброванное стереоизображение исправление пример.
В качестве альтернативы, вы можете откалибровать свои камеры, используя Приложение калибратора стерео камеры, а затем используйте recifyStereoImages
функция Увидеть Калибровка стерео и реконструкция сцены.