#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "o3d3xx_camera.h" #include "o3d3xx_framegrabber.h" #include "o3d3xx_image.h" #include void copyCloud(pcl::PointCloud::Ptr &in, pcl::PointCloud::Ptr &out); void testPlanarSegmentation(pcl::PointCloud::Ptr &in); void testRegionGrowing(pcl::PointCloud::Ptr &in); void normal_est(pcl::PointCloud::Ptr &in); pcl::PointXYZ findHighestPoint(pcl::PointCloud::Ptr &in); //void substract_cloud(pcl::PointCloud::Ptr &in, pcl::PointCloud::Ptr &out); int main(int argc, const char **argv) { //logging method o3d3xx::Logging::Init(); //initialise camera constructor expects IP address, using default one o3d3xx::Camera::Ptr cam = std::make_shared("192.168.1.69"); //create buffer to fetch image o3d3xx::ImageBuffer::Ptr img = std::make_shared(); //framegrabber o3d3xx::FrameGrabber::Ptr fg =std::make_shared(cam, o3d3xx::IMG_AMP|o3d3xx::IMG_RDIS|o3d3xx::IMG_CART); if (! fg->WaitForFrame(img.get(), 2000)) { std::cerr << "Timeout waiting for camera!" << std::endl; return -1; } //3D pointcloud pcl::PointCloud::Ptr xfilt (new pcl::PointCloud); pcl::PointCloud::Ptr yfilt (new pcl::PointCloud); pcl::PointCloud::Ptr zfilt (new pcl::PointCloud); //convert o3d3xx cloud to PointXYZ pcl::PointCloud::Ptr temp_cloud = img->Cloud(); pcl::PointCloud::Ptr cloud (new pcl::PointCloud); pcl::PointCloud::Ptr segment (new pcl::PointCloud); copyCloud(temp_cloud,cloud); pcl::PointCloud::Ptr cloud_filtered (new pcl::PointCloud); pcl::PointCloud::Ptr vox_cloud (new pcl::PointCloud); // cut the z axis of pcl pcl::PassThrough passz; passz.setInputCloud (cloud); passz.setFilterFieldName ("z"); passz.setFilterLimits (-0.125,0.105); passz.filter (*zfilt); // cut the y axis of pcl pcl::PassThrough passy; passy.setInputCloud (zfilt); passy.setFilterFieldName ("y"); passy.setFilterLimits (-0.1,0.075); passy.filter (*yfilt); // Create the filtering object pcl::StatisticalOutlierRemoval sor; sor.setInputCloud (yfilt); sor.setMeanK (100); sor.setStddevMulThresh (0.5); sor.filter (*cloud_filtered); // Create the filtering object pcl::VoxelGrid vox; pcl::PointCloud::Ptr cluster_cloud (new pcl::PointCloud); vox.setInputCloud (cloud_filtered); vox.setLeafSize (0.001f, 0.001f, 0.001f); vox.filter (*vox_cloud); //pcl::PCDWriter writer; pcl::PCDReader reader; //writer.write("bottom.pcd", *vox_cloud, false); // 1x pcl::PointCloud::Ptr read_cloud (new pcl::PointCloud); reader.read("bottom.pcd", *read_cloud); pcl::PointXYZ point = findHighestPoint(read_cloud); cout <<"point x: "<< point.x <<" point y: " < passx; passx.setInputCloud (vox_cloud); passx.setFilterFieldName ("x"); passx.setFilterLimits (0.3, .63);//0.3,0.63 passx.filter (*xfilt); normal_est(xfilt); //testPlanarSegmentation(vox_cloud); //substract_cloud(vox_cloud,read_cloud); //pcl::visualization::CloudViewer viewer("Cloud Viewer"); //viewer.showCloud(xfilt); cv::waitKey(0); return 0; } void copyCloud(pcl::PointCloud::Ptr &in, pcl::PointCloud::Ptr &out) { for(int i = 0; i< in->points.size(); i++) { pcl::PointXYZ p = pcl::PointXYZ(in->points[i].x, in->points[i].y, in->points[i].z); out->push_back(p); } } pcl::PointXYZ findHighestPoint(pcl::PointCloud::Ptr &in) { pcl::PointXYZ fp; for(pcl::PointXYZ p : in->points) { if(p.x > fp.x) fp = pcl::PointXYZ(p.x, p.y, p.z); } return fp; } //void substract_cloud(pcl::PointCloud::Ptr &in, pcl::PointCloud::Ptr &out) //{ // return 0; //} void testPlanarSegmentation(pcl::PointCloud::Ptr &in) { pcl::PointCloud::Ptr cloud_f (new pcl::PointCloud); // PLANAR SEGMENTATION // Create the segmentation object pcl::SACSegmentation seg; pcl::PointIndices::Ptr inliers (new pcl::PointIndices); pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); pcl::PointCloud::Ptr cloud_plane (new pcl::PointCloud ()); // Optional seg.setOptimizeCoefficients (true); // Mandatory seg.setModelType (pcl::SACMODEL_PLANE); seg.setMethodType (pcl::SAC_RANSAC); seg.setMaxIterations (100); seg.setDistanceThreshold (0.001); /* seg.setInputCloud (in); seg.segment (*inliers, *coefficients); cout << inliers << " - " << coefficients <points.size (); while (in->points.size () > 0.3 * nr_points) { // Segment the largest planar component from the remaining cloud seg.setInputCloud (in); seg.segment (*inliers, *coefficients); if (inliers->indices.size () == 0) { std::cout << "Could not estimate a planar model for the given dataset." << std::endl; break; } // Extract the planar inliers from the input cloud pcl::ExtractIndices extract; extract.setInputCloud (in); extract.setIndices (inliers); extract.setNegative (false); // Get the points associated with the planar surface extract.filter (*cloud_plane); std::cout << "PointCloud representing the planar component: " << cloud_plane->points.size () << " data points." << std::endl; // Remove the planar inliers, extract the rest extract.setNegative (false); extract.filter (*cloud_f); *in = *cloud_f; } *cloud_plane = *in; // Creating the KdTree object for the search method of the extraction cout << " Clustersize: " << cloud_plane->points.size() << endl; pcl::search::KdTree::Ptr boom (new pcl::search::KdTree); //pcl::search::Search::Ptr boom = boost::shared_ptr > (new pcl::search::KdTree); boom->setInputCloud(cloud_plane); std::vector cluster_indices; pcl::EuclideanClusterExtraction ec; ec.setClusterTolerance (0.2); // 1cm ec.setMinClusterSize (10); ec.setMaxClusterSize (1000); ec.setSearchMethod (boom); ec.setInputCloud (cloud_plane); ec.extract (cluster_indices); /* //SUBSTRACT PCL METHOD pcl::PointIndices::Ptr fInliers (new pcl::PointIndices); //Extract fInliers from the input cloud pcl::ExtractIndices extract; extract.setInputCloud(cloud_plane); extract.setIndices (fInliers); //extract.setNegative (false); //Removes part_of_cloud but retain the original full_cloud extract.setNegative (false); // Removes part_of_cloud from full cloud and keep the rest extract.filter (*in); */ //viewer.addPointCloud(in,"cloud"); /* int j = 0; for (std::vector::const_iterator it = cluster_indices.begin (); it != cluster_indices.end (); ++it) { pcl::PointCloud::Ptr cloud_cluster (new pcl::PointCloud); for (std::vector::const_iterator pit = it->indices.begin (); pit != it->indices.end (); ++pit) cloud_cluster->points.push_back (cloud_filtered->points[*pit]); //* cloud_cluster->width = cloud_cluster->points.size (); cloud_cluster->height = 1; cloud_cluster->is_dense = true; }*/ /* //pcl::visualization::PCLVisualizer viewer ("Cluster viewer"); while (!viewer.wasStopped ()) { viewer.spinOnce(100); } */ cv::waitKey(0); return; } void normal_est(pcl::PointCloud::Ptr &in) { // find the normals pcl::search::Search::Ptr tree = boost::shared_ptr > (new pcl::search::KdTree); pcl::PointCloud::Ptr normals (new pcl::PointCloud); tree->setInputCloud(in); pcl::NormalEstimation normal_estimator; normal_estimator.setSearchMethod (tree); normal_estimator.setInputCloud (in); //normal_estimator.setKSearch (50); normal_estimator.setRadiusSearch (0.02); normal_estimator.compute (*normals); // region growing pcl::RegionGrowing reg; std::vector clusters; reg.setMinClusterSize (10); reg.setMaxClusterSize (1000); reg.setSearchMethod (tree); reg.setNumberOfNeighbours (50); reg.setInputCloud (in); //reg.setIndices (indices); reg.setInputNormals (normals); reg.setSmoothnessThreshold (2.0 / 180.0 * M_PI);// graden naar radial reg.setCurvatureThreshold (5.0); reg.extract (clusters); pcl::PointCloud ::Ptr colored_cloud = reg.getColoredCloud (); pcl::visualization::PCLVisualizer viewer ("Cloud viewer"); viewer.addPointCloud(colored_cloud,"cloud"); viewer.addPointCloudNormals(in, normals, 100, 0.01, "normals",0); while (!viewer.wasStopped ()) { viewer.spinOnce(100); } } void testRegionGrowing(pcl::PointCloud::Ptr &in) { //pcl::visualization::CloudViewer cviewer("Cloud Viewer"); //cviewer.showCloud(vox_cloud); /* // find the normals pcl::NormalEstimation normal_estimator; normal_estimator.setSearchMethod (tree); normal_estimator.setInputCloud (vox_cloud); normal_estimator.setKSearch (50); normal_estimator.compute (*normals); // region growing pcl::RegionGrowing reg; std::vector clusters; reg.setMinClusterSize (10); reg.setMaxClusterSize (1000); reg.setSearchMethod (tree); reg.setNumberOfNeighbours (50); reg.setInputCloud (vox_cloud); //reg.setIndices (indices); reg.setInputNormals (normals); reg.setSmoothnessThreshold (2.0 / 180.0 * M_PI);// graden naar radial reg.setCurvatureThreshold (5.0); reg.extract (clusters); */ //pcl::visualization::CloudViewer viewer("Cloud Viewer"); //viewer.showCloud(cloud_filtered); //pcl::PointCloud ::Ptr vox_cloud = seg.getInputNormals (); //pcl::PointCloud ::Ptr vox_cloud = ec.getInputCloud(); pcl::visualization::PCLVisualizer viewer ("Cluster viewer"); //viewer.addPointCloud(vox_cloud,"cloud"); //viewer.addPointCloud(segview,"cloud"); //viewer.addPointCloudNormals(colored_cloud, normals, 10, 0.05, "normals",0); while (!viewer.wasStopped ()) { viewer.spinOnce(100); } }