1. Statistical Outlier Removal
์ฝ๋๋ [์ด๊ณณ]์์ ๋ค์ด๋ก๋ ๊ฐ๋ฅํฉ๋๋ค. ์ํํ์ผ์ [table_scene_lms400.pcd]์ ์ฌ์ฉํ์์ต๋๋ค.
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/statistical_outlier_removal.h>
// Removing outliers using a StatisticalOutlierRemoval filter
// http://pointclouds.org/documentation/tutorials/statistical_outlier.php#statistical-outlier-removal
int
main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
// *.PCD ํ์ผ ์ฝ๊ธฐ (https://raw.github.com/PointCloudLibrary/data/master/tutorials/table_scene_lms400.pcd)
pcl::PCDReader reader;
reader.read<pcl::PointXYZ> ("table_scene_lms400.pcd", *cloud);
// ํฌ์ธํธ์ ์ถ๋ ฅ
std::cerr << "Cloud before filtering: " << std::endl;
std::cerr << *cloud << std::endl;
// ์ค๋ธ์ ํธ ์์ฑ
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud (cloud); //์
๋ ฅ
sor.setMeanK (50); //๋ถ์์ ๊ณ ๋ คํ ์ด์ ์ ์(50๊ฐ)
sor.setStddevMulThresh (1.0); //Outlier๋ก ์ฒ๋ฆฌํ ๊ฑฐ๋ฆฌ ์ ๋ณด
sor.filter (*cloud_filtered); // ํํฐ ์ ์ฉ
// ์์ฑ๋ ํฌ์ธํธํด๋ผ์ฐ๋ ์ ์ถ๋ ฅ
std::cerr << "Cloud after filtering: " << std::endl;
std::cerr << *cloud_filtered << std::endl;
// ์์ฑ๋ ํฌ์ธํธํด๋ผ์ฐ๋(inlier) ์ ์ฅ
pcl::PCDWriter writer;
writer.write<pcl::PointXYZ> ("table_scene_lms400_inliers.pcd", *cloud_filtered, false);
// ์์ฑ๋ ํฌ์ธํธํด๋ผ์ฐ๋(outlier) ์ ์ฅ
sor.setNegative (true);
sor.filter (*cloud_filtered);
writer.write<pcl::PointXYZ> ("table_scene_lms400_outliers.pcd", *cloud_filtered, false);
return (0);
}
$ Loaded : 460400
$ Filtered : 451410
$ pcl_viewer table_scene_lms400.pcd
$ pcl_viewer StatisticalOutlierRemoval.pcd
$ pcl_viewer StatisticalOutlierRemoval_Neg.pcd
2. Radius Outlier removal
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/radius_outlier_removal.h>
// Removing outliers using a Conditional or RadiusOutlier removal
// http://pointclouds.org/documentation/tutorials/remove_outliers.php#remove-outliers
int
main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
// *.PCD ํ์ผ ์ฝ๊ธฐ (https://raw.github.com/PointCloudLibrary/data/master/tutorials/table_scene_lms400.pcd)
pcl::io::loadPCDFile<pcl::PointXYZ> ("table_scene_lms400.pcd", *cloud);
// ํฌ์ธํธ์ ์ถ๋ ฅ
std::cout << "Loaded : " << cloud->width * cloud->height << std::endl;
// ์คํ์ ํธ ์์ฑ
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
outrem.setInputCloud(cloud); //์
๋ ฅ
outrem.setRadiusSearch(0.01); //ํ์ ๋ฒ์ 0.01
outrem.setMinNeighborsInRadius (10); //์ต์ ๋ณด์ ํฌ์ธํธ ์ 10๊ฐ
outrem.filter (*cloud_filtered); // ํํฐ ์ ์ฉ
// ํฌ์ธํธ์ ์ถ๋ ฅ
std::cout << "Result : " << cloud_filtered->width * cloud_filtered->height << std::endl;
// ์์ฑ๋ ํฌ์ธํธํด๋ผ์ฐ๋(inlier) ์ ์ฅ
pcl::PCDWriter writer;
writer.write<pcl::PointXYZ> ("Radius_Outlier_Removal.pcd", *cloud_filtered, false);
// ์์ฑ๋ ํฌ์ธํธํด๋ผ์ฐ๋(outlier) ์ ์ฅ
outrem.setNegative (true);
outrem.filter (*cloud_filtered);
writer.write<pcl::PointXYZ> ("Radius_Outlier_Removal_Neg.pcd", *cloud_filtered, false);
return (0);
}
$ Loaded : 460400
$ Result : 455495
$ pcl_viewer table_scene_lms400.pcd
$ pcl_viewer Radius_Outlier_Removal.pcd
$ pcl_viewer Radius_Outlier_Removal_Neg.pcd