点云库 - 如何将单个RGB值分配给整个点云?

时间:2017-04-03 18:50:15

标签: c++ c++11 point-cloud-library point-clouds

我想将单个RGB值分配给类型为点云数据集中的所有点:

pcl::PointCloud<pcl::PointXYZRGB>

我猜你可以迭代这些点并改变每个值?使用这样的东西:

uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
  static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
point.rgb = *reinterpret_cast<float*>(&rgb);

然而,考虑到我想给所有点相同的值是否有更好的方法?

RGB值需要与每个点或至少点集合相关联,因此可以在一个输出中组合多个点云;每个都有自己独特的颜色。

由于存在多个点云,我无法使用以下内容通过PCLVisualizer设置颜色:

pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> 

我的一个想法就是与点云建立高层关联:

std::tie(rgb, pointcloud) = std::make_tuple(
                                uint32_t, pcl::PointCloud<pcl::PointXYZ>);

那么也许我可以多次使用PointCloudColorHandlerCustom在同一个PCLVisualizer实例上显示不同颜色的点云?不确定这是否可行。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

似乎PCL本身正在进行for循环。 看这里:https://github.com/PointCloudLibrary/pcl/blob/46cb8fe5589e88e36d79f9b8b8e5f4ff4fceb5de/visualization/src/point_cloud_handlers.cpp#L63

所以我想这不值得付出努力。 但是,如果使用C ++ 11,则可以在1行中执行(使用for_each,transform,range-loop)。 像这样(未经测试):

int32_t rgb = (static_cast<uint32_t>(r) << 16 |
  static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
std::transform(cloud->points.begin(), cloud->points.end(), cloud->points.begin(), [rgb](pcl::PointXYZRGB p) { p.rgb = rgb; return p;});

甚至更好的简单范围循环

int32_t rgb = (static_cast<uint32_t>(r) << 16 |
      static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
for(auto &p: cloud->points) p.rgb=rgb;