我该如何使用MATLAB从2D图像创建3D立体图像?
我该如何使用MATLAB从2D图像创建3D立体图像?
你能提出更多层次,并且深度估计越准确,你的3D表示就会更加真实。
最后,你将分层表示投影回两个不同位置的2D图像--一个用于左眼,一个用于右眼。这给了你需要的两个不同的图像。
编辑
你链接的第二个video描述了常被称为anaglyph image的简化创建过程。它需要3D红青眼镜--这些不是现在大多数3D电影院使用的偏振眼镜。我之所以说简化,是因为它没有区分前景和背景。
为了达到最佳效果,你应该将前景与背景分开,并仅对前景应用此方法。这是因为通常背景具有无限深度,在从单眼视觉转换为立体视觉时不会改变。对于钢琴的情况,几乎所有东西都是前景,所以这种方法有效。
视频描述的算法是:
im1
和 im2
。它们是相同的。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)
这是输出结果:
很遗憾我没有3D红青眼镜来验证这是否有效。但在理论上看起来应该是有效的。如果我犯了错误,也许有人可以纠正我。
如果您有两张从稍微不同的视角拍摄的图像,那么这将更容易实现。您可以通过对这两个图像进行矫正来创建立体眼镜效果。计算机视觉系统工具箱中的相关函数是estimateUncalibratedRectifiation
和stereoAnaglyph
。请参见未校准立体图像矫正示例。
或者,您可以使用Stereo Camera Calibrator app校准相机,然后使用recifyStereoImages
函数。请参见Stereo Calibration and Scene Reconstruction。