读取pcd点云
#include <iostream> //标准C++库中的输入输出类相关头文件
#include <pcl/io/pcd_io.h> //pcd 读写类相关的头文件
#include <pcl/point_types.h> //PCL中支持的点类型头文件
using namespace std;
int main() {
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile("/home/lp01/workspace/lp01/10.pcd", *cloud) < 0) {
std::cerr << "Error loading model cloud." << std::endl;
return (-1);
}
std::cerr << "Cloud:\n" << *cloud << std::endl; // 输出点云信息
}
Ptr 类型和非 Ptr 类型互相转换
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_Ptr(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ> cloud;
cloud = *cloud_Ptr;
cloud_Ptr = cloud.makeShared();
点云保存
#include <pcl/io/ply_io.h> //ply 读写类相关的头文件
#include <pcl/io/pcd_io.h> //pcd 读写类相关的头文件
pcl::io::savePCDFile("../image/filename.pcd", *cloud); // 存为pcd格式
pcl::io::savePLYFile("filename.ply", *cloud); // 存为ply格式
点云可视化
#include <pcl/visualization/cloud_viewer.h> //可视化模块PCLVisualizer头文件
// 点云可视化
pcl::visualization::PCLVisualizer viewer;
viewer.addPointCloud(cloud); // 添加点云
viewer.addCoordinateSystem(); // 添加坐标轴
// viewer.setBackgroundColor(1.0, 1.0, 1.0); // 设置背景颜色
// viewer.spin(); // 显示
// 添加要点点云并渲染
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> keypoints_color(cloud2, 255, 0, 0); // 设置点云颜色
viewer.addPointCloud(cloud2, keypoints_color, "cloud2"); // 添加要点点云
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "cloud2"); // 设置点云大小
viewer.spin(); // 显示
获取质点&极值点
// 获取质点
Eigen::Vector4f centroid; //创建存储点云质心的对象, (c0,c1,c2,1)
pcl::compute3DCentroid(*cloud, centroid); //估算点云质心
// 获取极值点
pcl::PointXYZ min_pt, max_pt; //创建存储三个轴的最小值&最大值, (x,y,z)
pcl::getMinMax3D(*cloud, min_pt, max_pt); //获取极值点
点云追加删除
#include <pcl/io/pcd_io.h>
#include <pcl/common/impl/io.hpp>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile<pcl::PointXYZ>("C:\office3-after21111.pcd", *cloud);
pcl::PointCloud<pcl::PointXYZ>::iterator index = cloud->begin();
cloud->erase(index);//删除第一个
index = cloud->begin() + 5;
cloud->erase(cloud->begin());//删除第5个
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