///* \author Geoffrey Biggs */
//
//#include <iostream>
//#include <boost/thread/thread.hpp>
//#include <pcl/common/common_headers.h>
//#include <pcl/common/common_headers.h>
//#include <pcl/features/normal_3d.h>
//#include <pcl/io/pcd_io.h>
//#include <pcl/visualization/pcl_visualizer.h>
//#include <pcl/console/parse.h>
//// 帮助
//void
//printUsage(const char* progName)
//{
// std::cout << "\n\nUsage: " << progName << " [options]\n\n"
// << "Options:\n"
// << "-------------------------------------------\n"
// << "-h this help\n"
// << "-s Simple visualisation example\n"
// << "-r RGB colour visualisation example\n"
// << "-c Custom colour visualisation example\n"
// << "-n Normals visualisation example\n"
// << "-a Shapes visualisation example\n"
// << "-v Viewports example\n"
// << "-i Interaction Customization example\n"
// << "\n\n";
//}
//
//boost::shared_ptr<pcl::visualization::PCLVisualizer> simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
//{
// //创建3D窗口并添加点云
// boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
// viewer->setBackgroundColor(0, 0, 0);
// viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");
// viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
// viewer->addCoordinateSystem(1.0);
// viewer->initCameraParameters();
// return (viewer);
//}
//
//boost::shared_ptr<pcl::visualization::PCLVisualizer> rgbVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
//{
// //创建3D窗口并添加点云
// boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
// viewer->setBackgroundColor(0, 0, 0);
// pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
// viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");
// viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
// viewer->addCoordinateSystem(1.0);
// viewer->initCameraParameters();
// return (viewer);
//}
//
//boost::shared_ptr<pcl::visualization::PCLVisualizer> customColourVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
//{
// //创建3D窗口并添加点云
// boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
// viewer->setBackgroundColor(0, 0, 0);
// pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);
// viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");
// viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
// viewer->addCoordinateSystem(1.0);
// viewer->initCameraParameters();
// return (viewer);
//}
//
//boost::shared_ptr<pcl::visualization::PCLVisualizer> normalsVis(
// pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals)
//{
// //创建3D窗口并添加点云其包括法线
// boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
// viewer->setBackgroundColor(0, 0, 0);
// pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
// viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");
// viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
// viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals, 10, 0.05, "normals");
// viewer->addCoordinateSystem(1.0);
// viewer->initCameraParameters();
// return (viewer);
//}
//
//
//boost::shared_ptr<pcl::visualization::PCLVisualizer> shapesVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
//{
// //创建3D窗口并添加点云
// boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
// viewer->setBackgroundColor(0, 0, 0);
// pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
// viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");
// viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
// viewer->addCoordinateSystem(1.0);
// viewer->initCameraParameters();
// //在点云上添加直线和球体模型
// viewer->addLine<pcl::PointXYZRGB>(cloud->points[0],
// cloud->points[cloud->size() - 1], "line");
// viewer->addSphere(cloud->points[0], 0.2, 0.5, 0.5, 0.0, "sphere");
// //在其他位置添加基于模型参数的平面及圆锥体
// pcl::ModelCoefficients coeffs;
// coeffs.values.push_back(0.0);
// coeffs.values.push_back(0.0);
// coeffs.values.push_back(1.0);
// coeffs.values.push_back(0.0);
// viewer->addPlane(coeffs, "plane");
// coeffs.values.clear();
// coeffs.values.push_back(0.3);
// coeffs.values.push_back(0.3);
// coeffs.values.push_back(0.0);
// coeffs.values.push_back(0.0);
// coeffs.values.push_back(1.0);
// coeffs.values.push_back(0.0);
// coeffs.values.push_back(5.0);
// viewer->addCone(coeffs, "cone");
//
// return (viewer);
//}
//
//
//boost::shared_ptr<pcl::visualization::PCLVisualizer> viewportsVis(
// pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals1, pcl::PointCloud<pcl::Normal>::ConstPtr normals2)
//{
// // 创建3D窗口并添加显示点云其包括法线
// boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
// viewer->initCameraParameters();
// int v1(0);
// viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
// viewer->setBackgroundColor(0, 0, 0, v1);
// viewer->addText("Radius: 0.01", 10, 10, "v1 text", v1);
// pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
// viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud1", v1);
// int v2(0);
// viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
// viewer->setBackgroundColor(0.3, 0.3, 0.3, v2);
// viewer->addText("Radius: 0.1", 10, 10, "v2 text", v2);
// pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color(cloud, 0, 255, 0);
// viewer->addPointCloud<pcl::PointXYZRGB>(cloud, single_color, "sample cloud2", v2);
// viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud1");
// viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");
// viewer->addCoordinateSystem(1.0);
//
// viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals1, 10, 0.05, "normals1", v1);
// viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals2, 10, 0.05, "normals2", v2);
//
// return (viewer);
//}
//
//
//unsigned int text_id = 0;
//void keyboardEventOccurred(const pcl::visualization::KeyboardEvent &event,
// void* viewer_void)
//{
// boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);
// if (event.getKeySym() == "r" && event.keyDown())
// {
// std::cout << "r was pressed => removing all text" << std::endl;
//
// char str[512];
// for (unsigned int i = 0; i < text_id; ++i)
// {
// sprintf(str, "text#%03d", i);
// viewer->removeShape(str);
// }
// text_id = 0;
// }
//}
//
//void mouseEventOccurred(const pcl::visualization::MouseEvent &event,
// void* viewer_void)
//{
// boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);
// if (event.getButton() == pcl::visualization::MouseEvent::LeftButton &&
// event.getType() == pcl::visualization::MouseEvent::MouseButtonRelease)
// {
// std::cout << "Left mouse button released at position (" << event.getX() << ", " <<