pcl点云的离群点去除

来源:互联网 发布:最好的扫描识别软件 编辑:程序博客网 时间:2024/04/30 18:46

pcl离群点的去除

点云及其文件下载:https://github.com/zhouyelihua/PointCloudProcessing
pcl的离群点计算是利用单点计算其周边的方差,利用方差的大小来判断其取舍


cmake文件

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)project(filter)find_package(PCL 1.2 REQUIRED)include_directories(${PCL_INCLUDE_DIRS})link_directories(${PCL_LIBRARY_DIRS})add_definitions(${PCL_DEFINITIONS})add_executable (filter filter.cpp)target_link_libraries (filter ${PCL_LIBRARIES})

c++程序代码

#include <iostream>#include <pcl/io/pcd_io.h>#include <pcl/point_types.h>#include <pcl/registration/icp.h>#include <pcl/features/normal_3d.h>#include <pcl/visualization/pcl_visualizer.h>#include <pcl/surface/mls.h>#include <pcl/common/centroid.h>#include <pcl/common/transforms.h>#include <pcl/filters/statistical_outlier_removal.h>//#include <pcl/filters/convolution_3d.h>#include<iostream>#include<fstream>#include<vector>typedef pcl::PointXYZRGB PointT;typedef pcl::PointCloud<PointT> PointCloudT;int    main (int argc, char** argv){    std::vector<double> X_vector;    std::vector<double> Y_vector;    std::vector<double> Z_vector;    std::vector<double> R_vector;    std::vector<double> G_vector;    std::vector<double> B_vector;    //X_vector.reserve(100000);    //Y_vector.reserve(100000);    //Z_vector.reserve(100000);    //R_vector.reserve(100000);    //G_vector.reserve(100000);    //B_vector.reserve(100000);    //X_vector.reserve(100000);    double x_temp, y_temp, z_temp, r_temp, g_temp, b_temp,U,V;    std::fstream in;    char filename[30] = {0};    sprintf(filename, "data%d.asc", 0);    /*fstream in(filename);*/    in.open(filename, fstream::in);    //cout<<"process "<<filename<<endl;    //in.open("Data0.txt", fstream::in);    in.seekg(0);    int NumPoint;    //int nnnn=10000;    int i=0;    while (!in.eof())// while(nnnn--)//  while(i<10)    {        //cout<<x_temp<<"\t";        in >> x_temp >> y_temp >> z_temp >> r_temp >> g_temp >> b_temp>>U>>V;        //cout<<i++<<"\t"<<U<<"\t"<<V<<endl;        //cout<<x_temp<<"\t";        X_vector.push_back(x_temp);        Y_vector.push_back(y_temp);        Z_vector.push_back(z_temp);        R_vector.push_back(r_temp);        G_vector.push_back(g_temp);        B_vector.push_back(b_temp);    }    cout<<"read done"<<filename<<endl;    NumPoint =X_vector.size();    cout<<NumPoint<<endl;    cout<<"begin!\n";    // Load point cloud from disk    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_in (new pcl::PointCloud<pcl::PointXYZRGB>);    // Fill in the cloud data    cloud_in->width  = NumPoint;    cloud_in->height = 1;    cloud_in->points.resize (cloud_in->width * cloud_in->height);    cout<<"cloud_in->points.size ()"<<cloud_in->points.size ()<<endl;    //for (size_t i = 0; i < cloud->points.size (); ++i)    for (size_t i = 0; i < cloud_in->points.size (); ++i)    {        //cout<<i<<endl;        cloud_in->points[i].x = X_vector.at(i) ;        cloud_in->points[i].y = Y_vector.at(i) ;        cloud_in->points[i].z = Z_vector.at(i) ;        cloud_in->points[i].r = (int)(R_vector.at(i)*255 );        cloud_in->points[i].g = (int)(G_vector.at(i)*255 );        cloud_in->points[i].b = (int)(B_vector.at(i)*255 );        //cout<<i<<endl;    }    X_vector.clear();    Y_vector.clear();    Z_vector.clear();    R_vector.clear();    G_vector.clear();    B_vector.clear();    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_out_filtered (new pcl::PointCloud<pcl::PointXYZRGB>);    pcl::StatisticalOutlierRemoval<pcl::PointXYZRGB>sor;    sor.setInputCloud(cloud_in);    sor.setMeanK(100);    sor.setStddevMulThresh(1.0);    sor.filter(*cloud_out_filtered);    //pcl::filters::GaussianKernelRGB<pcl::PointXYZRGB,pcl::PointXYZRGB> sor_in;    //sor_in.setInputCloud (cloud_in);    // sor_in.setSigma(0.1);    //sor_in.setThreshold(1.0);    // sor_in.setThresholdRelativeToSigma(0.1f);    //sor_in.initCompute();    //sor_in.(cloud_out_filtered);    std::fstream out2;    out2.open("data1out.txt", fstream::out);    for (size_t i = 0; i < cloud_out_filtered->points.size (); ++i)    {        //cout<<i<<endl;        out2<<cloud_out_filtered->points[i].x<<"\t"            <<cloud_out_filtered->points[i].y<<"\t"            <<cloud_out_filtered->points[i].z<<"\t"            <<(int)cloud_out_filtered->points[i].r<<"\t"            <<(int)cloud_out_filtered->points[i].g<<"\t"            <<(int)cloud_out_filtered->points[i].b<<"\n";        //cout<<i<<endl;    }    out2.close();    return (0);}

点云文件的格式

点云文件描述图

效果涉及实验室机密不展示了

2 1
原创粉丝点击