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

对于我的工作,我必须将点云转换为灰度(深度)图像,这意味着云中每个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; }

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

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

步骤1:cloud_to_greyscale – 将XYZ点云转换为XY灰度点矢量并将云作为参数接收的函数:

 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的函数,该类具有宽度,高度和_pixels成员,通常对应于无符号short的双维数组.该函数接收以下参数:一个greyscale_vector(将被转换为图像)和一个x_epsilon,它将帮助我们划分我们点的x像素坐标,知道x点坐标是浮点数(因此不适合作为数组索引) .

一点背景信息:我在做一个叫做widop clouds的东西,所以在我的3D空间中x是宽度,y是深度,z是高度.另外值得注意的是,y是一个整数,因此对于我的问题,图像的高度很容易找到:它是y_max – y_min.要找到图像的宽度,请遵循以下算法,如果不清楚,我会回答任何问题,我愿意接受建议.

img_width <- 0;    // image width
img_height <- y_max - y_min + 1    // image height

// determining image width
for each point greyscale_xy_point in greyscale_vector
    point_x_cell <- (pt.x - x_min) * x_epsilon * 10

    if point_x_cell > img_width
        img_width <- point_x_cell + 1
loop

// defining and initializing image with the calculated height and width
greyscale_img(img_width, img_height)

// initializing greyscale image points
for y <- 0 to greyscale_img.height
    for x <- 0 to greyscale_img.width
        greyscale_img[y][x] = 0
    loop
loop

// filling image with vector data
for each point point_xy_greyscale in greyscale_vector
    image_x = (point_xy_greyscale.x - x_min) * x_epsilon * 10
    image_y = point_xy_greyscale.y - y_min

    greyscale_image[image_y][image_x] = point_xy_greyscale.greyscale
loop

return greyscale_image

剩下要做的唯一事情是将图像写入文件,但这很容易做到,您可以在上一个链接中找到与pgm格式相关的格式规则.我希望这可以帮助别人.

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

depth image of railway

点赞