zoukankan      html  css  js  c++  java
  • PCL常见编程问题

    1.如何获取pcd文件点云里点的格式,比如是pcl::PointXYZ还是pcl::PointXYZRGB等类型?

    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/point_cloud.h>
    #include <pcl/PCLPointCloud2.h>
     
    pcl::PCLPointCloud2 cloud;
    pcl::PCDReader reader;
    reader.readHeader("C:fandisk.pcd", cloud);
    for (int i = 0; i < cloud.fields.size(); i++)
    {
        std::cout << cloud.fields[i].name;
    }

    2.如何实现类似pcl::PointCloud::Ptr和pcl::PointCloud的两个类相互转换?

    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/point_cloud.h>
     
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPointer(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ> cloud;
    cloud = *cloudPointer;
    cloudPointer = cloud.makeShared();

    3.如何加快ASCII格式存储,也就是记事本打开可以看到坐标数据的pcd文件读取速度?
    建议将pcd文件换成以Binary格式存储。

    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/point_cloud.h>
    #include <pcl/PCLPointCloud2.h>
     
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile<pcl::PointXYZ>("C:office3-after1.pcd", *cloud);
    pcl::io::savePCDFileBinary("C:office3-after21111.pcd", *cloud);

    4.如何给pcl::PointXYZ类型的点云在显示时指定颜色?

    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/point_cloud.h>
    #include <pcl/visualization/pcl_visualizer.h>
     
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile<pcl::PointXYZ>("C:office3-after21111.pcd", *cloud);
     
    pcl::visualization::PCLVisualizer viewer("pointcloud viewer");
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> sig(cloud, 0, 234, 0);
    viewer.addPointCloud(cloud, sig, "cloud");
    while (!viewer.wasStopped())
    {
        viewer.spinOnce();
    }

    5.如何查找点云的x,y,z的极值?

    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/common/common.h>
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
    cloud = pcl::PointCloud<pcl::PointXYZ>::Ptr (new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile<pcl::PointXYZ> ("your_pcd_file.pcd", *cloud);
    pcl::PointXYZ minPt, maxPt;
    pcl::getMinMax3D (*cloud, minPt, maxPt);

    6.如何判断点云中的点为无效点,即坐标值为nan,以及如何将点设置为无效点?

    #include <pcl/point_types.h>
     
    pcl::PointXYZ p_valid;
    p_valid.x = 0;
    p_valid.y = 0;
    p_valid.z = 0;
    std::cout << "Is p_valid valid? " << pcl::isFinite(p_valid) << std::endl;
     
    pcl::PointXYZ p_invalid;
    p_invalid.x = std::numeric_limits<float>::quiet_NaN();
    p_invalid.y = 0;
    p_invalid.z = 0;
    std::cout << "Is p_invalid valid? " << pcl::isFinite(p_invalid) << std::endl;

    7.如何将无效点从点云中移除?

    #include <pcl/point_cloud.h>
    #include <pcl/point_types.h>
    #include <pcl/filters/filter.h>
     
    typedef pcl::PointCloud<pcl::PointXYZ> CloudType;
    CloudType::Ptr cloud(new CloudType);
    cloud->is_dense = false;
    CloudType::Ptr output_cloud(new CloudType);
     
    CloudType::PointType p_nan;
    p_nan.x = std::numeric_limits<float>::quiet_NaN();
    p_nan.y = std::numeric_limits<float>::quiet_NaN();
    p_nan.z = std::numeric_limits<float>::quiet_NaN();
    cloud->push_back(p_nan);
     
    CloudType::PointType p_valid;
    p_valid.x = 1.0f;
    cloud->push_back(p_valid);
     
    std::cout << "size: " << cloud->points.size() << std::endl;
     
    std::vector<int> indices;
    pcl::removeNaNFromPointCloud(*cloud, *output_cloud, indices);
    std::cout << "size: " << output_cloud->points.size() << std::endl;

    8.如果知道需要保存点的序号,如何从原点云中拷贝点到新点云?

    #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>::Ptr cloudOut(new pcl::PointCloud<pcl::PointXYZ>);
    std::vector<int > indexs = { 1, 2, 5 };
    pcl::copyPointCloud(*cloud, indexs, *cloudOut);

    9.如何从点云里删除和添加点?

    #include "stdafx.h"
    #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

    如果删除的点太多建议用上面的方法拷贝到新点云,再赋值给原点云,如果要添加很多点,建议先resize,然后用循环向点云里的添加。

    10.PointCloud和PCLPointCloud2类型如何相互转换?

    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
     
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PCLPointCloud2 cloud2;
    pcl::io::loadPCDFile("C:office3-after21111.pcd", cloud2);
    pcl::fromPCLPointCloud2(cloud2, *cloud);
    pcl::toPCLPointCloud2(*cloud, cloud2);

    转自http://www.zhangzscn.com/2015/11/27/pcl%E5%BC%80%E6%BA%90%E5%BA%93%E5%B8%B8%E8%A7%81%E7%BC%96%E7%A8%8B%E9%97%AE%E9%A2%98/

  • 相关阅读:
    git连接远程分支
    如何找N个数中第i小的数
    DeconvNet
    深度学习中的Internal Convariate Shift (ICS)
    BA算法解决p-中位问题
    蚁群算法
    蝙蝠算法初探
    轨迹压缩之Douglas-Peucker算法之C++实现
    遗传算法---编程小试
    NYOJ 1000
  • 原文地址:https://www.cnblogs.com/zhaobinyouth/p/6198081.html
Copyright © 2011-2022 走看看