- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如何使用 MATLAB 从 2D 图像创建 3D 立体图像?
最佳答案
要么我误解了你的问题(人们已经指出不清楚),要么你误解了 3D 视觉的工作方式。您不会“使用 3D 玻璃看到 2D 图像”。 3D 视觉是通过分别向左眼和右眼提供两个不同的图像(左图像和右图像)来实现的。在基本层面上,MATLAB 与它没有任何关系。
因此,在没有容易理解或连贯的问题的情况下,我能做的最好的就是假设您想要像 this 这样的东西。 : 你有一个单一的 2D 图像,但你仍然想“看到成 3d 图像格式”。在这种情况下,您需要以某种方式将该单个图像拆分为两个新图像:
这不是微不足道的。通常,您从 inferring the depth 开始二维图像中的每个像素。由于您是在“猜测”深度信息,因此这两张新图像不会完美地表示 3D 场景。
接下来,您使用该深度信息将图像分成多个层。它基本上看起来像 child 读物中的弹出式 Papercut :
您可以想出的层数越多,您的深度估计越准确,您的 3D 表示就越逼真。
最后,您将该分层表示从两个不同的位置投影回 2D - 一个用于左眼,一个用于右眼。这会为您提供所需的两个不同图像。
编辑
第二个video您链接到描述了通常称为 anaglyph image 的简化创建.它需要 3D 红青色眼镜——这些眼镜不是他们现在在大多数 3D 影院中使用的偏光眼镜。我说简化的原因是它不区分前景和背景。
为获得最佳效果,您应将前景与背景分开,并将该方法仅应用于前景。这是因为背景通常具有无限深度,并且在从单色视觉到立体视觉时不会改变。在钢琴的情况下,一切或多或少都是前景,所以这种方法有效。
视频描述的算法是:
im1
和 im2
。他们是一样的im1
的绿色和蓝色 channel 设置为零。这将创建红色图像im2
的红色 channel 设置为零。这将创建青色图像。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 红青色眼镜来验证这是否有效。但它似乎应该,至少在理论上是这样。如果我犯了错误,也许有人可以纠正我。
关于matlab - 如何使用带图像工具的 MATLAB 创建 3D 立体图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4720857/
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我试图用这种形式简单地获取数字 28 integer+space+integer+integer+space+integer我试过这个正则表达式 \\s\\d\\d\\s 但我得到了两个数字11 和
最近一直在学习D语言。我一直对运行时感到困惑。 从我能收集到的关于它的信息中,(这不是很多)我知道它是一种有助于 D 的一些特性的运行时。像垃圾收集一样,它与您自己的程序一起运行。但是既然 D 是编译
想问一下这两个正则表达式有区别吗? \d\d\d 与 \d{3} 我已经在我的本地机器上使用 Java 和 Windows 操作系统对此进行了测试,两者都工作正常并且结果相同。但是,当在 linux
我正在学习 Go,而且我坚持使用 Go 之旅(exercise-stringer.go:https://tour.golang.org/methods/7)。 这是一些代码: type IPAddr
我在Java正则表达式中发现了一段令我困惑的代码: Pattern.compile( "J.*\\d[0-35-9]-\\d\\d-\\d\\d" ); 要编译的字符串是: String string
我在 ruby 代码上偶然发现了这个。我知道\d{4})\/(\d\d)\/(\d\d)\/(.*)/是什么意思,但是\1-\2-\3-\4 是什么意思? 最佳答案 \1-\2-\3-\4 是 b
我一直在努力解决这个问题,这让我很恼火。我了解 D 运行时库。它是什么,它做什么。我也明白你可以在没有它的情况下编译 D 应用程序。就像 XoMB 所做的那样。好吧,XoMB 定义了自己的运行时,但是
我有两个列表列表,子列表代表路径。我想找到所有路径。 List> pathList1 List> pathList2 当然是天真的解决方案: List> result = new ArrayList>
我需要使用 Regex 格式化一个字符串,该字符串包含数字、字母 a-z 和 A-Z,同时还包含破折号和空格。 从用户输入我有02-219 8 53 24 输出应该是022 198 53 24 我正在
目标是达到与this C++ example相同的效果: 避免创建临时文件。我曾尝试将 C++ 示例翻译为 D,但没有成功。我也尝试过不同的方法。 import std.datetime : benc
tl;dr:你好吗perfect forwarding在 D? 该链接有一个很好的解释,但例如,假设我有这个方法: void foo(T)(in int a, out int b, ref int c
有什么方法可以在 D 中使用abstract auto 函数吗? 如果我声明一个类如下: class MyClass { abstract auto foo(); } 我收到以下错误: mai
有没有人为内存中重叠的数组切片实现交集?算法在没有重叠时返回 []。 当 pretty-print (使用重叠缩进)内存中重叠的数组切片时,我想要这个。 最佳答案 如果您确定它们是数组,那么只需取 p
我已经开始学习 D,但我在使用 Andrei Alexandrescu 所著的 The D Programming Language 一书中提供的示例时遇到了一些麻烦。由于 int 和 ulong 类
如何创建一个不可变的类? 我的目标是创建一个实例始终不可变的类。现在我只是用不可变的方法和构造函数创建了一个“可变”类。我将其称为 mData,m 表示可变。然后我创建一个别名 alias immut
不久前我买了《The D Programming Language》。好书,很有教育意义。但是,我在尝试编译书中列出的语言功能时遇到了麻烦:扩展函数。 在这本书中,Andrei 写了任何可以像这样调用
我在 D http://www.digitalmars.com/d/2.0/lazy-evaluation.html 中找到了函数参数的惰性求值示例 我想知道如何在 D 中实现可能的无限数据结构,就像
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicate: Could anyone explain these undefined behaviors (i = i++
当前是否可以跨模块扫描/查询/迭代具有某些属性的所有函数(或类)? 例如: source/packageA/something.d: @sillyWalk(10) void doSomething()
我是一名优秀的程序员,十分优秀!