Как создать 3D-стреоскопические изображения с помощью MATLAB с инструментом изображения? - PullRequest
5 голосов
/ 18 января 2011

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

Ответы [ 2 ]

11 голосов
/ 18 января 2011

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

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

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

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

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

alt text

Чем больше слоев вы сможете придумать, и чем точнее будет ваша оценка глубины, тем большереалистичным будет ваше трехмерное представление.

Наконец, вы проецируете это слоистое представление обратно на 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)

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

alt text

Вот вывод:

alt text

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

0 голосов
/ 03 января 2015

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

Кроме того, вы можете откалибровать свои камеры с помощью приложения Калибратор стереокамеры , а затем использовать функцию recifyStereoImages. См. Стереокалибровка и реконструкция сцены .

...