2017-10-16 61 views
0

我是PCL(点云库)的新手,我试图在自定义数据集上实现supervoxel_clustering(this link)。我的点云数据集具有以下字段:X Y Z R G B L1 L2其中R,G,B是0-255和L1和L2之间integer值是 integer标签。在点云库(PCL)的超体素聚类过程中保留自定义字段

应用supervoxel后,我保存点云与其标签:

/// save the labeled cloud 
PointLCloudT::Ptr labeled_cloud = super.getLabeledCloud(); 
pcl::io::savePCDFileASCII("/path/labeled_cloud.pcd", *labeled_cloud); 

我的问题是:如何将我的标签和颜色从原来的点在这个过程中 云转移。我尝试定义自己的点类型,如:X Y Z R G B L1 L2 L3,但点类型的 教程,这不是微不足道的。 一个虚拟解决方案我想到的是,使用KD-tree和转移标签从 supervoxel结果原来的点,但我仍然需要与PCL所有自定义字段来阅读我的 原始分。

任何人都可以帮助我吗?

感谢, 布鲁斯

回答

1

我明白你已经定义的L1和L2场点的类型。

该点从相同的顺序supervoxel_clustering出来,因为他们投入和getLabeledCloud()方法返回所有的原始点。最简单的解决方案是用L1,L2和L3字段定义点云,并将原始点云复制到该类型,然后遍历云并从label_cloud复制标签。

pcl::PointCloud<your_custom_point_type_with_L1_L2_L3> combined_cloud; 
pcl::copyPointCloud(original_cloud, combined_cloud); 

for (int i = 0; i < labeled_cloud->point.size(); i++){ 
    combined_cloud[i].label3 = labeled_cloud[i].label; 
} 
+0

谢谢您的回答。我正在考虑这个解决方案,它很容易但不安全。因为如果在supervoxle过程中,原始点中的一个点将被删除,或者会存在NaN值,或者出于任何其他原因,订单改变,那么仅仅复制标签就会弄得乱七八糟。 – Bruce

+0

但它过滤nan值吗?我认为它没有。如果你看看在你的榜样的milk_cartoon_all_small_clorox.pcd点云好像还楠(XYZ是南,色值存在)点,但在getLabeledCloud()方法返回完全相同的分额和那些确实有XYZ数据是比赛。 – Rooscannon

+0

添加 的std :: COUT << cloud->点[0] << “\ n” 个<< cloud->点[1] << “\ n” 个; 在示例代码,它会打印出 (男,南,南 - 18,23,9,0) (南,南,南 - 18,21,11,0) 您是否执行删除点? – Rooscannon