码迷,mamicode.com
首页 > 其他好文 > 详细

点云视窗类CloudViewer的介绍以及PCL程序:圆球几何体代码解析

时间:2015-02-04 14:48:23      阅读:1001      评论:0      收藏:0      [点我收藏+]

标签:pcl   vs2010   点云   

点云视窗类CloudViewer是简单显示点云的可视化工具类,可以让用户用尽可能少的代码查看点云。注意:点云视窗类不能应用于多线程应用程序中。

有关CloudViewer类的成员变量和函数等等,可以C:\Program Files\PCL 1.6.0\include\pcl-1.6\pcl\visualization\impl目录下的pcl_visualizer.hpp文件中查看。

/* 

    *PCL安装和环境配置请参考:

    *http://blog.csdn.net/chentravelling/article/details/43451589

    *代码出处:

    *http://www.pclcn.org/study/shownews.php?lang=cn&id=149

    *代码中加载的点云文件 my_point_cloud.pcd,可以去下面地址复制粘贴:

    *http://blog.csdn.net/chentravelling/article/details/43451589

*/

一、PCL程序:圆球几何体

#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>

int user_data;

void viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{
	//设置背景颜色
    viewer.setBackgroundColor (1.0, 0.5, 1.0);
	//球体坐标
    pcl::PointXYZ o;
    o.x = 0;
    o.y = 0;
    o.z = 0;
	//添加球体
    viewer.addSphere (o, 1, "sphere", 0);
    std::cout << "i only run once" << std::endl;

}

void viewerPsycho (pcl::visualization::PCLVisualizer& viewer)
{
    static unsigned count = 0;
    std::stringstream ss;
    ss << "Once per viewer loop: " << count++;
    viewer.removeShape ("text", 0);
    viewer.addText (ss.str(), 200, 300, "text", 0);

    //FIXME: possible race condition here:
    user_data++;
}

int main ()
{
    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::io::loadPCDFile ("my_point_cloud.pcd", *cloud); //加载点云文件

    pcl::visualization::CloudViewer viewer("Cloud Viewer");//创建viewer对象

    

    //blocks until the cloud is actually rendered
    viewer.showCloud(cloud);

    //use the following functions to get access to the underlying more advanced/powerful
    //PCLVisualizer

    //This will only get called once
    viewer.runOnVisualizationThreadOnce (viewerOneOff);

    //This will get called once per visualization iteration
    viewer.runOnVisualizationThread (viewerPsycho);
    while (!viewer.wasStopped ())
    {
        //you can also do cool processing here
        //FIXME: Note that this is running in a separate thread from viewerPsycho
        //and you should guard against race conditions yourself...
        user_data++;
    }
    return 0;
}


因为代码量很大,本文中只是列出圆体几何体代码中所涉及到CloudViwer类中的函数。

1.viewer.addSphere ();

  代码原型:

template <typename PointT> bool
pcl::visualization::PCLVisualizer::addSphere (const PointT ¢er, double radius, double r, double g, double b, const std::string &id, int viewport)
{
  // Check to see if this ID entry already exists (has it been already added to the visualizer?)
  ShapeActorMap::iterator am_it = shape_actor_map_->find (id);
  if (am_it != shape_actor_map_->end ())
  {
    PCL_WARN ("[addSphere] A shape with id <%s> already exists! Please choose a different id and retry.\n", id.c_str ());
    return (false);
  }

  //vtkSmartPointer<vtkDataSet> data = createSphere (center.getVector4fMap (), radius);
  vtkSmartPointer<vtkSphereSource> data = vtkSmartPointer<vtkSphereSource>::New ();
  data->SetRadius (radius);
  data->SetCenter (double (center.x), double (center.y), double (center.z));
  data->SetPhiResolution (10);
  data->SetThetaResolution (10);
  data->LatLongTessellationOff ();
  data->Update ();
 
  // Setup actor and mapper 
  vtkSmartPointer <vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New ();
  mapper->SetInputConnection (data->GetOutputPort ());

  // Create an Actor
  vtkSmartPointer<vtkLODActor> actor = vtkSmartPointer<vtkLODActor>::New ();
  actor->SetMapper (mapper);
  //createActorFromVTKDataSet (data, actor);
  actor->GetProperty ()->SetRepresentationToWireframe ();
  actor->GetProperty ()->SetInterpolationToGouraud ();
  actor->GetMapper ()->ScalarVisibilityOff ();
  actor->GetProperty ()->SetColor (r, g, b);
  addActorToRenderer (actor, viewport);

  // Save the pointer/ID pair to the global actor map
  (*shape_actor_map_)[id] = actor;
  return (true);
}

////////////////////////////////////////////////////////////////////////////////////////////
template <typename PointT> bool
pcl::visualization::PCLVisualizer::addSphere (const PointT ¢er, double radius, const std::string &id, int viewport)
{
  return (addSphere (center, radius, 0.5, 0.5, 0.5, id, viewport));
}

//暂时其他的函数找起来有点头疼,慢慢再找ing....


点云视窗类CloudViewer的介绍以及PCL程序:圆球几何体代码解析

标签:pcl   vs2010   点云   

原文地址:http://blog.csdn.net/chentravelling/article/details/43484245

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!