2017-04-03 107 views
0

我想在類型的點雲數據集分配單個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實例上顯示不同的彩色點雲?不知道這是否可能。

任何幫助非常感謝!

回答

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; 
+0

所以,我可能會更好過與存儲的RGB值旁邊的點雲,而不是迭代堅持?之後我可以使用PCLVisualizer中的功能。就像你說的那樣,這似乎不值得付出努力。 – macourtney7

+0

你的方法是一種可能性。或者,您可以有一個巨大的點雲,並使用像pcl :: PointXYZL之類的東西,其中L代表Label或pcl :: PointXYZI和Intensity。然後你可以使用PointCloudColorHandlerLabelField或PointCloudColorHandlerGenericField。但是,然後你並不真正選擇可視化中的顏色值。 –

+0

然而,即使在這種情況下,如果你看看PCL的代碼,他們會使用很多循環。所以你並沒有擺脫這種情況。 –