点云技术相关产学研社区

 找回密码
 立即注册加入PCL中国点云技术相关产学研社区

扫一扫,访问微社区

查看: 2890|回复: 0

按照书上的例子点云可视化自定义交互时出现错误,求助

[复制链接]
发表于 2014-1-9 12:39:01 | 显示全部楼层 |阅读模式
我按照《点云库 PCL学习教程》第七章的可视化部分自定义交互例子,运行程序后出现了错误:pcl_visualizer_demo.exe已停止工作。
详细代码如下,
  1. /* \author Geoffrey Biggs */

  2. #include <iostream>
  3. #include <boost/thread/thread.hpp>
  4. #include <pcl/common/common_headers.h>
  5. #include <pcl/common/common_headers.h>
  6. #include <pcl/features/normal_3d.h>
  7. #include <pcl/io/pcd_io.h>
  8. #include <pcl/visualization/pcl_visualizer.h>
  9. #include <pcl/console/parse.h>
  10. #include <iomanip>

  11. unsigned int text_id = 0;
  12. void keyboardEventOccurred (const pcl::visualization::KeyboardEvent &event,
  13.                             void* viewer_void)
  14. {
  15.   boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);
  16.   if (event.getKeySym () == "r" && event.keyDown ())
  17.   {
  18.     std::cout << "r was pressed => removing all text" << std::endl;

  19.     char str[512];
  20.     for (unsigned int i = 0; i < text_id; ++i)
  21.     {
  22.       sprintf (str, "text#%03d", i);
  23.       viewer->removeShape (str);
  24.     }
  25.     text_id = 0;
  26.   }
  27. }

  28. void mouseEventOccurred (const pcl::visualization::MouseEvent &event,
  29.                          void* viewer_void)
  30. {
  31.   boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);
  32.   if (event.getButton () == pcl::visualization::MouseEvent::LeftButton &&
  33.       event.getType () == pcl::visualization::MouseEvent::MouseButtonRelease)
  34.   {
  35.     std::cout << "Left mouse button released at position (" << event.getX () << ", " << event.getY () << ")" << std::endl;

  36.     char str[512];
  37.     sprintf (str, "text#%03d", text_id ++);
  38.     viewer->addText ("clicked here", event.getX (), event.getY (), str);
  39.   }
  40. }

  41. //自定义交互
  42. boost::shared_ptr<pcl::visualization::PCLVisualizer> interactionCustomizationVis ()
  43. {
  44.   boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
  45.   viewer->setBackgroundColor (0, 0, 0);
  46.   viewer->addCoordinateSystem (1.0);
  47.   //注册响应时间的回调函数
  48.   viewer->registerKeyboardCallback (keyboardEventOccurred, (void*)&viewer);
  49.   viewer->registerMouseCallback (mouseEventOccurred, (void*)&viewer);

  50.   return (viewer);
  51. }
  52. // -----Main-----
  53. int
  54. main (int argc, char** argv)
  55. {  
  56.   // 自行创建一随机点云
  57.   pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr (new pcl::PointCloud<pcl::PointXYZ>);
  58.   pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);
  59.   std::cout << "Genarating example point clouds.\n\n";
  60.   // 以椭圆为边线沿z轴拉伸获取其点云,并赋予红绿蓝渐变色。
  61.   uint8_t r(255), g(15), b(15);
  62.   for (float z(-1.0); z <= 1.0; z += 0.05)
  63.   {
  64.     for (float angle(0.0); angle <= 360.0; angle += 5.0)
  65.     {
  66.       pcl::PointXYZ basic_point;
  67.       basic_point.x = 0.5 * cosf (pcl::deg2rad(angle));
  68.       basic_point.y = sinf (pcl::deg2rad(angle));
  69.       basic_point.z = z;
  70.       basic_cloud_ptr->points.push_back(basic_point);

  71.       pcl::PointXYZRGB point;
  72.       point.x = basic_point.x;
  73.       point.y = basic_point.y;
  74.       point.z = basic_point.z;
  75.       uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
  76.               static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
  77.       point.rgb = *reinterpret_cast<float*>(&rgb);
  78.       point_cloud_ptr->points.push_back (point);
  79.     }
  80.     if (z < 0.0)
  81.     {
  82.       r -= 12;
  83.       g += 12;
  84.     }
  85.     else
  86.     {
  87.       g -= 12;
  88.       b += 12;
  89.     }
  90.   }
  91.   // 0.05为搜索半径获取点云法线
  92.   pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;
  93.   ne.setInputCloud (point_cloud_ptr);
  94.   pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGB> ());
  95.   ne.setSearchMethod (tree);
  96.   pcl::PointCloud<pcl::Normal>::Ptr cloud_normals1 (new pcl::PointCloud<pcl::Normal>);
  97.   ne.setRadiusSearch (0.05);
  98.   ne.compute (*cloud_normals1);
  99.   //  0.1为搜索半径获取点云法线
  100.   pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2 (new pcl::PointCloud<pcl::Normal>);
  101.   ne.setRadiusSearch (0.1);
  102.   ne.compute (*cloud_normals2);
  103.   
  104.   boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;

  105.   viewer = interactionCustomizationVis();
  106.   // 主循环
  107.   while (!viewer->wasStopped ())
  108.   {
  109.     viewer->spinOnce (100);
  110.     boost::this_thread::sleep (boost::posix_time::microseconds (100000));
  111.   }
  112. }
复制代码
求助高手,希望帮帮忙看看错在哪里,怎么改正啊?感激不尽,谢谢!
回复

使用道具 举报

本版积分规则

QQ|小黑屋|点云技术相关产学研社区 ( 陕ICP备13001629号 )

GMT+8, 2024-4-29 03:33 , Processed in 1.727514 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表