2016-03-07 110 views
0

我正在使用點雲庫(PCL),並嘗試從點雲中刪除陰影點。如何正確使用PCL的ShadowPoints類

爲了做到這一點,我使用了ShadowPoints過濾器類。 出於某種原因,它會過濾掉我的點雲 中的所有點,而不管我使用的閾值如何(在附加的代碼中,我使用的是默認閾值,但我嘗試使用各種閾值運行此代碼)。

我在網上搜索了相關數據,但找不到我的問題的答案。我在這裏錯過了什麼?

//input point cloud. 
pcl::PointCloud<pcl::PointXYZRGB>::Ptr sourceCloud(new pcl::PointCloud<pcl::PointXYZRGB>); 
pcl::PointCloud<pcl::PointXYZ>::Ptr sourceCloudBasic(new pcl::PointCloud<pcl::PointXYZ>); 

/* code for filling sourceCloud and sourceCloudBasic*/ 
... 

//output point cloud 
pcl::PointCloud<pcl::PointXYZRGB>::Ptr outCloud(new pcl::PointCloud<pcl::PointXYZRGB>()); 
//filter object 
pcl::ShadowPoints<pcl::PointXYZRGB, pcl::Normal> shadowfilters(true); 
//sets the source point cloud 
shadowfilters.setInputCloud(sourceCloud); 

//calculates normals 
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne; 
ne.setInputCloud(sourceCloudBasic); 
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>()); 
ne.setSearchMethod(tree); 
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>); 
double normalsThreshold = 0.3; 
ne.setRadiusSearch(normalsThreshold); 
ne.compute(*cloud_normals); 

//sets normals into shadowfilters 
shadowfilters.setNormals(cloud_normals); 

//sets threshold 
double shadowThreshold = 0.1; 
shadowfilters.setThreshold(shadowThreshold); 

//filters 
shadowfilters.filter(*outCloud); 

非常感謝!

回答

0

問題解決。網格由嘈雜的深度圖像創建 - 因此法線也是不準確的。它使陰影過濾器將所有事物都標記爲陰影。 放大正常計算的半徑搜索改進了法線貼圖,從而使陰影濾鏡能夠正常工作。