如何使用带有图像工具的MATLAB创建3D立体图像?

时间:2011-01-18 05:47:26

标签: matlab image-processing matlab-cvst

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

2 个答案:

答案 0 :(得分:11)

要么我误解你的问题(人们已经指出它不清楚),要么你误解了3D视觉的工作方式。您没有“使用3D玻璃看到2D图像”。通过分别向左眼和右眼提供两个不同的图像(左图像和右图像)来实现3D视觉。从根本上讲,MATLAB与它没有任何关系。

所以,如果没有一个易于理解或连贯的问题,我能做的最好就是假设你想要this这样的东西:你有一个单独的2D图像,但你仍然想“看到3d图像格式”。在这种情况下,您需要以某种方式将该单个图像分成两个新图像:

  1. 左眼左图
  2. 右眼右图
  3. 这不是微不足道的。通常,您从2D图像中每个像素的inferring the depth开始。由于您正在“猜测”深度信息,因此这两个新图像将不是3D场景的完美表现。

    接下来,使用该深度信息将图像分成多个图层。它基本上看起来像儿童书中的弹出式剪纸:

    alt text

    您可以提出的图层越多,深度估算越准确,您的3D表现就越真实。

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

    修改

    您链接的第二个video描述了简化创建的通常称为anaglyph image的内容。它需要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红蓝眼镜验证这是否有效。但它似乎应该,至少在理论上。如果我犯了错误,也许有人可以纠正我。

答案 1 :(得分:0)

如果从两个不同的视角拍摄两张图像,这样做会容易得多。您可以通过纠正两个图像来创建立体浮雕。计算机视觉系统工具箱中的相关功能为estimateUncalibratedRectifiationstereoAnaglyph。请参阅Uncalibrated Stereo Image Rectification示例。

或者,您可以使用Stereo Camera Calibrator app校准相机,然后使用recifyStereoImages功能。请参阅Stereo Calibration and Scene Reconstruction