template <typename PointT> vtkSmartPointer<vtkDataSet> pcl::visualization::createPolygon (const pcl::PlanarPolygon<PointT> &planar_polygon) { vtkSmartPointer<vtkUnstructuredGrid> poly_grid; if (planar_polygon.getContour ().empty ()) return (poly_grid); vtkSmartPointer<vtkPoints> poly_points = vtkSmartPointer<vtkPoints>::New (); vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::New (); poly_points->SetNumberOfPoints (planar_polygon.getContour ().size () + 1); polygon->GetPointIds ()->SetNumberOfIds (planar_polygon.getContour ().size () + 1); size_t i; for (i = 0; i < planar_polygon.getContour ().size (); ++i) { poly_points->SetPoint (i, planar_polygon.getContour ()[i].x, planar_polygon.getContour ()[i].y, planar_polygon.getContour ()[i].z); polygon->GetPointIds ()->SetId (i, i); } poly_points->SetPoint (i, planar_polygon.getContour ()[0].x, planar_polygon.getContour ()[0].y, planar_polygon.getContour ()[0].z); polygon->GetPointIds ()->SetId (i, i); allocVtkUnstructuredGrid (poly_grid); poly_grid->Allocate (1, 1); poly_grid->InsertNextCell (polygon->GetCellType (), polygon->GetPointIds ()); poly_grid->SetPoints (poly_points); poly_grid->Update (); return (poly_grid); }
template <typename T> bool pcl::visualization::ImageViewer::addPlanarPolygon ( const typename pcl::PointCloud<T>::ConstPtr &image, const pcl::PlanarPolygon<T> &polygon, double r, double g, double b, const std::string &layer_id, double opacity) { // We assume that the data passed into image is organized, otherwise this doesn't make sense if (!image->isOrganized ()) return (false); // Check to see if this ID entry already exists (has it been already added to the visualizer?) LayerMap::iterator am_it = std::find_if (layer_map_.begin (), layer_map_.end (), LayerComparator (layer_id)); if (am_it == layer_map_.end ()) { PCL_DEBUG ("[pcl::visualization::ImageViewer::addPlanarPolygon] No layer with ID'=%s' found. Creating new one...\n", layer_id.c_str ()); am_it = createLayer (layer_id, getSize ()[0] - 1, getSize ()[1] - 1, opacity, true); } // Construct a search object to get the camera parameters and fill points pcl::search::OrganizedNeighbor<T> search; search.setInputCloud (image); const float image_height_f = static_cast<float> (image->height); std::vector<float> xy; xy.reserve ((polygon.getContour ().size () + 1) * 2); for (size_t i = 0; i < polygon.getContour ().size (); ++i) { pcl::PointXY p; search.projectPoint (polygon.getContour ()[i], p); xy.push_back (p.x); #if ((VTK_MAJOR_VERSION == 5) && (VTK_MINOR_VERSION < 10)) xy.push_back (image_height_f - p.y); #else xy.push_back (p.y); #endif } // Close the polygon xy[xy.size () - 2] = xy[0]; xy[xy.size () - 1] = xy[1]; vtkSmartPointer<context_items::Polygon> poly = vtkSmartPointer<context_items::Polygon>::New (); poly->setColors (static_cast<unsigned char> (r * 255.0), static_cast<unsigned char> (g * 255.0), static_cast<unsigned char> (b * 255.0)); poly->set (xy); am_it->actor->GetScene ()->AddItem (poly); return (true); }
template <typename T> bool pcl::visualization::ImageViewer::addPlanarPolygon ( const typename pcl::PointCloud<T>::ConstPtr &image, const pcl::PlanarPolygon<T> &polygon, double r, double g, double b, const std::string &layer_id, double opacity) { // We assume that the data passed into image is organized, otherwise this doesn't make sense if (!image->isOrganized ()) return (false); // Check to see if this ID entry already exists (has it been already added to the visualizer?) LayerMap::iterator am_it = std::find_if (layer_map_.begin (), layer_map_.end (), LayerComparator (layer_id)); if (am_it == layer_map_.end ()) { PCL_DEBUG ("[pcl::visualization::ImageViewer::addPlanarPolygon] No layer with ID'=%s' found. Creating new one...\n", layer_id.c_str ()); am_it = createLayer (layer_id, image_viewer_->GetRenderWindow ()->GetSize ()[0] - 1, image_viewer_->GetRenderWindow ()->GetSize ()[1] - 1, opacity, true); } am_it->canvas->SetDrawColor (r * 255.0, g * 255.0, b * 255.0, opacity * 255.0); // Construct a search object to get the camera parameters pcl::search::OrganizedNeighbor<T> search; search.setInputCloud (image); for (size_t i = 0; i < polygon.getContour ().size () - 1; ++i) { pcl::PointXY p1, p2; search.projectPoint (polygon.getContour ()[i], p1); search.projectPoint (polygon.getContour ()[i+1], p2); am_it->canvas->DrawSegment (int (p1.x), int (float (image->height) - p1.y), int (p2.x), int (float (image->height) - p2.y)); } // Close the polygon pcl::PointXY p1, p2; search.projectPoint (polygon.getContour ()[polygon.getContour ().size () - 1], p1); search.projectPoint (polygon.getContour ()[0], p2); am_it->canvas->DrawSegment (int (p1.x), int (float (image->height) - p1.y), int (p2.x), int (float (image->height) - p2.y)); return (true); }