点云库PCL学习4——点云的常用操作

1.如何知道点云的是XYZ格式还是xyzrgb格式?

#define  _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)

#include "iostream"
using namespace std;
#include "time.h"


#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/PCLPointCloud2.h>


int main()
{
	pcl::PCLPointCloud2 cloud;
	pcl::PCDReader reader;
	reader.readHeader("test.pcd",cloud);
	for (int i = 0; i < cloud.fields.size(); i++)
	{
		cout << cloud.fields[i].name<<"  ";
	}
    
    system("pause");
    return 0;
}

2.ascii和binary的速度对比,快速存储时需求

#define  _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)

#include "iostream"
using namespace std;
#include "time.h"

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/PCLPointCloud2.h>

int main()
{
	clock_t start, end;
	clock_t start1, end1;

	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile<pcl::PointXYZ>("test.pcd", *cloud);
	
	start = clock();
	pcl::io::savePCDFile<pcl::PointXYZ>("ascii.pcd", *cloud);
	end = clock();

	start1 = clock();
	pcl::io::savePCDFileBinary<pcl::PointXYZ>("binary.pcd", *cloud);
	end1 = clock();

	double sum1 = (double)(end - start) / 1000;
	double sum2 = (double)(end1 - start1) / 1000;
	cout << "ascii:" << sum1 << endl;
	cout << "binary:" << sum2 << endl;
	system("pause");
	return 0;
}

相差了14秒的时间,具有很大的优势啊。

3.如何获取三维点云中xyz方向的极值

#define  _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)

#include "iostream"
using namespace std;
#include "time.h"

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/PCLPointCloud2.h>
#include <pcl/common/common.h>

int main()
{
	//--------------获取xyz的极值----------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile<pcl::PointXYZ>("test.pcd", *cloud);
	pcl::PointXYZ minPt, maxPt;
	pcl::getMinMax3D(*cloud, minPt, maxPt);
	cout << "最小极值点:" << minPt.x << " " << minPt.y << " " << minPt.z << endl;
	cout << "最大极值点:" << maxPt.x << " " << maxPt.y << " " << maxPt.z << endl;
	system("pause");
	return 0;
}

这个对于归一化是需要的。

4.如何根据已知的索引,将原点云copy到新点云?

#define  _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)

#include "iostream"
using namespace std;
#include "time.h"

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/PCLPointCloud2.h>
#include <pcl/common/common.h>
#include <pcl/common/impl/io.hpp>

int main()
{

	//-------------如何根据索引将原点云复制到新点云--------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile<pcl::PointXYZ>("test.pcd", *cloud);
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut(new pcl::PointCloud<pcl::PointXYZ>);
	std::vector<int > indexs = { 1, 2, 5 };
	pcl::copyPointCloud(*cloud, indexs, *cloudOut);
	
	system("pause");
	return 0;
}

5.如何从点云中删除和添加点?

#define  _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)

#include "iostream"
using namespace std;
#include "time.h"

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/PCLPointCloud2.h>
#include <pcl/common/common.h>
#include <pcl/common/impl/io.hpp>

int main()
{

	//---------------如何删除和添加点云的点----------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::io::loadPCDFile<pcl::PointXYZ>("test.pcd", *cloud);
	pcl::PointCloud<pcl::PointXYZ>::iterator index = cloud->begin();
	cloud->erase(index,index+5);   //区间删除
	index = cloud->begin() + 7;
	cloud->erase(cloud->begin());  //单个删除

	pcl::PointXYZ point = { 1, 1, 1 };
	//在索引号为5的位置1上插入一点,原来的点后移一位
	cloud->insert(cloud->begin() + 5, point);
	cloud->push_back(point);//从点云最后面插入一点
	std::cout << cloud->points[5].x;//输出1
	
	system("pause");
	return 0;
}

转载自:https://blog.csdn.net/zzh_AI/article/details/92623659

对上面做了一些实验显示。

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值