Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 点云库-如何将单个RGB值指定给整个点云?_C++_C++11_Point Cloud Library_Point Clouds - Fatal编程技术网

C++ 点云库-如何将单个RGB值指定给整个点云?

C++ 点云库-如何将单个RGB值指定给整个点云?,c++,c++11,point-cloud-library,point-clouds,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 = *

我想为以下类型的点云数据集中的所有点指定一个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值需要与每个点或至少与点集合相关联,以便可以在一个输出中组合多个点云;每个都有自己独特的颜色

由于存在多个点云,我无法使用以下方法设置颜色:

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

std::tie(rgb, pointcloud) = std::make_tuple(
                                uint32_t, pcl::PointCloud<pcl::PointXYZ>);
然后,也许我可以多次使用PointCloudColorHandlerCustom在同一个PCLVisualizer实例上显示不同颜色的点云?不确定这是否可行


非常感谢您的帮助

似乎PCL本身正在做一个for循环。 看这里:

所以我想这真的不值得努力。 但是,如果您使用C++11,则可以使用for_each、transform、range循环在一行中完成。 类似这样的未经测试:

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值,而不是迭代?之后我可以使用PCLVisualizer中的功能。就像你说的,这似乎不值得努力。你的方法是可能的。或者,您可以使用一个巨大的点云,并使用类似于pcl::PointXYZL的东西,其中L代表标签或具有强度的pcl::PointXYZI。然后可以使用PointCloudColorHandlerLabelField或PointCloudColorHandlerGenericField。但是,在可视化中,你并不真正选择颜色值。然而,即使在这种情况下,如果你查看PCL的代码,它们也会使用很多循环。所以你真的无法逃避,这是真的。我想你的方法和使用图书馆的行为没有什么区别。
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;