-
-
Notifications
You must be signed in to change notification settings - Fork 4.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #702 from VictorLamoine/timoHackel
Model outlier removal contribution
- Loading branch information
Showing
10 changed files
with
864 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
.. _model_outlier_removal: | ||
|
||
Filtering a PointCloud using ModelOutlierRemoval | ||
------------------------------------------------ | ||
|
||
This tutorial demonstrates how to extract parametric models for example for planes or spheres | ||
out of a PointCloud by using SAC_Models with known coefficients. | ||
If you don't know the models coefficients take a look at the :ref:`random_sample_consensus` tutorial. | ||
|
||
The code | ||
-------- | ||
|
||
First, create a file, let's call it ``model_outlier_removal.cpp``, in your favorite | ||
editor, and place the following inside it: | ||
|
||
.. literalinclude:: sources/model_outlier_removal/model_outlier_removal.cpp | ||
:language: cpp | ||
:linenos: | ||
|
||
The explanation | ||
--------------- | ||
|
||
Now, let's break down the code piece by piece. | ||
|
||
In the following lines, we define the PointClouds structures, fill in noise, random points | ||
on a plane as well as random points on a sphere and display its content to screen. | ||
|
||
.. literalinclude:: sources/model_outlier_removal/model_outlier_removal.cpp | ||
:language: cpp | ||
:lines: 7-45 | ||
|
||
Finally we extract the sphere using ModelOutlierRemoval. | ||
|
||
.. literalinclude:: sources/model_outlier_removal/model_outlier_removal.cpp | ||
:language: cpp | ||
:lines: 50-61 | ||
|
||
Compiling and running the program | ||
--------------------------------- | ||
|
||
Add the following lines to your CMakeLists.txt file: | ||
|
||
.. literalinclude:: sources/model_outlier_removal/CMakeLists.txt | ||
:language: cmake | ||
:linenos: | ||
|
||
|
||
After you have made the executable, you can run it. Simply do:: | ||
|
||
$ ./model_outlier_removal | ||
|
||
You will see something similar to:: | ||
|
||
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 | ||
-0.82 -0.341666 0.4592 | ||
-0.728589 0.667873 0.152 | ||
-0.3134 -0.873043 -0.3736 | ||
0.62553 0.590779 0.5096 | ||
-0.54048 0.823588 -0.172 | ||
-0.707627 0.424576 0.5648 | ||
-0.83153 0.523556 0.1856 | ||
-0.513903 -0.719464 0.4672 | ||
0.291534 0.692393 0.66 | ||
0.258758 0.654505 -0.7104 | ||
Sphere after filtering: | ||
-0.82 -0.341666 0.4592 | ||
-0.728589 0.667873 0.152 | ||
-0.3134 -0.873043 -0.3736 | ||
0.62553 0.590779 0.5096 | ||
-0.54048 0.823588 -0.172 | ||
-0.707627 0.424576 0.5648 | ||
-0.83153 0.523556 0.1856 | ||
-0.513903 -0.719464 0.4672 | ||
0.291534 0.692393 0.66 | ||
0.258758 0.654505 -0.7104 | ||
|
12 changes: 12 additions & 0 deletions
12
doc/tutorials/content/sources/model_outlier_removal/CMakeLists.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
cmake_minimum_required(VERSION 2.8 FATAL_ERROR) | ||
|
||
project(model_outlier_removal) | ||
|
||
find_package(PCL 1.7 REQUIRED) | ||
|
||
include_directories(${PCL_INCLUDE_DIRS}) | ||
link_directories(${PCL_LIBRARY_DIRS}) | ||
add_definitions(${PCL_DEFINITIONS}) | ||
|
||
add_executable (model_outlier_removal model_outlier_removal.cpp) | ||
target_link_libraries (model_outlier_removal ${PCL_LIBRARIES}) |
71 changes: 71 additions & 0 deletions
71
doc/tutorials/content/sources/model_outlier_removal/model_outlier_removal.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
#include <iostream> | ||
#include <pcl/point_types.h> | ||
#include <pcl/filters/model_outlier_removal.h> | ||
|
||
int | ||
main () | ||
{ | ||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); | ||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_sphere_filtered (new pcl::PointCloud<pcl::PointXYZ>); | ||
|
||
// 1. Generate cloud data | ||
int noise_size = 5; | ||
int sphere_data_size = 10; | ||
cloud->width = noise_size + sphere_data_size; | ||
cloud->height = 1; | ||
cloud->points.resize (cloud->width * cloud->height); | ||
// 1.1 Add noise | ||
for (size_t i = 0; i < noise_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); | ||
} | ||
// 1.2 Add sphere: | ||
double rand_x1 = 1; | ||
double rand_x2 = 1; | ||
for (size_t i = noise_size; i < noise_size + sphere_data_size; ++i) | ||
{ | ||
// See: http://mathworld.wolfram.com/SpherePointPicking.html | ||
while (pow (rand_x1, 2) + pow (rand_x2, 2) >= 1) | ||
{ | ||
rand_x1 = (rand () % 100) / (50.0f) - 1; | ||
rand_x2 = (rand () % 100) / (50.0f) - 1; | ||
} | ||
double pre_calc = sqrt (1 - pow (rand_x1, 2) - pow (rand_x2, 2)); | ||
cloud->points[i].x = 2 * rand_x1 * pre_calc; | ||
cloud->points[i].y = 2 * rand_x2 * pre_calc; | ||
cloud->points[i].z = 1 - 2 * (pow (rand_x1, 2) + pow (rand_x2, 2)); | ||
rand_x1 = 1; | ||
rand_x2 = 1; | ||
} | ||
|
||
std::cerr << "Cloud before filtering: " << std::endl; | ||
for (size_t i = 0; i < cloud->points.size (); ++i) | ||
std::cout << " " << cloud->points[i].x << " " << cloud->points[i].y << " " << cloud->points[i].z << std::endl; | ||
|
||
// 2. filter sphere: | ||
// 2.1 generate model: | ||
// modelparameter for this sphere: | ||
// position.x: 0, position.y: 0, position.z:0, radius: 1 | ||
pcl::ModelCoefficients sphere_coeff; | ||
sphere_coeff.values.resize (4); | ||
sphere_coeff.values[0] = 0; | ||
sphere_coeff.values[1] = 0; | ||
sphere_coeff.values[2] = 0; | ||
sphere_coeff.values[3] = 1; | ||
|
||
pcl::ModelOutlierRemoval<pcl::PointXYZ> sphere_filter; | ||
sphere_filter.setModelCoefficients (sphere_coeff); | ||
sphere_filter.setThreshold (0.05); | ||
sphere_filter.setModelType (pcl::SACMODEL_SPHERE); | ||
sphere_filter.setInputCloud (cloud); | ||
sphere_filter.filter (*cloud_sphere_filtered); | ||
|
||
std::cerr << "Sphere after filtering: " << std::endl; | ||
for (size_t i = 0; i < cloud_sphere_filtered->points.size (); ++i) | ||
std::cout << " " << cloud_sphere_filtered->points[i].x << " " << cloud_sphere_filtered->points[i].y << " " << cloud_sphere_filtered->points[i].z | ||
<< std::endl; | ||
|
||
return (0); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.