如何将3D点云转换为深度图像?

时间:2016-05-04 09:06:28

标签: c++ image mapping cloud point

对于我的工作,我必须将点云转换为灰度(深度)图像,这意味着云中每个XYZ点的z坐标代表灰色阴影。为了将Z坐标从[z_min,z_max]区间映射到[0..255]区间,我使用了Arduino的map函数:

float map(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }

完成后我需要将结果写入图像,问题是我拥有的云可以有数百万点,所以我不能按顺序将它们逐个写入图像。让我们说我有3000x1000有序XY点。如果我想将它们写入700x300像素的图像,我该怎么办?我希望这个问题很清楚,先谢谢你回答。

1 个答案:

答案 0 :(得分:2)

我设法找到了解决问题的方法。这是一个冗长的堆栈溢出算法,但请耐心等待。我们的想法是将XY灰度点的矢量写为pgm文件。

第1步: cloud_to_greyscale - 将 XYZ点云转换为 XY灰度点向量的函数收到cloud作为参数:

 for each point pt in cloud
     point_xy_greyscale.x <- pt.x
     point_xy_greyscale.y <- pt.y
     point_xy_greyscale.greyscale <- map(pt.z, z_min, z_max, 0, 255)
     greyscale_vector.add(point_xy_greyscale)
 loop

 return greyscale_vector

第2步: greyscale_to_image - 将以前返回的向量写为greyscale_image的函数,该类具有width,{{1}和height成员通常对应于_pixels的双维数组。该函数接收以下参数:unsigned short(将转换为图像)和greyscale_vector,它将帮助我们划分点的x_epsilon像素坐标,知道x 1}}点坐标是浮点数(因此不适合作为数组索引)。

一些背景信息:我处理的是一些名为 widop 的云,所以在我的3D空间中xxwidthydepthz。另外值得注意的是,heighty,因此对于我的问题,图片的integer很容易找到:它是height。要找到图像的y_max - y_min,请按照下面的算法进行操作,如果不清楚,我会回答任何问题,我愿意接受建议。

width

唯一要做的就是将图像写入文件,但这很容易,您可以在上一个链接中找到与pgm格式相关的格式规则。我希望这有助于某人。

EDIT_1:我添加了结果图片。它应该是一条铁路,它相当黑暗的原因是有些物体很高,所以地面物体较暗。

depth image of railway