PCL-Cpp (70%)

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

์›๋ณธ

๊ฒฐ๊ณผ

๊ฒฐ๊ณผ(SetNegarive)

์›๋ณธ(ํ™•๋Œ€)

๊ฒฐ๊ณผ(ํ™•๋Œ€)

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

์›๋ณธ

๊ฒฐ๊ณผ

๊ฒฐ๊ณผ(SetNegarive)

Removing outliers using a StatisticalOutlierRemoval filter

๋‚ด๋ถ€ ์ฝ”๋“œ ์„ค๋ช… :PCL Series 6 - Statistical Filtering (outlier point culling)

Removing outliers using a Radius Outlier removal

๋‚ด๋ถ€ ์ฝ”๋“œ : PCL Series 7 - Radius Filtering (outlier point culling)

Last updated

Was this helpful?