如何使用MATLAB从2D图像创建3D立体图像?

有帮助吗?

解决方案

我要么误解您的问题(人们已经指出这还不清楚),要么您误解了3D视觉的工作方式。您不会“使用3D玻璃查看2D图像”。通过在左眼和右眼上分别提供两个不同图像,左图和右图像来实现3D视觉。在基本层面上,Matlab与它无关。

因此,在没有容易理解或连贯的问题的情况下,我能做的最好的就是假设您想要类似的东西 这个: :您有一个2D图像,但您仍然想“看到3D图像格式”。在这种情况下,您需要以某种方式将单个图像分为两个新图像:

  1. 左眼的左图
  2. 右眼的正确图像

这不是微不足道的。通常,你从 推断深度 2D图像中的每个像素。由于您正在“猜测”深度信息,因此这两个新图像不会是3D场景的完美表示。

接下来,使用该深度信息将图像分为层。从本质上看,它看起来像是一本儿童读物的弹出式切口:

alt text

您可以提出的层数越多,您的深度估计越准确,您的3D表示越现实。

最后,您将分层表示从两个不同的位置回到2D上 - 一个用于左眼,另一个用于右眼。这为您提供了您需要的两个不同图像。

编辑

第二 视频 您链接到描述 简化 创建通常被称为 Anaglyph图像. 。它需要3D红色 - 鸡眼镜 - 这些是 不是 他们现在在大多数3D剧院中使用的两极化眼镜。我说的原因 简化 是它没有区分前景和背景。

为了获得最佳效果,您将前景与背景区分开,然后仅将方法应用于前景。这是因为通常背景具有无限的深度,并且从单声道到立体声视觉时不会变化。在钢琴的情况下,一切或多或少都是前景,因此方法可以正常工作。

视频描述的算法是:

  • 从两个图像开始 im1im2. 。他们是相同的
  • 设置绿色和蓝色通道 im1 零。这将创建红色图像
  • 设置红色通道 im2 零。这将创建青色图像。
  • 将这两个图像偏移一定的指定金额(取决于主题的深度),这样 im1 在左边 im2 在右边。您需要正确获取此订单,因为3D红色鸡玻璃的左侧有红色,右侧有青色。
  • 执行两个移位图像的元素添加。请注意,没有任何通道会饱和。

这是我写的一些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红色 - 鸡眼镜来验证这是否有效。但至少在理论上似乎应该应该这样做。如果我犯了一个错误,也许有人可以纠正我。

其他提示

如果您从略有不同的角度拍摄了两张图像,这要容易得多。您可以通过纠正这两个图像来创建立体声盲符。相关功能是 estimateUncalibratedRectifiationstereoAnaglyph 在计算机视觉系统工具箱中。看到 未校准的立体图像纠正 例子。

或者,您可以使用 立体声相机校准器应用程序, ,然后使用 recifyStereoImages 功能。看到 立体声校准和场景重建.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top