int pcl::VTKUtils::convertToVTK (const pcl::PolygonMesh &triangles, vtkSmartPointer<vtkPolyData> &triangles_out_vtk) { if (triangles.cloud.data.empty ()) { PCL_ERROR ("[pcl::surface::convertToVTK] Input point cloud has no data!\n"); return (-1); } vtkSmartPointer<vtkPolyData> vtk_polygons; mesh2vtk (triangles, vtk_polygons); vtkSmartPointer<vtkTriangleFilter> vtk_triangles = vtkTriangleFilter::New (); vtk_triangles->SetInput (vtk_polygons); vtk_triangles->Update(); triangles_out_vtk = vtk_triangles->GetOutput (); return 1; }
void RegionGrowingHSV::findPointNeighbours () { // convert point cloud type to vtkPolyData vtkPolyData* m_polydata = vtkPolyData::New(); int convertnum = mesh2vtk(m_polymesh,m_polydata); if( num_pts!=convertnum ) return; pcl::search::Search <pcl::PointXYZRGB>::Ptr tree = boost::shared_ptr<pcl::search::Search<pcl::PointXYZRGB> > (new pcl::search::KdTree<pcl::PointXYZRGB>); pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>()); pcl::fromROSMsg(m_polymesh.cloud,*cloud); tree->setInputCloud(cloud); std::vector<float> nearestDis; std::vector<int> neighbours; point_neighbours_.clear(); neighbours_for_possi_.clear(); point_neighbours_.resize (num_pts, neighbours); neighbours_for_possi_.resize(num_pts,neighbours); for (int i_point = 0; i_point < num_pts; i_point++) { std::vector<bool> is_neighbour(num_pts,false); std::vector<int> seed_initial; std::vector<int> seed; seed_initial.push_back(i_point); int time = 0; neighbours.clear (); while( !seed_initial.empty() && time<searchDis_ ) { while( !seed_initial.empty() ) // 将seed_initial中的种子点copy到seed中 { seed.swap(seed_initial); seed_initial.clear(); } while(!seed.empty()) { int current_seed = seed[0]; seed.erase(seed.begin()); is_neighbour[current_seed] = true; findNeighbours(current_seed,seed_initial,neighbours,is_neighbour,m_polydata); } time++; if(time==1) { if(neighbours.size()<3) { neighbours.clear(); nearestDis.clear(); tree->nearestKSearch(cloud->points[i_point],10,neighbours,nearestDis); } point_neighbours_[i_point] = neighbours; } } //std::cout<<"size neighbours of the "<<i_point<<"'s point is "<<neighbours.size()<<std::endl; if(neighbours.size()<3) { neighbours.clear(); nearestDis.clear(); tree->nearestKSearch(cloud->points[i_point],10,neighbours,nearestDis); } neighbours_for_possi_[i_point].swap (neighbours); } std::cout<<"find point neighbours end..."<<std::endl; }