点云数据读取及显示

#include <pcl/point_cloud.h>
#include <pcl/kdtree/kdtree_flann.h>
#include<pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <iostream>
#include <vector>
#include <ctime>
#include<pcl/visualization/cloud_viewer.h>
#include "las_file.h"

//加入自己的数据类型

using namespace std;

int main()
{
	int i = 0;
	CLasOperator clas;
	clas.readLasFile("dragon.las");
	std::vector<Point3D> &point3d = clas.getPointData();

	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

	cloud->points.resize (point3d.size());
	for(i = 0;i < point3d.size();i++)
	{
		cloud->points[i].x = point3d[i].x;
		cloud->points[i].y = point3d[i].y;
		cloud->points[i].z = point3d[i].z;
	}

	pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");
	viewer.showCloud(cloud);
	while(!viewer.wasStopped())
	{

	}
}

根据自己所写的文件用结构体将点云数据读取出来,然后再赋值给新的结构体保存!!新的结构体就是点云的类型,才能满足模板类的需求

如果要自己添加新的类型,比较麻烦,要满足模版的相关定义才行,所以用以上的方法来进行实现


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

int user_data;

void viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{

	//viewer.removeCoordinateSystem();
	viewer.setBackgroundColor (1.0, 0, 0);
	//viewer.setFullScreen(true);
	pcl::PointXYZ o;
	o.x = 0;
	o.y = 0;
	o.z = 0;
	viewer.addSphere (o, 0.05, "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 ()
{
	int i = 0;
	CLasOperator clas;
	clas.readLasFile("dragon.las");
	std::vector<Point3D> &point3d = clas.getPointData();
	//建立Box   对坐标进行平移
	//RBox3D box(point3d.begin(),point3d.end());
	//double translatex = (box.x_max()+box.x_min())*0.5;
	//double translatey = (box.y_max()+box.y_min())*0.5;
	//double translatez = (box.z_max()+box.z_min())*0.5;

	/*cout<<translatex<<" "<<translatey<<" "<<translatez<<endl;*/

	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

	cloud->points.resize (point3d.size());
	for(i = 0;i < point3d.size();i++)
	{
		cloud->points[i].x = point3d[i].x ;
		cloud->points[i].y = point3d[i].y ;
		cloud->points[i].z = point3d[i].z  ;
	}


	pcl::visualization::CloudViewer viewer("Cloud Viewer");    
	
	//showCloud函数是同步的,在此处等待直到渲染显示为止
	viewer.showCloud(cloud);
	//该注册函数在可视化时只调用一次
	viewer.runOnVisualizationThreadOnce (viewerOneOff);
	//该注册函数在渲染输出时每次都调用
	viewer.runOnVisualizationThread (viewerPsycho);
	while (!viewer.wasStopped ())
	{
		//在此处可以添加其他处理
		user_data++;
	}
	return 0;
}

添加自己的窗口回调函数

#include <pcl/point_cloud.h>
#include <pcl/kdtree/kdtree_flann.h>
#include<pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <iostream>
#include <vector>
#include <ctime>
#include<pcl/visualization/cloud_viewer.h>
#include "las_file.h"

//加入自己的数据类型

using namespace std;

//
//void viewOneOff(pcl::visualization::PCLVisualizer& viewer)
//{
//	viewer.setBackgroundColor(1,1,1);
//}

//可视化单个点云
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.5,0.5,0.5);
	viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");
	viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
	viewer->addCoordinateSystem (0.1);
	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 (1, 1, 1);
	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 (1, 1, 1);
	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> shapesVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
{
	//创建3D窗口并添加点云    
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
	viewer->setBackgroundColor (255, 255, 255);
	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 (0.05);
	viewer->initCameraParameters ();
	//在点云上添加直线和球体模型
	
	viewer->addLine<pcl::PointXYZRGB> (cloud->points[0],
		cloud->points[cloud->size() - 1], "line");
	//0.2为半径  后面为颜色
	viewer->addSphere (cloud->points[0], 0.02, 0.5, 0.5, 0.0, "sphere");
	//在其他位置添加基于模型参数的平面及圆锥体
	pcl::ModelCoefficients coeffs;
	//values为一个矩阵
	coeffs.values.push_back (0.0);
	coeffs.values.push_back (0.0);
	coeffs.values.push_back (0.02);
	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> 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 (255, 255, 255);
	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, 500, 0.005, "normals");
	//viewer->addCoordinateSystem (1.0);
	viewer->initCameraParameters ();
	return (viewer);
}


int main()
{
	int i = 0;
	CLasOperator clas;
	clas.readLasFile("dragon.las");
	std::vector<Point3D> &point3d = clas.getPointData();

	//pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
	//使用智能指针效果最好
	boost::shared_ptr<pcl::PointCloud<pcl::PointXYZRGB>> cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
	boost::shared_ptr<pcl::PointCloud<pcl::Normal>> normals(new pcl::PointCloud<pcl::Normal>);
	//pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
	cloud->points.resize (point3d.size());
	normals->points.resize(point3d.size());
	for(i = 0;i < point3d.size();i++)
	{
		cloud->points[i].x = point3d[i].x;
		cloud->points[i].y = point3d[i].y;
		cloud->points[i].z = point3d[i].z;
		cloud->points[i].r = 255;
		normals->points[i].normal_x = 1;
		normals->points[i].normal_y = 1;
		normals->points[i].normal_z = 1;


	}
	
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;

	viewer = shapesVis(cloud);
	//viewer = rgbVis(cloud);
	//viewer = simpleVis(cloud);
	//viewer = customColourVis(cloud);
	//viewer = normalsVis(cloud,normals);
	//pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");
	//viewer.showCloud(cloud);

	//viewer.runOnVisualizationThreadOnce(viewOneOff);
	//while(!viewer.wasStopped())
	//{

	//}
	while (!viewer->wasStopped ())
	{
	   viewer->spinOnce(100);
	  
	}
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值