Question

I have the following code to estimate and show normal vectors for points in my point cloud:

int main(int argc, char* argv[]) {

      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

      if (pcl::io::loadPCDFile<pcl::PointXYZ> ("coffee_mug_1_1_1.pcd", *cloud) == -1) //* load the file
      {
        PCL_ERROR ("Couldn't read file coffee_mug_1_1_1.pcd \n");
        return (-1);
      }
      std::cout << "Loaded "
                << cloud->width * cloud->height
                << " data points from test_pcd.pcd with the following fields: "
                << std::endl;


      pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
      ne.setInputCloud (cloud);

      // Create an empty kdtree representation, and pass it to the normal estimation object.
      // Its content will be filled inside the object, based on the given input dataset (as no other search surface is given).
      pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
      ne.setSearchMethod (tree);

      // Output datasets
      pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);

      // Use all neighbors in a sphere of radius 3cm
      ne.setRadiusSearch (0.03);

      // Compute the features
      ne.compute (*cloud_normals);

      cout << "Computed normals " << cloud_normals->width * cloud_normals->height << cloud_normals->points[0] << endl;    

      pcl::visualization::PCLVisualizer viewer("PCL Viewer");

      viewer.setBackgroundColor(0.0, 0.0, 0.5);
      viewer.addPointCloud(cloud);
      viewer.addPointCloudNormals<pcl::PointXYZ,pcl::Normal>(cloud, cloud_normals);
      while (!viewer.wasStopped ())
      {
          viewer.spinOnce ();
      }
}

However, when I run it the PCLVisualizer flashes on the screen and then the program terminates. I have no idea why it doesn't stay. If I use a CloudViewer just to display the point cloud (not the normals), this works fine and stays on the screen.

Was it helpful?

Solution 2

I have found the problem I had here, I was not linking against the boost libs that I was compiling against as I had /usr/lib in my link library path

OTHER TIPS

3 things you can check:

  1. Check that indeed you read your file with no error. You can put a cin.get() right after PCL_ERROR ("Couldn't read file coffee_mug_1_1_1.pcd \n"); so that it doesn't exit directly in case it couldn't read the file.
  2. Probably you should give a different id to your normals if you want to visualize them, because I think that now, both your cloud and the nomals use the id "cloud". Check the PCL example on normal visualization. (e.g. viewer.addPointCloud(cloud, "cloud"); viewer.addPointCloudNormals<pcl::PointXYZ,pcl::Normal>(cloud, cloud_normals, 10, 0.05, "normals");
  3. Make sure you get valid values for your normals.

If nothing from those works, could you maybe upload your coffee mug pcd somewhere and provide a link?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top