2016-11-12 83 views
2

我期待实现RGB-D图像的模型重构。首选在手机上。对于我来说,这一切都是以TSDF表示完成的。我现在通过分层结构和其他想法冲破了很多论文来加速这一点,但是我的问题是,我仍然不知道如何真正实现这种表示。GLSL截断签名距离表示(TSDF)实现

如果我有一个大小为体积网格,因此n×n的X n和我想在每个像素的符号距离,重量和颜色信息存储。我唯一的猜测是,我必须为每个体素位置建立一组离散的点。用GLSL“绘制”所有这些点并计算最近的距离。但是,计算这个n^3次似乎不是很好或有效。

我怎么能想象实现这样的TSDF表示?

的问题是,我唯一的想法就是使体素电网签订距离的数据存储。但是对于每个深度图,我必须再次渲染所有体素并计算所有距离。有什么方法可以让它反过来吗?

所以我不能呈现深度图和存储信息的体素网格点?

如何艺术的实际状态来呈现一种有效的方式这样一个符号距离的代表性?

回答

6

你是在正确的轨道上,这是一个雄心勃勃的项目,但非常酷的,如果你能做到这一点。

首先,值得一个好主意这些事情是如何工作的。标识TSDF的原始文件由Curless和Levoy提供,并且合理易行 - 副本为here。有许多后来的变化,但这是起点。

其次,您需要按照您的说法创建nxnxn存储。这很快就会变大。例如,如果您想要具有RGB数据和浮点数值的400x400x400像素来计算距离和重量,那么这将是768MB的GPU内存 - 您可能需要检查移动设备上有多少GPU可用内存。是啊,我说GPU是因为...

虽然可以实现对CPU玩具的解决方案,你真的需要认真对待GPU编程如果你想有什么样的表现。我在英特尔i7 CPU笔记本电脑上构建了一个早期版本。无可否认,我没有花时间优化它,但需要几十秒来集成单个深度图像。如果你想得到实时(30Hz),那么你需要一些GPU编程。

现在,你有你的TSFD数据表示,你需要做的每一帧:相机在哪里,在世界对于TSDF

1.工作了坐标。 通常假定你是时间t = 0的原点,然后测量相对于前一帧的相对平移和旋转。执行此操作的最常见方法是使用称为迭代最近点(ICP)的算法。您可以自己实现此操作,也可以使用像PCL这样的库,但我不确定它们是否具有移动版本。我建议你在没有这个的情况下开始使用,只需保持相机和场景静止不动,并在稍后进行移动。

2.将你的深度图像到TSDF这意味着更新下一个深度图像的TSDF。你不会丢弃你有的信息,你会将新信息与旧信息合并。 您可以通过在你的TSDF遍历每个体素做到这一点,:

一)从体素中心的距离摸出相机

b)项目点到你的深度相机的图像平面得到一个像素坐标(使用上述得到的外在照相机位置和照相机,其是易于搜索用于超高动力学固有参数)

c)中查找了在该像素处的深度图中的深度坐标

d)项目这个点回到使用像素x和y坐标加上深度的空间e)使用值distance_from_step_d - distance_from_step_a更新当前体素距离的值(更新通常是现有值加上新值的加权平均值)。

您可以对体素颜色使用类似的方法。

将所有深度图集成到TSDF后,可以通过光线跟踪或提取ISO表面(3D网格)并在另一个包中查看结果来可视化结果。

A 真的有用的纸张,会让你在那里是here。这是一些实际上在PC上实施Kinect Fusion的学生的实验报告。这几乎是一步一步的指导,虽然你仍然必须学习CUDA或类似的实现它

你也可以看看我的源代码GitHub的想法,虽然所有正常的免责声明适用于适用性。

祝你好运!

3

当我发布我的其他答案后,我想到了另一种方法,似乎与您的问题的第二部分相匹配,但它绝对不是重构,也不涉及使用TSDF。它实际上是一个可视化,但它很简单:)

每帧你得到一个RGB和深度图像。假设这些图像是注册的,即RGB图像中(x,y)处的像素表示与深度图像中(x,y)处的像素相同的像素,则可以创建使用RGB数据着色的密集点云。要执行此操作,您需要:

对于深度图中的每个像素 a)使用摄像机的固有矩阵(K),该点的地图像素坐标和深度值将点投影到3D点b)将相同像素处的RGB值与空间中的该点相关联

因此,现在您有一个(可能为640x480)像{x,y,z,r,g,b}}结构的数组,

只需创建一组顶点和渲染点,就可以在GLES上渲染这些图像。有一个关于如何做到这一点的讨论here

用这种方法你扔掉每一帧的数据并从头开始重做。重要的是,你没有得到重建的表面,并且你不使用TSDF。你可以得到漂亮的结果,但这不是重建。