PCL学习笔记(4):创建点云文件、加载点云文件

PCL(point cloud library)系列笔记:http://blog.csdn.net/chentravelling/article/category/2876349

//先上代码:

bool saveThePointCloud()
{
	 pcl::PointCloud<pcl::PointXYZ> Cloud;      //定义点云对象,类型PointXYZ
	    // 创建点云
	Cloud.width=30;
	Cloud.height=1;
	Cloud.is_dense=false;
	Cloud.points.resize(Cloud.width*Cloud.height);
	srand(unsigned(int(NULL)));
	for(size_t i=0;i<Cloud.points.size();++i)
	{//RAND_MAX = 32767
		if(i<10)
		{
			Cloud.points[i].x = 1024*rand()/(RAND_MAX+1.0f);
			Cloud.points[i].y = 0.0f;
			Cloud.points[i].z = 0.0f;
		}
		else if(i<20)
		{
			Cloud.points[i].x = 0.0f;
			Cloud.points[i].y = 1024*rand()/(RAND_MAX+1.0f);
			Cloud.points[i].z = 0.0f;
		}
		else
		{
			Cloud.points[i].x = 0.0f;
			Cloud.points[i].y = 0.0f;
			Cloud.points[i].z = 1024*rand()/(RAND_MAX+1.0f);
		}
	}
 	 // pcl::io::savePCDFile("pointCloudValueFile.pcd",Cloud);
	  pcl::io::savePCDFileASCII("pointCloudFile.pcd",Cloud);//这两种save的结果貌似是一样的。
	  return true;
}

然后在调用此函数即可。

完整程序:

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

//int user_data;
//Initialize the viewer including the backgroundcolor,coordinate axis,and others.
void viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{
	//set the backgroundcolor:R,G,B
     viewer.setBackgroundColor (1.0, 1.0, 1.0);//背景为白色

  /*  pcl::PointXYZ o;
    o.x = 0;
    o.y = 0;
    o.z = 0;

    viewer.addSphere (o, 5, "sphere",0);*/
	//viewer.addLine(o,"line",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++;
//}

//Accomplish loading a PCDFile,creating a viewer,and show the cloud at the viewer.
void showTheCloud()
{
	pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
	//load
    pcl::io::loadPCDFile ("my_point_cloud.pcd", *cloud); 

    pcl::visualization::CloudViewer viewer("Cloud 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++;
    }
}
//Create a point-cloud object,and generate a PCD File to save the point cloud object.
bool saveThePointCloud()
{
	 pcl::PointCloud<pcl::PointXYZ> Cloud;      //定义点云对象
	    // 创建点云
	Cloud.width=30;
	Cloud.height=1;
	Cloud.is_dense=false;
	Cloud.points.resize(Cloud.width*Cloud.height);
	srand(unsigned(int(NULL)));
	for(size_t i=0;i<Cloud.points.size();++i)
	{//RAND_MAX = 32767
		if(i<10)
		{
			Cloud.points[i].x = 1024*rand()/(RAND_MAX+1.0f);
			Cloud.points[i].y = 0.0f;
			Cloud.points[i].z = 0.0f;
		}
		else if(i<20)
		{
			Cloud.points[i].x = 0.0f;
			Cloud.points[i].y = 1024*rand()/(RAND_MAX+1.0f);
			Cloud.points[i].z = 0.0f;
		}
		else
		{
			Cloud.points[i].x = 0.0f;
			Cloud.points[i].y = 0.0f;
			Cloud.points[i].z = 1024*rand()/(RAND_MAX+1.0f);
		}
	}
 	  pcl::io::savePCDFile("pointCloudValueFile.pcd",Cloud);
	  pcl::io::savePCDFileASCII("pointCloudFile.pcd",Cloud);
	  return true;
}
int main ()
{
	if(saveThePointCloud())
	{
		showTheCloud();
	}
	else
	{
		std::cout<<"Failed"<<endl;
	}
    return 0;
}

效果图:

这样,在工程目录下会多一个pointCloudFile.pcd文件。用记事本打开就可以看到数据。【PCD格式说明请阅读本人学习笔记】

至于命令窗口显示的Failed to find match for failed ‘rgba‘,是因为PCD文件一般的格式中是:

FIELDS x y z rgb

SIZE 4 4 4 4

TYPE F F F F

COUNT 1 1 1 1

而我们获得的pcd文件里并没有第四列数据。初步估计是因为生成点云时,我们并没有给每一个point设置rgb参数。

时间: 2024-10-10 10:44:45

PCL学习笔记(4):创建点云文件、加载点云文件的相关文章

[javase学习笔记]-7.4 构造函数的内存加载

这一节我们来说说构造函数在内存中是如何被加载的. 我们之前说过,构造函数只有创建对象时才会被调用并且只调用一次.那么在创建对象的过程中内存中的变化是什么样的呢? 我们接着上一节的Person类,我们分析 class Person { private String name; private int age; Person()//构造函数,分别为成员变量name和age赋固定的值 { name = "baby"; age = 1; System.out.println("per

NGUI学习笔记(四):动态加载UI和NGUI事件

动态加载UI 我们进入一个场景后,如果将这个场景所有可能用到的UI都直接放在场景中做好,由于要在进入场景时就部署好所有的UI对象,那么当UI对象较多时会碰到的问题是:1.初始化场景会产生非常明显的卡顿.2.所有UI都在场景中导致占用大量的内存. 所以我们需要对UI组件进行动态加载和销毁,当需要打开指定的UI时,动态的创建出这个UI对象,而当关闭这个UI对象之后,可以对其进行销毁从而释放出内存. 将UI制作成一个预制件 我们可以在场景中制作好一个UI,然后将其保存成一个预制件后从场景中移除,然后我

Android学习笔记—第六章 Asynctask异步加载

第六章 Asynctask 异步加载 1.好处:不需要创建线程就可管理线程 缺点:步骤多 2.步骤: (1)创建一个类继承Asynctask<xxx,xxx,xxx>; 三个泛型参数: 第一个:决定了execute()方法的传入值类型,决定了doInBackground()方法的传入值类型 第二个:决定了publishProgress()方法的传入值类型,决定了onProgressUpdate()方法的传入值类型 第三个:决定了doInBackground()方法的返回值类型,决定了onPos

[javase学习笔记]-7.13 静态的内存加载

之前几节我们一直在说static关键字所修饰的静态,那么在程序运行时,内存中static是如何体现的呢?这一节我们就来看一看. 我们还是先看一个例子,希望我们通过对这个例子的分析让我们初学者们对static所修饰的静态在内存中的具体体现有一个深刻的理解. class Person { String name;//姓名,这是一个成员变量 int age; static String country = "美国";//国籍,这是一个静态变量 Person(String name,int a

【extjs6学习笔记】1.7 初始:加载第三方库

https://www.sencha.com/blog/integrating-ext-js-with-3rd-party-libraries-2/ Introduction Ext JS provides a lot of built-in components right out of the box that are highly customizable. If it's not in the framework, you can easily extend the classes or

【数据库学习笔记】(2)JDBC加载并注册数据库驱动并连接数据库

springmvc学习笔记---idea创建springmvc项目

前言: 真的是很久没搞java的web服务开发了, 最近一次搞还是读研的时候, 想来感慨万千. 英雄没落, Eclipse的盟主地位隐隐然有被IntelliJ IDEA超越的趋势. Spring从2.x到现在4.x, 一眨眼已是二代的积淀. 本文想借助Idea, 来简单搭建一个基于springmvc的web程序, 一为体验, 二为技术积累. 环境配置: idea版本为14.0.2, tomcat版本为8.0.23, idea创建的springmvc为4.1.1.RELEASE. 网上有很多图文并

Nodejs学习笔记(八)--- Node.js + Express 实现上传文件功能(felixge/node-formidable)

目录 前言 formidable简介 创建项目并安装formidable 实现上传功能 运行结果 部分疑惑解析 写在之后 前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能----文件上传,示例以一个上传图片的功能为例子 上传功能命名用formidable实现,示例很简单! PS:最近比较忙,距上一次更新已经比较久了^_^! formidable简介 nodejs原生实现上传还是比较麻烦,有兴趣的自已去参考一下网上有网友写的代码 这里选择了formidable,也是githu

Sharepoint2013搜索学习笔记之创建搜索服务(二)

第一步,进入管理中心,点击管理服务器上的服务 第二步,在服务器上选择需要承载搜索服务的服务器,并启动服务列表上的sharepoint server search 第三步,从管理中心进入管理服务应用程序 第四步,新建search service application 第五步,在弹出的新建窗口分别填好相应信息点击确定,主要注意的是 应用程序池可以选择已经有的,也可以自己填一个新的名称,选择填写新的之后,程序会在稍后新建一个应用程序池,一般推荐新建应用程序池. 默认情况,爬网组件会用配置好的搜索服务

Android Handler 异步消息处理机制的妙用 创建强大的图片加载类

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38476887 ,本文出自[张鸿洋的博客] 最近创建了一个群,方便大家交流,群号:55032675 上一篇博客介绍了Android异步消息处理机制,如果你还不了解,可以看:Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系 .那篇博客的最后,提出可以把异步消息处理机制不仅仅是在MainActivity中更新UI,可以用到别的地方,