PCl - 读入、显示、写出点云

一、简介

心心念念的点云终于可以学了,之前两个月一直在忙项目,哎,年近三旬要从互联网转入工业视觉,对于当初的选择无怨无悔吧,跟着这位大佬来学吧PCL 读取、保存点云_点云侠的博客-CSDN博客_pcl保存点云PCL 读取、保存点云PCLPointCloud2和PointCloud点云的代码实现,以及PCLPointCloud2和PointCloud之间的相互转换。https://blog.csdn.net/qq_36686437/article/details/122080773

二、读入和写出点云的两种方式

#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>//pcd 读写类相关的头文件。
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>//PCL中支持的点类型头文件。

using std::cout;

int user_data;

#if  1

void viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
    viewer.setBackgroundColor(0.0, 0.5, 0.0);//设置背景颜色
}
int main()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);//创建点云指针

    if (-1 == pcl::io::loadPCDFile("bunny.pcd",*cloud))//放到与工程中的主.cpp同一位置的文件夹下
    {
        cout << "加载文件失败!" << endl; 
        return -1;
    }
    cout << cloud->points.size() << endl;

    cout << "从点云数据中读取: " << (*cloud).width * (*cloud).height <<
        "字节,数据中所包含的有效字段为: " << pcl::getFieldsList(*cloud) << endl;
    cout << (*cloud).points.size() << endl;

    pcl::visualization::CloudViewer viewer("First Cloud Viewer");
    viewer.showCloud(cloud);//显示
    viewer.runOnVisualizationThreadOnce(viewerOneOff);
    std::cout << "PCL Test OK!\n";
    system("pause");
}
# endif

#if  1
// 创建一个点云
int  createFirstCloud() 
{
    pcl::PointCloud<pcl::PointXYZ> cloud;
    cloud.width = 10000;
    cloud.height = 1;
    cloud.is_dense = false;
    cloud.points.resize(cloud.width * cloud.height);
    // 创建一个在0-1024 之间的正方体点云
    for (size_t i = 0; i < cloud.size(); i++)
    {
        cloud.points[i].x = 1024 * (rand() / (RAND_MAX+1.0f));
        cloud.points[i].y = 1024 * (rand() / (RAND_MAX + 1.0f));
        cloud.points[i].z = 1024 * (rand() / (RAND_MAX + 1.0f));
    }
    pcl::io::savePCDFileASCII("myfirstcreatecloud.pcd",cloud);
    return  0;
}
int main() 
{
    createFirstCloud();
    pcl::PointCloud<pcl::PointXYZ> ::Ptr  cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("myfirstcreatecloud.pcd",*cloud)==-1) 
    {
        PCL_ERROR("this  file is not found!!!");
        return  -1;
    }
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("show my pountcloud "));
    viewer->setBackgroundColor(0,0,0);
    viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");
    // 显示
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }
    return 0;
}
# endif

#if  1
// 创建一个点云--椭圆
void  createEllipsePointCloud(pcl::PointCloud<pcl::PointXYZRGB> ::Ptr  &point_cloud_ptr)
{
    uint8_t r(255), g(15), b(30);
    for (float  z(-1.0);  z<=1.0; z+=0.01)
    {
        for (float angle(0.0); angle< 360.0; angle+=1)
        {
            pcl::PointXYZ  ellipse_cloud;

            ellipse_cloud.x = 0.1 * cosf(float(angle/180*M_PI));
            ellipse_cloud.y = sinf(float(angle/180*M_PI));
            ellipse_cloud.z = 1;

            pcl::PointXYZRGB point;
            point.x = ellipse_cloud.x;
            point.y = ellipse_cloud.y;
            point.z= ellipse_cloud.z;

            uint32_t  rgb = (static_cast<uint32_t>(r) << 16 | static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
            point.rgb = *reinterpret_cast<float*>(&rgb);
            point_cloud_ptr->points.push_back(point);
        }
        if (z<0.0) {
            r -= 12;
            g += 12;
        }
        else 
        {
            g -= 12;
            b += 12;
        }
        point_cloud_ptr->width = (int)point_cloud_ptr->size();
        point_cloud_ptr->height = 1;

    }
}
void  createCylinderpointcloud(pcl::PointCloud<pcl::PointXYZRGB>:: Ptr & cylinder_point_cloud)
{
    uint8_t r(255), g(15), b(15);
    for (float z = -1.0; z <= 1.0;z+=0.01)
    {
        for (float angle  = 0.0;  angle < 360; angle+=5.0)
        {
            pcl::PointXYZRGB  point_cloud;
            point_cloud.x = cosf(pcl::deg2rad(angle));
            point_cloud.y = sinf(pcl::deg2rad(angle));
            point_cloud.z = z;

            uint32_t  rgb = (static_cast<uint32_t>(r) << 16 | static_cast<uint32_t>(g) << 8 |
                static_cast<uint32_t>(r));
            point_cloud.rgb = *reinterpret_cast<float*>(&rgb);
            cylinder_point_cloud->points.push_back(point_cloud);
        }
        if (z < 0.0) {
            r -= 12;
            g += 12;
        }
        else
        { 
            g -= 12;
            b += 12;
        }

        cylinder_point_cloud->width = (int)cylinder_point_cloud->points.size();
        cylinder_point_cloud->height =1;
    }
}



//构造球体点云  
void creat_sphere_pointcloud(pcl::PointCloud<pcl::PointXYZRGB>::Ptr basic_cloud_ptr)
{
    uint8_t r(255), g(15), b(15);
    float radius = 2;

    for (float angle1 = 0.0; angle1 <= 180.0; angle1 += 5.0)
    {
        for (float angle2 = 0.0; angle2 <= 360.0; angle2 += 5.0)
        {
            pcl::PointXYZRGB basic_point;

            basic_point.x = radius * sinf(pcl::deg2rad(angle1)) * cosf(pcl::deg2rad(angle2));
            basic_point.y = radius * sinf(pcl::deg2rad(angle1)) * sinf(pcl::deg2rad(angle2));
            basic_point.z = radius * cosf(pcl::deg2rad(angle1));
            uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
                static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
            basic_point.rgb = *reinterpret_cast<float*>(&rgb);
            basic_cloud_ptr->points.push_back(basic_point);
        }
        if (radius != 0.0)
        {
            r -= 12;
            g += 12;
        }
        else
        {
            g -= 12;
            b += 12;
        }


        basic_cloud_ptr->width = (int)basic_cloud_ptr->points.size();
        basic_cloud_ptr->height = 1;
    }
}


int main(int argc, const char** argv) {
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);

    createEllipsePointCloud(cloud);
    createCylinderpointcloud(cloud);
    creat_sphere_pointcloud(cloud);


    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
    pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);// 显示RGB
    viewer->addPointCloud<pcl::PointXYZRGB>(cloud, "sample cloud");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud"); // 设置点云大小

    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }

    return 0;
}
# endif

猜你喜欢

转载自blog.csdn.net/weixin_39354845/article/details/124937023
pcl