在上一篇我們利用realsense_grabber採集了點雲數據,但是運行一下就會發現,直接使用的話根本達不到實時的要求,也就是個1HZ的刷新率,所以我們需要對它進行下采樣,減少點雲個數,從而提高處理速度。這裏我們使用的是VoxelGrid類。
使用體素化網格方法實現下采樣,即減少點的數量,減少點雲數據,並同時保持點雲的形狀特徵,在提高配準、曲面重建、形狀識別等算法速度中非常實用。PCL實現的VoxelGrid類通過輸入的點雲數據創建一個三維體素柵格(可把體素柵格想象爲微小的空間三維立方體的集合),然後在每個體素(即,三維立方體)內,用體素中所有點的重心來近似顯示體素中其他點,這樣該體素就內所有點就用一個重心點最終表示,對於所有體素處理後得到過濾後的點雲。這種方法比用體素中心來逼近的方法更慢,但它對於採樣點對應曲面的表示更爲準確。通過使用這種方法可以保留原始點雲的形狀等邊界信息。
/ 創建濾波器對象
pcl::VoxelGrid<pcl::PointXYZI> sor;
sor.setInputCloud(cloud);
sor.setLeafSize(0.01f, 0.01f, 0.01f);
sor.filter(*cloud_filtered);
std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height
<< " data points (" << pcl::getFieldsList(*cloud_filtered) << ").";
顯示之後點雲數據至少下降了十倍,然而邊緣信息還是很好的。