![]() |
如何使用带有图像工具的MATLAB创建3D立体图像?
如何使用MATLAB从2D图像创建3D立体图像?
[B]回答:[/B] 我是在误解您的问题(人们已经指出这一点尚不清楚),或者您是在误解3D视觉的工作方式。您不会“使用3D玻璃查看2D图像”。通过分别向左眼和右眼提供两个不同的图像(左图像和右图像)来实现3D视觉。从根本上讲,MATLAB与它无关。 因此,在没有一个容易理解或连贯的问题,我能做的最好的是假设你想要的东西,像[URL="http://make3d.cs.cornell.edu/"]这样[/URL] :你是一个单一的2D图像,但你还是想“看到成3D图像格式”。在这种情况下,您需要以某种方式将单个图像拆分为两个新图像: [LIST=1][*]左眼的左图[*]右眼的右图[/LIST]这不是小事。通常,您首先要[URL="http://www.cs.cornell.edu/~asaxena/learningdepth/"]推断[/URL] 2D图像中每个像素[URL="http://www.cs.cornell.edu/~asaxena/learningdepth/"]的深度[/URL] 。由于您正在“猜测”深度信息,因此这两个新图像将不能完美地表示3D场景。 接下来,使用该深度信息将图像分成多个层。从本质上来说,它看起来像是一本儿童读物的弹出窗口: [IMG]https://i.stack.imgur.com/FKMLr.jpg[/IMG] 您可以提出的图层越多,深度估计越准确,则3D表示将越真实。 最后,您可以将分层表示从两个不同的位置投影回2D上-一个用于左眼,一个用于右眼。这将为您提供所需的两个不同的图像。 [B]编辑[/B] 链接到的第二个[URL="http://www.youtube.com/watch?v=g_JRHtHpuSY"]视频[/URL]描述了通常称为[URL="http://en.wikipedia.org/wiki/Anaglyph_image"]立体浮雕图像[/URL]的[I]简化[/I]创建。它需要3D红青色眼镜-这些[B]不是[/B]现在大多数3D影院中使用的偏光眼镜。我说[I]简化[/I]的原因是它不会区分前景和背景。 为了获得最佳效果,您需要将前景与背景分开,然后仅将方法应用于前景。这是因为通常背景具有无限的深度,并且从单声道变为立体视觉时不会改变。在钢琴的情况下,所有事物或多或少都是前景,因此该方法可行。 视频描述的算法是: [LIST][*]从两个图像im1和im2 。他们是相同的[*]将im1的绿色和蓝色通道设置为零。这将创建红色图像[*]将im2的红色通道设置为零。这将创建青色图像。[*]将两个图像偏移一定的量(取决于被摄对象的深度),以使im1在左侧, im2在右侧。您需要正确获得此订单,因为3D红-青色眼镜的左侧为红色,右侧为青色。[*]对两个偏移的图像进行逐元素加法。请注意,没有通道会饱和。[/LIST]这是我编写的一些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): # [url]http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html[/url] # red goes on the left, cyan on the right: # [url]http://en.wikipedia.org/wiki/Anaglyph_image[/url] # 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) 这是与视频中使用的图像类似的图像: [IMG]https://i.stack.imgur.com/AWaBc.jpg[/IMG] 这是输出: [IMG]https://i.stack.imgur.com/0RsgA.jpg[/IMG] 不幸的是,我没有3D红青色眼镜来验证它是否有效。但似乎至少在理论上应该如此。如果我犯了一个错误,也许有人可以纠正我。 [url=https://stackoverflow.com/questions/4720857]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 23:28。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.