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
对上面做了一些实验显示。