如何使用MATLAB和图像工具创建三维街景图像?
如何使用MATLAB从2D图像创建3D立体图像?我误解了你的问题(人们已经指出这不清楚),或者你误解了3D视觉的工作方式。您不会“使用3D玻璃查看2D图像”。3D视觉是通过分别向左眼和右眼提供两种不同的图像(左图像和右图像)来实现的。从根本上讲,MATLAB与之无关 因此,在没有一个容易理解或连贯的问题的情况下,我所能做的就是假设你想要这样的东西:你有一张2D图像,但你仍然想“看到3d图像格式”。在这种情况下,您需要以某种方式将单个图像拆分为两个新图像:如何使用MATLAB和图像工具创建三维街景图像?,matlab,image-processing,matlab-cvst,Matlab,Image Processing,Matlab Cvst,如何使用MATLAB从2D图像创建3D立体图像?我误解了你的问题(人们已经指出这不清楚),或者你误解了3D视觉的工作方式。您不会“使用3D玻璃查看2D图像”。3D视觉是通过分别向左眼和右眼提供两种不同的图像(左图像和右图像)来实现的。从根本上讲,MATLAB与之无关 因此,在没有一个容易理解或连贯的问题的情况下,我所能做的就是假设你想要这样的东西:你有一张2D图像,但你仍然想“看到3d图像格式”。在这种情况下,您需要以某种方式将单个图像拆分为两个新图像: 左眼的左图 右眼的正确图像 这不是小事。
- 从两个图像开始,
和im1
。它们是一样的im2
- 将
的绿色和蓝色通道设置为零。这将创建红色图像im1
- 将
的红色通道设置为零。这将创建青色图像im2
- 将两幅图像偏移一定量(取决于拍摄对象的深度),使
位于左侧,而im1
位于右侧。您需要正确获取此订单,因为3D红色青色眼镜的左侧为红色,右侧为青色im2
- 执行两个移位图像的元素相加。请注意,没有通道会饱和
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红色青色眼镜来验证这一点。但至少在理论上,这似乎是应该的。如果我犯了错误,也许有人可以纠正我。如果你从稍微不同的角度拍摄了两张照片,这就容易多了。您可以通过对两幅图像进行校正来创建立体立体浮雕。相关功能包括计算机视觉系统工具箱中的
estimateuncalibratedrectification
和stereoAnaglyph
。参见示例
或者,您可以使用校准摄像机,然后使用
recifyStereoImages
功能。请参阅。问题是什么?你尝试过什么?我认为如果你有3D数据,创建它会更容易,因为那时你只需要创建两个具有不同视角的投影。@carlosdc@Itamar Katz:如果我想使用3D玻璃查看2D图像,它将被视为3D图像格式。。这样地。或者其他任何方式都可以用三维方式看到它?非常感谢@misha。。但我想这样看视频链接,就像那样谢谢Abhi。基本上,第一个链接描述了我所做的事情。计算深度图,制作第二幅图像。我不确定置换过滤器的实际实现。第二个链接并不是那么重要——它不是一个立体图像,它只是实现了一种伪3D效果。如果这是你想要的,那么它的实现就相当简单,只需完全按照那个孩子在视频中说的去做。稍后我可能会看第三个视频——有点长,现在已经很晚了。在你的原始问题中加入相关链接,让你清楚地知道你想要什么。谢谢@misha yes you get。我想从2d图像中添加伪3D效果。我只是根据视频链接实现简单的3d效果。如果您有关于它的代码,请回复我….-阿披索你想要的是第二个视频——youtube.com/watch?v=g_JRHtHpuSY?我用一些OpenCV源代码更新了我的答案。移植到matlab应该不难——我将把它留给你。@misha,我是matlab新手,你能告诉我如何在matlab中执行你的代码吗?谢谢你的回答。。如果我们只有一个图像,那么我们可以制作立体图像吗??