Visualization

CloudViewer

The CloudViewer is a straight forward,simple piont cloud visualization,meant to get you up and viewing clouds in as little code as possible.

 1 #include <pcl/visualization/cloud_viewer.h>
 2 #include <iostream>
 3 #include <pcl/io/io.h>
 4 #include <pcl/io/pcd_io.h>
 5 
 6 int
 7 main()
 8 {
 9     pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
10     pcl::io::loadPCDFile("D:\\pcd\\rabbit.pcd", *cloud);
11     pcl::visualization::CloudViewer viewer("Cloud-Viewer");
12     viewer.showCloud(cloud);
13     while (!viewer.wasStopped(100))
14     {
15     }
16     return 0;
17 }
View Code

 PCLVisualizer

PCLVisualizer is PCL’s full-featured visualisation class. While more complex to use than the CloudViewer, it is also more powerful, offering features such as displaying normals, drawing shapes and multiple viewports.

  1 /* \author Geoffrey Biggs */
  2 
  3 #include <iostream>
  4 #include <thread>
  5 
  6 #include <pcl/common/common_headers.h>
  7 #include <pcl/features/normal_3d.h>
  8 #include <pcl/io/pcd_io.h>
  9 #include <pcl/visualization/pcl_visualizer.h>
 10 #include <pcl/console/parse.h>
 11 
 12 using namespace std::chrono_literals;
 13 
 14 // --------------
 15 // -----Help-----
 16 // --------------
 17 void
 18 printUsage(const char* progName)
 19 {
 20     std::cout << "\n\nUsage: " << progName << " [options]\n\n"
 21         << "Options:\n"
 22         << "-------------------------------------------\n"
 23         << "-h           this help\n"
 24         << "-s           Simple visualisation example\n"
 25         << "-r           RGB colour visualisation example\n"
 26         << "-c           Custom colour visualisation example\n"
 27         << "-n           Normals visualisation example\n"
 28         << "-a           Shapes visualisation example\n"
 29         << "-v           Viewports example\n"
 30         << "-i           Interaction Customization example\n"
 31         << "\n\n";
 32 }
 33 
 34 
 35 pcl::visualization::PCLVisualizer::Ptr simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
 36 {
 37     // --------------------------------------------
 38     // -----Open 3D viewer and add point cloud-----
 39     // --------------------------------------------
 40     pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
 41     viewer->setBackgroundColor(0, 0, 0);
 42     viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");
 43     viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
 44     viewer->addCoordinateSystem(2.0);
 45     viewer->initCameraParameters();
 46     return (viewer);
 47 }
 48 
 49 
 50 pcl::visualization::PCLVisualizer::Ptr rgbVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
 51 {
 52     // --------------------------------------------
 53     // -----Open 3D viewer and add point cloud-----
 54     // --------------------------------------------
 55     pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
 56     viewer->setBackgroundColor(0, 0, 0);
 57     pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
 58     viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");
 59     viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
 60     viewer->addCoordinateSystem(1.0);
 61     viewer->initCameraParameters();
 62     return (viewer);
 63 }
 64 
 65 
 66 pcl::visualization::PCLVisualizer::Ptr customColourVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
 67 {
 68     // --------------------------------------------
 69     // -----Open 3D viewer and add point cloud-----
 70     // --------------------------------------------
 71     pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
 72     viewer->setBackgroundColor(0, 0, 0);
 73     pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);
 74     viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");
 75     viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
 76     viewer->addCoordinateSystem(1.0);
 77     viewer->initCameraParameters();
 78     return (viewer);
 79 }
 80 
 81 
 82 pcl::visualization::PCLVisualizer::Ptr normalsVis(
 83     pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals)
 84 {
 85     // --------------------------------------------------------
 86     // -----Open 3D viewer and add point cloud and normals-----
 87     // --------------------------------------------------------
 88     pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
 89     viewer->setBackgroundColor(0, 0, 0);
 90     pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
 91     viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");
 92     viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
 93     viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals, 10, 0.05, "normals");
 94     viewer->addCoordinateSystem(1.0);
 95     viewer->initCameraParameters();
 96     return (viewer);
 97 }
 98 
 99 
100 pcl::visualization::PCLVisualizer::Ptr shapesVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
101 {
102     // --------------------------------------------
103     // -----Open 3D viewer and add point cloud-----
104     // --------------------------------------------
105     pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
106     viewer->setBackgroundColor(0, 0, 0);
107     pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
108     viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");
109     viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
110     viewer->addCoordinateSystem(1.0);
111     viewer->initCameraParameters();
112 
113     //------------------------------------
114     //-----Add shapes at cloud points-----
115     //------------------------------------
116     viewer->addLine<pcl::PointXYZRGB>(cloud->points[0],
117         cloud->points[cloud->size() - 1], "line");
118     //viewer->addSphere(cloud->points[0], 0.2, 0.5, 0.5, 0.0, "sphere");
119 
120     //---------------------------------------
121     //-----Add shapes at other locations-----
122     //---------------------------------------
123     pcl::ModelCoefficients coeffs;
124     coeffs.values.push_back(0.0);
125     coeffs.values.push_back(0.0);
126     coeffs.values.push_back(1.0);
127     coeffs.values.push_back(0.0);
128     viewer->addPlane(coeffs, "plane");
129     coeffs.values.clear();
130     coeffs.values.push_back(0.3);
131     coeffs.values.push_back(0.3);
132     coeffs.values.push_back(0.0);
133     coeffs.values.push_back(0.0);
134     coeffs.values.push_back(1.0);
135     coeffs.values.push_back(0.0);
136     coeffs.values.push_back(5.0);
137     viewer->addCone(coeffs, "cone");
138 
139     return (viewer);
140 }
141 
142 
143 pcl::visualization::PCLVisualizer::Ptr viewportsVis(
144     pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals1, pcl::PointCloud<pcl::Normal>::ConstPtr normals2)
145 {
146     // --------------------------------------------------------
147     // -----Open 3D viewer and add point cloud and normals-----
148     // --------------------------------------------------------
149     pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
150     viewer->initCameraParameters();
151 
152     int v1(0);
153     viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
154     viewer->setBackgroundColor(0, 0, 0, v1);
155     viewer->addText("Radius: 0.01", 10, 10, "v1 text", v1);
156     pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
157     viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud1", v1);
158 
159     int v2(0);
160     viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
161     viewer->setBackgroundColor(0.3, 0.3, 0.3, v2);
162     viewer->addText("Radius: 0.1", 10, 10, "v2 text", v2);
163     pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color(cloud, 0, 255, 0);
164     viewer->addPointCloud<pcl::PointXYZRGB>(cloud, single_color, "sample cloud2", v2);
165 
166     viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud1");
167     viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");
168     viewer->addCoordinateSystem(1.0);
169 
170     //viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals1, 10, 0.05, "normals1", v1);
171     //viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals2, 10, 0.05, "normals2", v2);
172 
173     return (viewer);
174 }
175 
176 
177 unsigned int text_id = 0;
178 void keyboardEventOccurred(const pcl::visualization::KeyboardEvent &event,
179     void* viewer_void)
180 {
181     pcl::visualization::PCLVisualizer *viewer = static_cast<pcl::visualization::PCLVisualizer *> (viewer_void);
182     if (event.getKeySym() == "r" && event.keyDown())
183     {
184         std::cout << "r was pressed => removing all text" << std::endl;
185 
186         char str[512];
187         for (unsigned int i = 0; i < text_id; ++i)
188         {
189             sprintf(str, "text#%03d", i);
190             viewer->removeShape(str);
191         }
192         text_id = 0;
193     }
194 }
195 
196 void mouseEventOccurred(const pcl::visualization::MouseEvent &event,
197     void* viewer_void)
198 {
199     pcl::visualization::PCLVisualizer *viewer = static_cast<pcl::visualization::PCLVisualizer *> (viewer_void);
200     if (event.getButton() == pcl::visualization::MouseEvent::LeftButton &&
201         event.getType() == pcl::visualization::MouseEvent::MouseButtonRelease)
202     {
203         std::cout << "Left mouse button released at position (" << event.getX() << ", " << event.getY() << ")" << std::endl;
204 
205         char str[512];
206         sprintf(str, "text#%03d", text_id++);
207         viewer->addText("clicked here", event.getX(), event.getY(), str);
208     }
209 }
210 
211 pcl::visualization::PCLVisualizer::Ptr interactionCustomizationVis()
212 {
213     pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
214     viewer->setBackgroundColor(0, 0, 0);
215     viewer->addCoordinateSystem(1.0);
216 
217     viewer->registerKeyboardCallback(keyboardEventOccurred, (void*)viewer.get());
218     viewer->registerMouseCallback(mouseEventOccurred, (void*)viewer.get());
219 
220     return (viewer);
221 }
222 
223 
224 // --------------
225 // -----Main-----
226 // --------------
227 int
228 main(int argc, char** argv)
229 {
230     bool simple(false), rgb(false), custom_c(false), normals(true),
231         shapes(false), viewports(false), interaction_customization(false);
232 
233     // ------------------------------------
234     // -----Create example point cloud-----
235     // ------------------------------------
236     pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr(new pcl::PointCloud<pcl::PointXYZ>);
237     pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr(new pcl::PointCloud<pcl::PointXYZRGB>);
238     std::cout << "Generating example point clouds.\n\n";
239     // We're going to make an ellipse extruded along the z-axis. The colour for
240     // the XYZRGB cloud will gradually go from red to green to blue.
241     uint8_t r(255), g(15), b(15);
242     for (float z(-1.0); z <= 1.0; z += 0.05)
243     {
244         for (float angle(0.0); angle <= 360.0; angle += 5.0)
245         {
246             pcl::PointXYZ basic_point;
247             basic_point.x = 0.5 * cosf(pcl::deg2rad(angle));
248             basic_point.y = sinf(pcl::deg2rad(angle));
249             basic_point.z = z;
250             basic_cloud_ptr->points.push_back(basic_point);
251 
252             pcl::PointXYZRGB point;
253             point.x = basic_point.x;
254             point.y = basic_point.y;
255             point.z = basic_point.z;
256             uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
257                 static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
258             point.rgb = *reinterpret_cast<float*>(&rgb);
259             point_cloud_ptr->points.push_back(point);
260         }
261         if (z < 0.0)
262         {
263             r -= 12;
264             g += 12;
265         }
266         else
267         {
268             g -= 12;
269             b += 12;
270         }
271     }
272     basic_cloud_ptr->width = (int)basic_cloud_ptr->points.size();
273     basic_cloud_ptr->height = 1;
274     point_cloud_ptr->width = (int)point_cloud_ptr->points.size();
275     point_cloud_ptr->height = 1;
276 
277     // ----------------------------------------------------------------
278     // -----Calculate surface normals with a search radius of 0.05-----
279     // ----------------------------------------------------------------
280     pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;
281     ne.setInputCloud(point_cloud_ptr);
282     pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>());
283     ne.setSearchMethod(tree);
284     pcl::PointCloud<pcl::Normal>::Ptr cloud_normals1(new pcl::PointCloud<pcl::Normal>);
285     ne.setRadiusSearch(0.05);
286     ne.compute(*cloud_normals1);
287 
288     // ---------------------------------------------------------------
289     // -----Calculate surface normals with a search radius of 0.1-----
290     // ---------------------------------------------------------------
291     pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2(new pcl::PointCloud<pcl::Normal>);
292     ne.setRadiusSearch(0.1);
293     ne.compute(*cloud_normals2);
294     // ---------------------------------------------------------------
295 
296     pcl::visualization::PCLVisualizer::Ptr viewer;
297     if (simple)
298     {
299         viewer = simpleVis(basic_cloud_ptr);
300     }
301     else if (rgb)
302     {
303         viewer = rgbVis(point_cloud_ptr);
304     }
305     else if (custom_c)
306     {
307         viewer = customColourVis(basic_cloud_ptr);
308     }
309     else if (normals)
310     {
311         viewer = normalsVis(point_cloud_ptr, cloud_normals2);
312     }
313     else if (shapes)
314     {
315         viewer = shapesVis(point_cloud_ptr);
316     }
317     else if (viewports)
318     {
319         viewer = viewportsVis(point_cloud_ptr, cloud_normals1, cloud_normals2);
320     }
321     else if (interaction_customization)
322     {
323         viewer = interactionCustomizationVis();
324     }
325 
326     //--------------------
327     // -----Main loop-----
328     //--------------------
329     while (!viewer->wasStopped())
330     {
331         viewer->spinOnce(100);
332         std::this_thread::sleep_for(100ms);
333     }
334 }
View Code

 PCLPlotter

PCLPlotter provides a very straightforward and easy interface for plotting graphs. One can visualize all sort of important plots - from polynomial functions to histograms - inside the library without going to any other software (like MATLAB).

  1 /* \author Kripasindhu Sarkar */
  2 
  3 #include<pcl/visualization/pcl_plotter.h>
  4 
  5 #include<iostream>
  6 #include<vector>
  7 #include<utility>
  8 #include<math.h>  //for abs()
  9 
 10 using namespace std;
 11 using namespace pcl::visualization;
 12 
 13 void
 14 generateData(double *ax, double *acos, double *asin, int numPoints)
 15 {
 16     double inc = 7.5 / (numPoints - 1);
 17     for (int i = 0; i < numPoints; ++i)
 18     {
 19         ax[i] = i*inc;
 20         acos[i] = cos(i * inc);
 21         asin[i] = sin(i * inc);
 22     }
 23 }
 24 
 25 //.....................callback functions defining Y= f(X)....................
 26 double
 27 step(double val)
 28 {
 29     if (val > 0)
 30         return (double)(int)val;
 31     else
 32         return (double)((int)val - 1);
 33 }
 34 
 35 double
 36 identity1(double val)
 37 {
 38     return val;
 39 }
 40 //............................................................................
 41 
 42 int
 43 main(int argc, char * argv[])
 44 {
 45     //defining a plotter
 46     PCLPlotter *plotter = new PCLPlotter("My Plotter");
 47 
 48     //setting some properties
 49     plotter->setShowLegend(true);
 50 
 51     //generating point correspondances
 52     int numPoints = 69;
 53     double ax[100], acos[100], asin[100];
 54     generateData(ax, acos, asin, numPoints);
 55 
 56     //adding plot data
 57     plotter->addPlotData(ax, acos, numPoints, "cos");
 58     plotter->addPlotData(ax, asin, numPoints, "sin");
 59 
 60     //display for 2 seconds
 61     plotter->spinOnce(3000);
 62     plotter->clearPlots();
 63 
 64 
 65     //...................plotting implicit functions and custom callbacks....................
 66 
 67     //make a fixed axis
 68     plotter->setYRange(-10, 10);
 69 
 70     //defining polynomials
 71     vector<double> func1(1, 0);
 72     func1[0] = 1; //y = 1
 73     vector<double> func2(3, 0);
 74     func2[2] = 1; //y = x^2
 75 
 76     plotter->addPlotData(std::make_pair(func1, func2), -10, 10, "y = 1/x^2", 100, vtkChart::POINTS);
 77     plotter->spinOnce(2000);
 78 
 79     plotter->addPlotData(func2, -10, 10, "y = x^2");
 80     plotter->spinOnce(2000);
 81 
 82     //callbacks
 83     plotter->addPlotData(identity1, -10, 10, "identity");
 84     plotter->spinOnce(2000);
 85 
 86     plotter->addPlotData(abs, -10, 10, "abs");
 87     plotter->spinOnce(2000);
 88 
 89     plotter->addPlotData(step, -10, 10, "step", 100, vtkChart::POINTS);
 90     plotter->spinOnce(2000);
 91 
 92     plotter->clearPlots();
 93 
 94     //........................A simple animation..............................
 95     vector<double> fsq(3, 0);
 96     fsq[2] = -100; //y = x^2
 97     while (!plotter->wasStopped())
 98     {
 99         if (fsq[2] == 100) fsq[2] = -100;
100         fsq[2]++;
101         char str[50];
102         sprintf(str, "y = %dx^2", (int)fsq[2]);
103         plotter->addPlotData(fsq, -10, 10, str);
104 
105         plotter->spinOnce(100);
106         plotter->clearPlots();
107     }
108 
109     return 1;
110 }
View Code

 

posted @ 2019-06-19 08:41  summer91  阅读(661)  评论(0编辑  收藏  举报