Как создать трехмерные стрелка с использованием Matlab с помощью инструмента изображения?

StackOverflow https://stackoverflow.com/questions/4720857

Вопрос

Как создать трехмерное стереоскопическое изображение с 2D -изображения с помощью Matlab?

Это было полезно?

Решение

Либо я неправильно понимаю ваш вопрос (люди уже отметили, что это не ясно), либо вы неправильно понимаете, как работает 3D -видение. Вы не видите 2D -изображение, используя 3D Glass ». 3D -зрение достигается путем подачи двух разных изображений, левого изображения и правого изображения, к левому глазу и правому глазу соответственно. На фундаментальном уровне Matlab не имеет к этому никакого отношения.

Итак, в отсутствие легко понятного или последовательного вопроса, лучшее, что я могу сделать, это предположить, что вы хотите что -то вроде это: У вас есть одно 2D -изображение, но вы все еще хотите «увидеть в формате трехмерного изображения». В этом случае вам нужно каким -то образом разделить это единственное изображение на два новых изображения:

  1. Левое изображение для левого глаза
  2. Правильное изображение для правого глаза

Это не тривиально. Как правило, вы начинаете с вывод о глубине каждого пикселя в 2D -изображении. Поскольку вы «угадаете» информацию о глубине, два новых изображения не будут идеальным представлением 3D -сцены.

Затем вы разделяете свое изображение на слои, используя эту информацию о глубине. По сути, это будет похоже на всплывающее вырез из детской книги:

alt text

Чем больше слоев вы можете придумать, и чем точнее ваша оценка глубины, тем более реалистичным будет ваше 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)

Вот аналогичное изображение с тем, что используется в видео:

alt text

Вот выход:

alt text

К сожалению, у меня нет 3D-очков Red-Cyan, чтобы убедиться, что это работает. Но кажется, что это должно, по крайней мере, в теории. Возможно, кто -то сможет исправить меня, если я ошибся.

Другие советы

Это намного проще сделать, если у вас есть два изображения, снятые с немного разных точек зрения. Вы можете создать стерео -анаглиф, исправляя два изображения. Соответствующие функции estimateUncalibratedRectifiation а также stereoAnaglyph В наборе инструментов System Computer Vision. Увидеть Некалиброванное стереоизображение исправление пример.

В качестве альтернативы, вы можете откалибровать свои камеры, используя Приложение калибратора стерео камеры, а затем используйте recifyStereoImages функция Увидеть Калибровка стерео и реконструкция сцены.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top