【问题标题】:GLSL truncated signed distance representation (TSDF) implementationGLSL 截断有符号距离表示(TSDF)实现
【发布时间】:2019-04-29 14:25:25
【问题描述】:

我期待实现 RGB-D 图像的模型重建。首选手机。对于我所读到的,这一切都是通过 TSDF 表示完成的。我现在阅读了很多关于层次结构和其他想法的论文以加快速度,但我的问题是,我仍然不知道如何实际实现这种表示。

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

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

问题是,我唯一的想法是渲染体素网格以存储带符号距离的数据。但是对于每个深度图,我必须再次渲染所有体素并计算所有距离。有什么办法可以反过来渲染吗?

所以我不能渲染深度图的点并将信息存储在体素网格中吗?

如何以有效的方式呈现这种有符号距离表示的实际技术水平?

【问题讨论】:

    标签: c++ opengl-es glsl point-clouds


    【解决方案1】:

    你走在正确的轨道上,这是一个雄心勃勃的项目,但如果你能做到,那就太酷了。

    首先,有必要了解一下这些东西是如何工作的。识别 TSDF 的原始论文由 Curless 和 Levoy 撰写,并且相当容易理解 - 副本是 here。后面还有很多变体,但这是起点。

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

    虽然您可以在 CPU 上实现玩具解决方案,但如果您想获得任何性能,您确实需要认真对待 GPU 编程。我在 Intel i7 CPU 笔记本电脑上构建了一个早期版本。诚然,我没有花时间优化它,但集成单个深度图像需要几十秒。如果你想获得实时(30Hz),那么你需要一些 GPU 编程。

    现在你有了你的 TSFD 数据表示,每一帧你都需要这样做:

    1.计算出相机在世界坐标中相对于 TSDF 的位置。 通常你假设你是时间 t=0 的原点,然后测量你相对于前一帧的相对平移和旋转。最常见的方法是使用称为迭代最近点 (ICP) 的算法。您可以自己实现此功能,也可以使用 PCL 之类的库,但我不确定他们是否有移动版本。我建议您在开始时不使用此功能,只需保持相机和场景静止,稍后再进行移动。

    2。将您拥有的深度图像集成到 TSDF 这意味着 更新 TSDF 与下一个深度图像。您不会丢弃必须更新的信息,而是将新信息与旧信息合并。 您可以通过迭代 TSDF 中的每个体素来做到这一点,并且:

    a) 计算出体素中心到相机的距离

    b) 将点投影到深度相机的图像平面以获得像素坐标(使用上面获得的外部相机位置和可轻松搜索 Kinect 的相机内部参数)

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

    d) 使用像素 x 和 y 坐标加上深度和您的相机属性将该点投影回空间,以获得与该深度对应的 3D 点

    e) 使用值 distance_from_step_d - distance_from_step_a 更新当前体素距离的值(更新通常是现有值加上新值的加权平均值)。

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

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

    here 是一篇真正有用的论文,可以帮助你到达那里。这是一些实际在 PC 上为自己实施 Kinect Fusion 的学生的实验报告。尽管您仍然需要学习 CUDA 或类似的东西来实现它,但它几乎是一个分步指南

    您也可以在GitHub 上查看我的源代码以获取想法,尽管所有关于适用性的正常免责声明都适用。

    祝你好运!

    【讨论】:

      【解决方案2】:

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

      每一帧你都会得到一个 RGB 和一个深度图像。假设这些图像已配准,即 RGB 图像中 (x,y) 处的像素与深度图像中 (x,y) 处的像素表示相同的像素,则您可以使用 RGB 数据创建着色的密集点云.为此,您需要:

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

      所以现在你有一个数组(可能是 640x480)结构,比如 {x,y,z,r,g,b}

      您可以在 GLES 上通过创建一组顶点和渲染点来渲染这些。有一个关于如何做到这一点的讨论here

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-21
        • 1970-01-01
        • 2021-09-11
        • 2023-03-08
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多