PCL点云 可视化、读取写入、获取质心极值点

读取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
发布了52 篇原创文章 · 获赞 34 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43789195/article/details/103135080
今日推荐