Benito
Benito

Reputation: 23

Extract points from PointCloud with PCL

I'm using the library PCL to read .pcd point clouds. I need to extract a profile cut of this point cloud. Any idea advice on how to implement such a feature ?

Basically, I want to move a box along the point cloud, and project the points present in the box on 1 plane.

I already did the reading of the point cloud, but I'm a bit stuck with the extraction of sub-point cloud

Upvotes: 2

Views: 2924

Answers (2)

Rooscannon
Rooscannon

Reputation: 316

If you don't need an actual box but a distance threshold to a plane will do try this.

plane can be represented by a unit normal vector (3d) and distance, say norm = (0,0,1), d = 10. This defines a plane z = 10;

create a point on the plane, just (10*0, 10*0, 10*1) -> point_on_plane =(0,0,10)

point distance from plane dist = (p - point_on_plane) .dot(norm)

if fabs(dist) less than threshold, project points on the plane projection = p - dist*norm

to iterate all cross section increase d.

Upvotes: 0

Dexter
Dexter

Reputation: 2480

You can use the pcl::ProjectInliers class which does exactly that: it projects the points onto a parametric model (e.g. plane, sphere, ...). There's even an handy tutorial for it!

Here's an extract from the tutorial which creates a plane and projects the points on it:

  // Create a set of planar coefficients with X=Y=0,Z=1
  pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ());
  coefficients->values.resize (4);
  coefficients->values[0] = coefficients->values[1] = 0;
  coefficients->values[2] = 1.0;
  coefficients->values[3] = 0;

  // Create the filtering object
  pcl::ProjectInliers<pcl::PointXYZ> proj;
  proj.setModelType (pcl::SACMODEL_PLANE);
  proj.setInputCloud (cloud);
  proj.setModelCoefficients (coefficients);
  proj.filter (*cloud_projected);

Upvotes: 4

Related Questions