【问题标题】:How can i convert a point cloud data `(x, y, z)` into a depth map where `(x, y)` has depth `z`?如何将点云数据“(x,y,z)”转换为“(x,y)”具有深度“z”的深度图?
【发布时间】:2022-06-19 01:43:44
【问题描述】:

我在一个文本文件中获得了[(x, y, z) , (norm_x, norm_y, norm_z)] 形式的点云数据。我正在尝试将其转换为 png 或 jpg 图像文件,其中任何点的强度都对应于其深度 (z)

这是一个 stl 3d 文件的样子(左)。右边是我想做的。

感谢大家花时间阅读本文。

【问题讨论】:

  • 在深度图中,x 和 y 是像素位置,而不是 3D 点的 x 和 y。要生成深度图,您通常会投影 3d 点并为每个像素记住深度最低的点。例如。 opengl 渲染场景的深度缓冲区。可能 open3d 有一些功能可以做到这一点。
  • @Micka 是对的。您可以使用来自 Open3D 的render_to_depth_image
  • 考虑到我只使用顶视图来构建深度图,我还需要投影点吗?同样对于投影,我应该使用什么相机矩阵值和旋转矢量?
  • @AliWaqas 是的,您仍然需要投影它们。在针孔相机模型中,(x,y,z) 的投影不仅仅是 (x,y)(请查看 hedivision.github.io/Pinhole.html 中的 eq 1)。因此,您可以编写自己的渲染器,这将是一个很好的练习。但是,如果您只是在寻找答案,您可以利用 Open3D(或任何其他库)的现有功能。您可以查看本教程以了解如何设置摄像机角度和渲染深度图:open3d.org/docs/release/tutorial/visualization/…

标签: opencv 3d computer-vision physics mesh


【解决方案1】:

x_min = -2
x_max = 2
y_min = -1
y_max = 1
z_min = 0
z_max = 1

dx = x_max - x_min
dy = y_max - y_min
dz = z_max - z_min

Ps = []
for (i = 0; i < 1000; ++i) Ps.push([x_min + Math.random()*dx, y_min + Math.random()*dy, z_min + Math.random()*dz])

width = canvas.width
height = canvas.height
context = canvas.getContext('2d')
context.setFillColor('#000000')
context.fillRect(0, 0, width, height)
imagedata = context.getImageData(0, 0, width, height)
data = imagedata.data
w = width - 1
h = height - 1
for (P of Ps) {
  col = Math.round(((P[0] - x_min)/dx)*w)
  row = Math.round(((y_max - P[1])/dy)*h)
  val = ((P[2] - z_min)/dz)*255
  i = 4*(width*row + col)
  if (data[i] < val) data[i] = data[i + 1] = data[i + 2] = val
}
context.putImageData(imagedata, 0, 0)
a.href = canvas.toDataURL()
&lt;canvas id=canvas&gt;HTML5&lt;/canvas&gt;&lt;br&gt;&lt;a id=a&gt;Download&lt;/a&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2013-02-26
    相关资源
    最近更新 更多