Example #1
0
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;
}