int main (int, char** argv) { std::string filename = argv[1]; std::cout << "Reading " << filename << std::endl; pcl::PointCloud<pcl::PointXYZI>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZI>); if (pcl::io::loadPCDFile<pcl::PointXYZI> (filename, *cloud) == -1) // load the file { PCL_ERROR ("Couldn't read file"); return -1; } std::cout << "points: " << cloud->points.size () << std::endl; // Estimate the surface normals pcl::PointCloud<pcl::Normal>::Ptr cloud_n (new pcl::PointCloud<pcl::Normal>); pcl::NormalEstimation<pcl::PointXYZI, pcl::Normal> norm_est; norm_est.setInputCloud(cloud); pcl::search::KdTree<pcl::PointXYZI>::Ptr treept1 (new pcl::search::KdTree<pcl::PointXYZI> (false)); norm_est.setSearchMethod(treept1); norm_est.setRadiusSearch(0.25); norm_est.compute(*cloud_n); std::cout<<" Surface normals estimated"; std::cout<<" with size "<< cloud_n->points.size() <<std::endl; // Estimate the Intensity Gradient pcl::PointCloud<pcl::IntensityGradient>::Ptr cloud_ig (new pcl::PointCloud<pcl::IntensityGradient>); pcl::IntensityGradientEstimation<pcl::PointXYZI, pcl::Normal, pcl::IntensityGradient> gradient_est; gradient_est.setInputCloud(cloud); gradient_est.setInputNormals(cloud_n); pcl::search::KdTree<pcl::PointXYZI>::Ptr treept2 (new pcl::search::KdTree<pcl::PointXYZI> (false)); gradient_est.setSearchMethod(treept2); gradient_est.setRadiusSearch(0.25); gradient_est.compute(*cloud_ig); std::cout<<" Intesity Gradient estimated"; std::cout<<" with size "<< cloud_ig->points.size() <<std::endl; // Estimate the RIFT feature pcl::RIFTEstimation<pcl::PointXYZI, pcl::IntensityGradient, pcl::Histogram<32> > rift_est; pcl::search::KdTree<pcl::PointXYZI>::Ptr treept3 (new pcl::search::KdTree<pcl::PointXYZI> (false)); rift_est.setSearchMethod(treept3); rift_est.setRadiusSearch(10.0); rift_est.setNrDistanceBins (4); rift_est.setNrGradientBins (8); rift_est.setInputCloud(cloud); rift_est.setInputGradient(cloud_ig); pcl::PointCloud<pcl::Histogram<32> > rift_output; rift_est.compute(rift_output); std::cout<<" RIFT feature estimated"; std::cout<<" with size "<<rift_output.points.size()<<std::endl; // Display and retrieve the rift descriptor vector for the first point pcl::Histogram<32> first_descriptor = rift_output.points[0]; std::cout << first_descriptor << std::endl; return 0; }
int main (int argc, char** argv) { CloudPtr cloud_in (new Cloud); CloudPtr cloud_out (new Cloud); pcl::ScopeTime time("performance"); float endTime; pcl::io::loadPCDFile (argv[1], *cloud_in); std::cout << "Input size: " << cloud_in->width << " by " << cloud_in->height << std::endl; /////////////////////////////////////////////////////////////////////////////////////////// // pcl::PassThrough<PointType> pass; pass.setInputCloud (cloud_in); pass.setFilterLimitsNegative(1); //pass.setKeepOrganized(true); pass.setFilterFieldName ("x"); pass.setFilterLimits (1300, 2200.0); pass.filter (*cloud_out); pass.setInputCloud(cloud_out); pass.setFilterFieldName ("y"); pass.setFilterLimits (8000, 10000); pass.filter (*cloud_out); // pass.setFilterFieldName ("z"); pass.setFilterLimits (-2000, -200); pass.filter (*cloud_out); pcl::octree::OctreePointCloudChangeDetector<pcl::PointXYZI> octree (10.0); // Add points from cloudA to octree octree.setInputCloud (cloud_out); octree.addPointsFromInputCloud (); // Switch octree buffers: This resets octree but keeps previous tree structure in memory. octree.switchBuffers (); // Add points from cloudB to octree octree.setInputCloud (cloud_in); octree.addPointsFromInputCloud (); std::vector<int> newPointIdxVector; // Get vector of point indices from octree voxels which did not exist in previous buffer octree.getPointIndicesFromNewVoxels (newPointIdxVector); // /////////////////////////////////////////////////////////////////////////////////////////// // // std::vector<int> unused; // pcl::removeNaNFromPointCloud (*cloud_in, *cloud_in, unused); // /////////////////////////////////////////////////////////////////////////////////////////// // // pcl::search::Search<PointType>::Ptr searcher (new pcl::search::KdTree<PointType> (false)); // searcher->setInputCloud (cloud_in); // PointType point; // point.x = -10000; // point.y = 0; // point.z = 0; // std::vector<int> k_indices; // std::vector<float> unused2; // //searcher->radiusSearch (point, 100, k_indices, unused2); // searcher->nearestKSearch (point, 500000, k_indices, unused2); // cloud_out->width = k_indices.size (); // cloud_out->height = 1; // cloud_out->is_dense = false; // cloud_out->points.resize (cloud_out->width); // for (size_t i = 0; i < cloud_out->points.size (); ++i) // { // cloud_out->points[i] = cloud_in->points[k_indices[i]]; // } // /////////////////////////////////////////////////////////////////////////////////////////// // // cloud_out->width = cloud_in->width / 10; // cloud_out->height = 1; // cloud_out->is_dense = false; // cloud_out->points.resize (cloud_out->width); // for (size_t i = 0; i < cloud_out->points.size (); ++i) // { // cloud_out->points[i] = cloud_in->points[i * 10]; // } // /////////////////////////////////////////////////////////////////////////////////////////// // pcl::BilateralFilter<PointType> filter; // filter.setInputCloud (cloud_in); // pcl::octree::OctreeLeafDataTVector<int> leafT; // pcl::search::Search<PointType>::Ptr searcher (new pcl::search::Octree // < PointType, // pcl::octree::OctreeLeafDataTVector<int> , // pcl::octree::OctreeBase<int, pcl::octree::OctreeLeafDataTVector<int> > // > (500) ); // //pcl::search::Octree <PointType> ocTreeSearch(1); // filter.setSearchMethod (searcher); // double sigma_s, sigma_r; // // filter.setHalfSize (500); // time.reset(); // filter.filter (*cloud_out); // time.getTime(); // std::cout << "Benchmark Bilateral filer using: kdtree searching, sigma_s = 50, sigma_r = default" << std::endl; // std::cout << "Results: clocks = " << end - start << ", clockspersec = " << CLOCKS_PER_SEC << std::endl; // std::ofstream filestream; // filestream.open ("timer_results.txt"); // char filename[50]; // for (sigma_s = 1000; sigma_s <= 1000; sigma_s *= 10) // for (sigma_r = 0.001; sigma_r <= 1000; sigma_r *= 10) // { // std::cout << "sigma_s = " << sigma_s << ", sigma_r = " << sigma_r << " clockspersec = " << CLOCKS_PER_SEC // << std::endl; // filter.setHalfSize (sigma_s); // filter.setStdDev (sigma_r); // start = clock (); // filter.filter (*cloud_out); // end = clock (); // sprintf (filename, "bruteforce-s%g-r%g.pcd", sigma_s, sigma_r); // pcl::io::savePCDFileBinary (filename, *cloud_out); // filestream << "sigma_s = " << sigma_s << ", sigma_r = " << sigma_r << " time = " << end - start // << " clockspersec = " << CLOCKS_PER_SEC << std::endl; // } // filestream.close (); // std::cout << "Output size: " << cloud_out->width << " by " << cloud_out->height << std::endl; CloudPtr cloud_n (new Cloud); CloudPtr cloud_buff (new Cloud); pcl::io::loadPCDFile ("only_leaves.pcd", *cloud_n); pcl::copyPointCloud(*cloud_in, newPointIdxVector, *cloud_buff); // pcl::io::savePCDFileBinary<pcl::PointXYZI>("delt.pcd",*cloud_buff); cloud_buff->operator+=(*cloud_n); pcl::io::savePCDFileBinary<pcl::PointXYZI>("cropped_cloud.pcd",*cloud_buff); std::cout << std::endl << "Goodbye World" << std::endl << std::endl; return (0); }