点云库 - 如何将单个 RGB 值分配给整个点云?
Point Cloud Library - How to assign a single RGB value to an entire point cloud?
我想为以下类型的点云数据集中的所有点分配一个 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 实例上显示不同颜色的点云?不确定这是否可能。
非常感谢任何帮助!
好像PCL本身在做一个for循环。
看这里:https://github.com/PointCloudLibrary/pcl/blob/46cb8fe5589e88e36d79f9b8b8e5f4ff4fceb5de/visualization/src/point_cloud_handlers.cpp#L63
所以我想这真的不值得付出努力。
但是,如果您使用 C++11,则可以在 1 行中完成(使用 for_each、转换、范围循环)。
像这样的东西(未经测试):
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;
我想为以下类型的点云数据集中的所有点分配一个 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 实例上显示不同颜色的点云?不确定这是否可能。
非常感谢任何帮助!
好像PCL本身在做一个for循环。 看这里:https://github.com/PointCloudLibrary/pcl/blob/46cb8fe5589e88e36d79f9b8b8e5f4ff4fceb5de/visualization/src/point_cloud_handlers.cpp#L63
所以我想这真的不值得付出努力。 但是,如果您使用 C++11,则可以在 1 行中完成(使用 for_each、转换、范围循环)。 像这样的东西(未经测试):
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;