void run (const char* file_name, float voxel_size) { PointCloud<PointXYZ>::Ptr points_in (new PointCloud<PointXYZ> ()); PointCloud<PointXYZ>::Ptr points_out (new PointCloud<PointXYZ> ()); // Get the points and normals from the input vtk file if ( !vtk_to_pointcloud (file_name, *points_in) ) return; // Build the octree with the desired resolution ORROctree octree; octree.build (*points_in, voxel_size); // Now build the octree z-projection ORROctreeZProjection zproj; zproj.build (octree, 0.15f*voxel_size, 0.15f*voxel_size); // The visualizer PCLVisualizer viz; show_octree(&octree, viz); show_octree_zproj(&zproj, viz); #ifdef _SHOW_POINTS_ // Get the point of every full octree leaf octree.getFullLeafPoints (*points_out); // Add the point clouds viz.addPointCloud (points_in, "cloud in"); viz.addPointCloud (points_out, "cloud out"); // Change the appearance viz.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud in"); viz.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "cloud out"); viz.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_COLOR, 1.0, 0.0, 0.0, "cloud out"); #endif // Enter the main loop while (!viz.wasStopped ()) { //main loop of the visualizer viz.spinOnce (100); boost::this_thread::sleep (boost::posix_time::microseconds (100000)); } }
void run (const char* file_name, float voxel_size) { PointCloud<PointXYZ>::Ptr points_in (new PointCloud<PointXYZ> ()); PointCloud<PointXYZ>::Ptr points_out (new PointCloud<PointXYZ> ()); PointCloud<Normal>::Ptr normals_in (new PointCloud<Normal> ()); PointCloud<Normal>::Ptr normals_out (new PointCloud<Normal> ()); // Get the points and normals from the input vtk file #ifdef _SHOW_OCTREE_NORMALS_ if ( !vtk_to_pointcloud (file_name, *points_in, &(*normals_in)) ) return; #else if ( !vtk_to_pointcloud (file_name, *points_in, NULL) ) return; #endif // Build the octree with the desired resolution ORROctree octree; if ( normals_in->size () ) octree.build (*points_in, voxel_size, &*normals_in); else octree.build (*points_in, voxel_size); // Get the first full leaf in the octree (arbitrary order) std::vector<ORROctree::Node*>::iterator leaf = octree.getFullLeaves ().begin (); // Get the average points in every full octree leaf octree.getFullLeavesPoints (*points_out); // Get the average normal at the points in each leaf if ( normals_in->size () ) octree.getNormalsOfFullLeaves (*normals_out); // The visualizer PCLVisualizer viz; // Register a keyboard callback CallbackParameters params(octree, viz, leaf); viz.registerKeyboardCallback (keyboardCB, static_cast<void*> (¶ms)); // Add the point clouds viz.addPointCloud (points_in, "cloud in"); viz.addPointCloud (points_out, "cloud out"); if ( normals_in->size () ) viz.addPointCloudNormals<PointXYZ,Normal> (points_out, normals_out, 1, 6.0f, "normals out"); // Change the appearance viz.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud in"); viz.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "cloud out"); viz.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_COLOR, 1.0, 0.0, 0.0, "cloud out"); // Convert the octree to a VTK poly-data object // show_octree(&octree, viz, true/*show full leaves only*/); updateViewer (octree, viz, leaf); // Enter the main loop while (!viz.wasStopped ()) { //main loop of the visualizer viz.spinOnce (100); boost::this_thread::sleep (boost::posix_time::microseconds (100000)); } }