对于我的工作,我必须将点云转换为灰度(深度)图像,这意味着云中每个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像素的图像,我该怎么办?我希望这个问题很清楚,先谢谢你回答。
答案 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空间中x
是x
,width
是y
和depth
是z
。另外值得注意的是,height
是y
,因此对于我的问题,图片的integer
很容易找到:它是height
。要找到图像的y_max - y_min
,请按照下面的算法进行操作,如果不清楚,我会回答任何问题,我愿意接受建议。
width
唯一要做的就是将图像写入文件,但这很容易,您可以在上一个链接中找到与pgm格式相关的格式规则。我希望这有助于某人。
EDIT_1:我添加了结果图片。它应该是一条铁路,它相当黑暗的原因是有些物体很高,所以地面物体较暗。