1、BilteralFilter.cpp:
kdTree只能使用pcl/search/kdtree.h里的,pcl/kdtree/kdtree_flann.h里的在setSearchMethod()函数中会出现报错。
暂时没有强度数据模型,只是运行通过了,所以就没有做可视化这块。
- #include <pcl/point_types.h>
- #include <pcl/io/pcd_io.h>
- #include <pcl/kdtree/kdtree_flann.h>
- #include <pcl/filters/bilateral.h>
- #include <pcl/kdtree/flann.h>
- #include <pcl/kdtree/kdtree.h>
- #include <pcl/search/flann_search.h>
- #include <pcl/search/kdtree.h>
- typedef pcl::PointXYZI PointT;
- int
- main(int argc, char*argv[])
- {
- std::string incloudfile = argv[1];
- std::string outcloudfile = argv[2];
- float sigma_s = atof(argv[3]);
- float sigma_r = atof(argv[4]);
- // 读入点云文件
- pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
- pcl::io::loadPCDFile(incloudfile.c_str(), *cloud);
- pcl::PointCloud<PointT>outcloud;
- // 建立kdtree
- //pcl::KdTreeFLANN<PointT>::Ptr tree(new pcl::KdTreeFLANN<PointT>);
- pcl::search::KdTree<PointT>::Ptr tree1(new pcl::search::KdTree<PointT>);
- pcl::BilateralFilter<PointT> bf;
- bf.setInputCloud(cloud);
- bf.setSearchMethod(tree1);
- bf.setHalfSize(sigma_s);
- bf.setStdDev(sigma_r);
- bf.filter(outcloud);
- // 保存滤波输出点云文件
- pcl::io::savePCDFile(outcloudfile.c_str(), outcloud);
- return (0);
- }
2、FastBilateralFilter.cpp
- //点的类型的头文件
- #include <pcl/point_types.h> //required
- //点云文件IO(pcd文件和ply文件)
- #include <pcl/io/pcd_io.h> //required
- #include <pcl/io/ply_io.h>
- //kd树
- #include <pcl/kdtree/kdtree_flann.h>
- //特征提取
- #include <pcl/features/normal_3d_omp.h>
- #include <pcl/features/normal_3d.h>
- //重构
- #include <pcl/surface/gp3.h>
- #include <pcl/surface/poisson.h>
- //可视化
- #include <pcl/visualization/pcl_visualizer.h>
- #include <pcl/visualization/cloud_viewer.h>
- //多线程
- #include <boost/thread/thread.hpp>
- #include <fstream>
- #include <iostream>
- #include <stdio.h>
- #include <string.h>
- #include <string>
- //计时
- #include <time.h>
- //Bilateral Filter
- #include <pcl/filters/bilateral.h>//required
- #include <pcl/filters/fast_bilateral.h>
- #include <pcl/filters/fast_bilateral_omp.h>
- typedef pcl::PointXYZI PointT;
- float sigma_s;
- float sigma_r;
- int main(int argc, char** argv)
- {
- // 确定文件格式
- char tmpStr[100];
- strcpy(tmpStr, argv[1]);
- char* pext = strrchr(tmpStr, '.');
- std::string extply("ply");
- std::string extpcd("pcd");
- if (pext){
- *pext = '\0';
- pext++;
- }
- std::string ext(pext);
- //如果不支持文件格式,退出程序
- if (!((ext == extply) || (ext == extpcd))){
- std::cout << "文件格式不支持!" << std::endl;
- std::cout << "支持文件格式:*.pcd和*.ply!" << std::endl;
- return(-1);
- }
- //根据文件格式选择输入方式
- pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>); //创建点云对象指针,用于存储输入
- pcl::PointCloud<pcl::PointXYZI> outcloud;
- //pcl::PCLPointCloud2::ConstPtr cloud;
- if (ext == extply){
- if (pcl::io::loadPLYFile(argv[1], *cloud) == -1){
- PCL_ERROR("Could not read ply file!\n");
- return -1;
- }
- }
- else{
- if (pcl::io::loadPCDFile(argv[1], *cloud) == -1){
- PCL_ERROR("Could not read pcd file!\n");
- return -1;
- }
- }
- /
- //create a timer
- clock_t start, end;
- //(1)如果点云是有序的,通过 pcl: : Organ izedDatalnd ex 使用有序搜索方法 。
- //(2 ) 如果点云是无序的,通过 pcl : : KdTreeFLANN 使用通用的 Kd 树
- //有序点云
- //Example:
- // cloud.width = 640; // Image-like organized structure, with 640 rows and 480 columns,
- // cloud.height = 480; // thus 640*480=307200 points total in the dataset
- //无序点云
- //Example:
- // cloud.width = 307200;
- // cloud.height = 1; // unorganized point cloud dataset with 307200 points
- // 建立kdtree
- pcl::KdTreeFLANN<pcl::PointXYZI>::Ptr tree(new pcl::KdTreeFLANN<pcl::PointXYZI>);
- pcl::BilateralFilter<pcl::PointXYZI> bf;
- bf.setInputCloud(cloud);
- //bf.setSearchMethod(tree);
- bf.setHalfSize(sigma_s);
- bf.setStdDev(sigma_r);
- bf.filter(outcloud);
- // 保存滤波输出点云文件
- //pcl::io::savePCDFile(outcloud, "outcloud");
- /
- // Apply the filter
- //pcl::FastBilateralFilterOMP<pcl::PointXYZ> fbf(10);//OpenMP Accelerator
- //pcl::FastBilateralFilter<pcl::PointXYZ> fbf;
- fbf.setInputCloud(cloud);
- //fbf.setInputCloud(cloud);
- //fbf.setSigmaS(5.0);//定义算法支持的滤波范围的大小
- //fbf.setSigmaR(0.003);
- //pcl::PointCloud<pcl::PointXYZ> cloud_filtered;
- //start = clock();
- fbf.filter(cloud_filtered);
- //fbf.applyFilter(cloud_filtered);
- //end = clock();
- //std::cerr << "Start compute!" << std::endl;
- //std::cerr << (end - start) / CLOCKS_PER_SEC << "s used!" << std::endl;
- Convert data back
- //pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_output;
- toPCLPointCloud2(cloud_filtered, cloud_output);
- //pcl::concatenateFields(*cloud, cloud_filtered, *cloud_output);
- //pcl::copyPointCloud(*cloud_output, *cloud);
- pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("BilateralFilter"));
- viewer->addPointCloud(outcloud, "cloud");
- viewer->updateCamera();
- viewer->updatePointCloud(cloud, "cloud");
- viewer->initCameraParameters();
- //viewer->spin();
- while (!viewer->wasStopped()){
- viewer->spinOnce(100);
- boost::this_thread::sleep(boost::posix_time::microseconds(100000));
- }
- return 0;
- }
转载:http://blog.csdn.net/sinat_24206709/article/details/51956301