I would like to select two points from pointcloud and return the coordinates of two points. To get to the problem, I used PointPickingEvent for PCL and wrote a class containing pointcloud, a visualizer, and a vector to store the selected points. My code is:
#include <pcl/point_cloud.h> #include <pcl/PCLPointCloud2.h> #include <pcl/io/io.h> #include <pcl/io/pcd_io.h> #include <pcl/common/io.h> #include <pcl/io/ply_io.h> #include <pcl/io/vtk_lib_io.h> #include <pcl/visualization/pcl_visualizer.h> using namespace pcl; using namespace std; class pickPoints { public: pickPoints::pickPoints () { viewer.reset (new pcl::visualization::PCLVisualizer ("Viewer", true)); viewer->registerPointPickingCallback (&pickPoints::pickCallback, *this); } ~pickPoints () {} void setInputCloud (PointCloud<PointXYZ>::Ptr cloud) { cloudTemp = cloud; } vector<float> getpoints() { return p; } void simpleViewer () { // Visualizer viewer->addPointCloud<pcl::PointXYZ>(cloudTemp, "Cloud"); viewer->resetCameraViewpoint ("Cloud"); viewer->spin(); } protected: void pickCallback (const pcl::visualization::PointPickingEvent& event, void*) { if (event.getPointIndex () == -1) return; PointXYZ picked_point1,picked_point2; event.getPoints(picked_point1.x,picked_point1.y,picked_point1.z, picked_point2.x,picked_point2.y,picked_point2.z); p.push_back(picked_point1.x); // store points p.push_back(picked_point1.y); p.push_back(picked_point1.z); p.push_back(picked_point2.x); p.push_back(picked_point2.y); p.push_back(picked_point2.z); //cout<<"first selected point: "<<p[0]<<" "<<p[1]<<" "<<p[2]<<endl; //cout<<"second selected point: "<<p[3]<<" "<<p[4]<<" "<<p[5]<<endl; } private: // Point cloud data PointCloud<pcl::PointXYZ>::Ptr cloudTemp; // The visualizer boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer; // The picked point vector<float> p; }; int main() { //LOAD; PointCloud<PointXYZ>::Ptr cloud (new PointCloud<PointXYZ> ()); pcl::PolygonMesh mesh; pcl::io::loadPolygonFilePLY("test.ply", mesh); pcl::fromPCLPointCloud2(mesh.cloud, *cloud); pickPoints pickViewer; pickViewer.setInputCloud(cloud); // A pointer to a cloud pickViewer.simpleViewer(); vector<float> pointSelected; pointSelected= pickViewer.getpoints(); cout<<pointSelected[0]<<" "<<pointSelected[1]<<" "<<pointSelected[2]<<endl; cout<<pointSelected[3]<<" "<<pointSelected[4]<<" "<<pointSelected[5]<<endl; cin.get(); return 0; }
But when the code was debugged, I received nothing. I also know that when selecting points with the left button, you should press the SHIFT button. Thank you in advance for your help!
viewer point-cloud-library
just_rookie
source share