我按照《点云库 PCL学习教程》第七章的可视化部分自定义交互例子,运行程序后出现了错误:pcl_visualizer_demo.exe已停止工作。
详细代码如下,- /* \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>
- #include <iomanip>
- 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 () << ", " << event.getY () << ")" << std::endl;
- char str[512];
- sprintf (str, "text#%03d", text_id ++);
- viewer->addText ("clicked here", event.getX (), event.getY (), str);
- }
- }
- //自定义交互
- boost::shared_ptr<pcl::visualization::PCLVisualizer> interactionCustomizationVis ()
- {
- boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
- viewer->setBackgroundColor (0, 0, 0);
- viewer->addCoordinateSystem (1.0);
- //注册响应时间的回调函数
- viewer->registerKeyboardCallback (keyboardEventOccurred, (void*)&viewer);
- viewer->registerMouseCallback (mouseEventOccurred, (void*)&viewer);
- return (viewer);
- }
- // -----Main-----
- int
- main (int argc, char** argv)
- {
- // 自行创建一随机点云
- pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr (new pcl::PointCloud<pcl::PointXYZ>);
- pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);
- std::cout << "Genarating example point clouds.\n\n";
- // 以椭圆为边线沿z轴拉伸获取其点云,并赋予红绿蓝渐变色。
- uint8_t r(255), g(15), b(15);
- for (float z(-1.0); z <= 1.0; z += 0.05)
- {
- for (float angle(0.0); angle <= 360.0; angle += 5.0)
- {
- pcl::PointXYZ basic_point;
- basic_point.x = 0.5 * cosf (pcl::deg2rad(angle));
- basic_point.y = sinf (pcl::deg2rad(angle));
- basic_point.z = z;
- basic_cloud_ptr->points.push_back(basic_point);
- pcl::PointXYZRGB point;
- point.x = basic_point.x;
- point.y = basic_point.y;
- point.z = basic_point.z;
- uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
- static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
- point.rgb = *reinterpret_cast<float*>(&rgb);
- point_cloud_ptr->points.push_back (point);
- }
- if (z < 0.0)
- {
- r -= 12;
- g += 12;
- }
- else
- {
- g -= 12;
- b += 12;
- }
- }
- // 0.05为搜索半径获取点云法线
- pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;
- ne.setInputCloud (point_cloud_ptr);
- pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGB> ());
- ne.setSearchMethod (tree);
- pcl::PointCloud<pcl::Normal>::Ptr cloud_normals1 (new pcl::PointCloud<pcl::Normal>);
- ne.setRadiusSearch (0.05);
- ne.compute (*cloud_normals1);
- // 0.1为搜索半径获取点云法线
- pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2 (new pcl::PointCloud<pcl::Normal>);
- ne.setRadiusSearch (0.1);
- ne.compute (*cloud_normals2);
-
- boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
-
- viewer = interactionCustomizationVis();
- // 主循环
- while (!viewer->wasStopped ())
- {
- viewer->spinOnce (100);
- boost::this_thread::sleep (boost::posix_time::microseconds (100000));
- }
- }
复制代码 求助高手,希望帮帮忙看看错在哪里,怎么改正啊?感激不尽,谢谢! |