• 07点云的滤波与分割


    1.统计滤波,去除离群点

    #include <pcl\filters\\statistical_outlier_removal.h>
    
    #include <iostream>
    #include <pcl\io\pcd_io.h>
    #include <pcl\point_types.h>
    #include <pcl\visualization\cloud_viewer.h>
    
    int main() 
    {
        
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    
    
        if (pcl::io::loadPCDFile<pcl::PointXYZ>("F:\\BaiduNetdiskDownload\\pcl\\desk.pcd", *cloud) == -1) 
        {
            PCL_ERROR("Couldn't read file rabbit.pcd\n");
            return(-1);
        }
    
        std::cout << "Loaded:" << cloud->width*cloud->height << "data points from test_pcd.pcd with the following fields:" << std::endl;
    
        /*for (size_t i = 0; i < cloud->points.size(); ++i) {
            std::cout << "      " << cloud->points[i].x << "   " << cloud->points[i].y << "   " << cloud->points[i].z << "   " << std::endl;
        }*/
    
    
        // 统计滤波
        // 创建滤波器,对每个点分析的临近点的个数设置为50 ,并将标准差的倍数设置为1  这意味着如果一
        // 个点的距离超出了平均距离一个标准差以上,则该点被标记为离群点,并将它移除
    
        pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;  // 创建滤波器对象
        sor.setInputCloud(cloud);        // 设置待滤波的点云
        sor.setMeanK(50);                // 设置在进行统计时考虑查询点临近点数
        sor.setStddevMulThresh(1);        // 设置判断是否为离群点的阀值
        sor.filter(*cloud);                // 过滤
    
        // 存储
        pcl::io::savePCDFileBinary("desk-sor.pcd", *cloud);
    
        // 显示
        pcl::visualization::CloudViewer     viewer("cloud viewer");
        viewer.showCloud(cloud);
    
        while (!viewer.wasStopped()) {
    
        }
    
        system("pause");
    
        return 0;
    }
    View Code

    2. 平面分隔

     1 #include <pcl/point_types.h>          //PCL中所有点类型定义的头文件
     2 #include <pcl/io/pcd_io.h>            //打开关闭pcd文件的类定义的头文件
     3 #include <pcl/filters/statistical_outlier_removal.h>
     4 #include <pcl/filters/passthrough.h>
     5 #include <pcl/segmentation/sac_segmentation.h>
     6 #include <pcl/filters/extract_indices.h>
     7 #include <pcl/filters/voxel_grid.h>
     8 #include <pcl\visualization\cloud_viewer.h>
     9 #include <pcl\point_types.h>
    10 
    11 using namespace std;
    12 
    13 
    14 typedef pcl::PointXYZ PoinT;
    15 
    16 // 随机产生颜色
    17 int *rand_rgb() {
    18     int *rgb = new int[3];
    19     rgb[0] = rand() % 255;
    20     rgb[1] = rand() % 255;
    21     rgb[2] = rand() % 255;
    22     return rgb;
    23 }
    24 
    25 int main(int argc, char** argv)
    26 {
    27     pcl::PointCloud<PoinT>::Ptr cloud(new pcl::PointCloud<PoinT>());
    28     // 加载pcd文件
    29     pcl::io::loadPCDFile("desk-sor.pcd", *cloud);
    30     std::cerr << "Cloud before filtering: " << std::endl;
    31     std::cerr << *cloud << std::endl;
    32 
    33     // 平面分隔
    34     pcl::PointCloud<PoinT>::Ptr cloud_filtered(new pcl::PointCloud<PoinT>());
    35     pcl::SACSegmentation<PoinT> seg;
    36     pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());// 创建参数模型的的参数对象
    37     pcl::PointIndices::Ptr inliers(new pcl::PointIndices());// 储存模型内点的下标索引的数组指针
    38     seg.setMethodType(pcl::SAC_RANSAC);     // 设置方法【聚类或随机样本一致性】
    39     seg.setModelType(pcl::SACMODEL_PLANE);  // 设置模型类型,检测平面
    40     seg.setMaxIterations(100);
    41     seg.setDistanceThreshold(0.01);
    42     // Extract the inliers
    43     pcl::ExtractIndices<PoinT> extract;
    44     extract.setNegative(true);
    45     int cloud_size = cloud->size();
    46     int i = 0;
    47     // 迭代进行分割直到剩余80%的点云
    48     while (cloud->size() > cloud_size * .8)
    49     {
    50         seg.setInputCloud(cloud);
    51         seg.segment(*inliers, *coefficients);// 传入的参数未进行赋值  利用参数模型进行分割
    52         extract.setInputCloud(cloud);
    53         extract.setIndices(inliers);
    54         extract.setNegative(false);
    55         extract.filter(*cloud_filtered);
    56         extract.setNegative(true);
    57         extract.filter(*cloud);
    58         cout << i << ":" << cloud->size() << endl;
    59         stringstream ss;
    60         ss << "desk-seg" << i << ".pcd";
    61         // 保存结果
    62         pcl::io::savePCDFileBinary(ss.str(), *cloud_filtered);
    63         i++;
    64     }
    65 
    66 
    67     // 显示
    68     pcl::visualization::CloudViewer     viewer("cloud viewer");
    69     viewer.showCloud(cloud);
    70 
    71     while (!viewer.wasStopped()) {
    72 
    73     }
    74 
    75 
    76 
    77     pcl::io::savePCDFileBinary("desk-seg.pcd", *cloud);
    78     return 0;
    79 }
    View Code

     

  • 相关阅读:
    web十二讲,CSS样式
    web第十一讲,div与span
    web第十讲,CSS基础
    git 版本回退后再恢复
    git 变更远程仓库及在本地的别名
    使用FastClick插件,无法监听双击事件
    声明式编程的没落
    gradle 很棒
    评 PowerShell
    VB 的一些歧义(不断更新)
  • 原文地址:https://www.cnblogs.com/zhaopengpeng/p/15568834.html
Copyright © 2020-2023  润新知