使用一个环境的或者半径异样消除器来进行异样消除
這個文檔顯示了在濾波模型里面如何使用幾個不同的方法來消除點云里面的異常。
第一步我們將使用一個環境消除濾波器來消除不滿足環境條件的點云。然后我們將學會如何使用一個RadiusOutlierRemoval濾波器來消除在指定范圍內沒有達到指定數量鄰居的點。
代碼
?
#include <iostream> #include <pcl/point_types.h> #include <pcl/filters/radius_outlier_removal.h> #include <pcl/filters/conditional_removal.h>intmain (int argc, char** argv) {if (argc != 2){std::cerr << "please specify command line arg '-r' or '-c'" << std::endl;exit(0);}pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);// Fill in the cloud datacloud->width = 5;cloud->height = 1;cloud->points.resize (cloud->width * cloud->height);for (size_t i = 0; i < cloud->points.size (); ++i){cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);}if (strcmp(argv[1], "-r") == 0){pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;// build the filteroutrem.setInputCloud(cloud);outrem.setRadiusSearch(0.8);outrem.setMinNeighborsInRadius (2);// apply filteroutrem.filter (*cloud_filtered);}else if (strcmp(argv[1], "-c") == 0){// build the conditionpcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond (newpcl::ConditionAnd<pcl::PointXYZ> ());range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (newpcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::GT, 0.0)));range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (newpcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::LT, 0.8)));// build the filterpcl::ConditionalRemoval<pcl::PointXYZ> condrem (range_cond);condrem.setInputCloud (cloud);condrem.setKeepOrganized(true);// apply filtercondrem.filter (*cloud_filtered);}else{std::cerr << "please specify command line arg '-r' or '-c'" << std::endl;exit(0);}std::cerr << "Cloud before filtering: " << std::endl;for (size_t i = 0; i < cloud->points.size (); ++i)std::cerr << " " << cloud->points[i].x << " "<< cloud->points[i].y << " "<< cloud->points[i].z << std::endl;// display pointcloud after filteringstd::cerr << "Cloud after filtering: " << std::endl;for (size_t i = 0; i < cloud_filtered->points.size (); ++i)std::cerr << " " << cloud_filtered->points[i].x << " "<< cloud_filtered->points[i].y << " "<< cloud_filtered->points[i].z << std::endl;return (0); }RadiusOutlierRemoval的背景
下面這個圖片幫助我們可視化了RadiusOutlierRemoval濾波器所做的事情。用戶指定了半徑一定的一個圓圈。如果指定了圓圈中只有一個的,會被去除,那么黃色的點將被去除,如果指定了圓圈中只有2個點的被去除,那么綠色的將會被去除。
ConditionalRemoval背景
不滿足環境的點將被除去
代碼解釋
下面的代碼表示了運行該程序得輸入2個參數,-r代表了運行RadiusOutlierRemoval這個濾波器,而-c代表了conditionRemoval這個濾波器
if (argc != 2){std::cerr << "please specify command line arg '-r' or '-c'" << std::endl;exit(0);}下面的代碼,我們首先定義了PointCloud這個結構,然后把它填滿
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);// Fill in the cloud datacloud->width = 5;cloud->height = 1;cloud->points.resize (cloud->width * cloud->height);for (size_t i = 0; i < cloud->points.size (); ++i){cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);}如果我們選的參數是-r,就會執行下面這段代碼
if (strcmp(argv[1], "-r") == 0){pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;// build the filteroutrem.setInputCloud(cloud);outrem.setRadiusSearch(0.8);outrem.setMinNeighborsInRadius (2);// apply filteroutrem.filter (*cloud_filtered);}首先,我們先創建RadiusOutlierRemoval這個濾波器類,然后把它的參數進行設置,并把它應用到我們的輸入點云中。搜索半徑被設置為0.8,一個點要想被當做是這個點云里面的點,必須保證在0.8cm這個半徑內還存在別的2個點,否則就會被去除。
對于ConditionalRemoval這個類,用戶必須指定-c這個命令
else if (strcmp(argv[1], "-c") == 0){// build the conditionpcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond (newpcl::ConditionAnd<pcl::PointXYZ> ());range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (newpcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::GT, 0.0)));range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (newpcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::LT, 0.8)));// build the filterpcl::ConditionalRemoval<pcl::PointXYZ> condrem (range_cond);condrem.setInputCloud (cloud);condrem.setKeepOrganized(true);// apply filtercondrem.filter (*cloud_filtered);}首先,我們創建了一個點在點云里面的環境。在這個例子里面,我們將把2個比較加入到這個環境中,比0:(GT)大的或者比0.8(LT)小的這兩個比較。
在兩種情況下,上面的代碼將會創建我們將要使用和設置相應的參數給濾波器類。
下面的代碼輸出了濾波前和濾波后的點云
std::cerr << "Cloud before filtering: " << std::endl;for (size_t i = 0; i < cloud->points.size (); ++i)std::cerr << " " << cloud->points[i].x << " "<< cloud->points[i].y << " "<< cloud->points[i].z << std::endl;// display pointcloud after filteringstd::cerr << "Cloud after filtering: " << std::endl;for (size_t i = 0; i < cloud_filtered->points.size (); ++i)std::cerr << " " << cloud_filtered->points[i].x << " "<< cloud_filtered->points[i].y << " "<< cloud_filtered->points[i].z << std::endl;我們可以使用這個
./remove_outliers -c或者這個
./remove_outliers -r下面是結果
Cloud before filtering:0.352222 -0.151883 -0.106395-0.397406 -0.473106 0.292602-0.731898 0.667105 0.441304-0.734766 0.854581 -0.0361733-0.4607 -0.277468 -0.916762 Cloud after filtering:-0.397406 -0.473106 0.292602-0.731898 0.667105 0.441304?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的使用一个环境的或者半径异样消除器来进行异样消除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++派生类的构造函数和析构函数
- 下一篇: 【课题总结】OpenCV 抠图项目实战(