PCL双边滤波

11 篇文章 2 订阅

1、BilteralFilter.cpp:

kdTree只能使用pcl/search/kdtree.h里的,pcl/kdtree/kdtree_flann.h里的在setSearchMethod()函数中会出现报错。

暂时没有强度数据模型,只是运行通过了,所以就没有做可视化这块。

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <pcl/point_types.h>  
  2. #include <pcl/io/pcd_io.h>  
  3. #include <pcl/kdtree/kdtree_flann.h>  
  4. #include <pcl/filters/bilateral.h>  
  5.   
  6.   
  7. #include <pcl/kdtree/flann.h>  
  8. #include <pcl/kdtree/kdtree.h>  
  9. #include <pcl/search/flann_search.h>  
  10. #include <pcl/search/kdtree.h>  
  11.   
  12.   
  13. typedef pcl::PointXYZI PointT;  
  14.   
  15.   
  16. int  
  17. main(int argc, char*argv[])  
  18. {  
  19.     std::string incloudfile = argv[1];  
  20.     std::string outcloudfile = argv[2];  
  21.     float sigma_s = atof(argv[3]);  
  22.     float sigma_r = atof(argv[4]);  
  23.   
  24.   
  25.     // 读入点云文件  
  26.     pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);  
  27.     pcl::io::loadPCDFile(incloudfile.c_str(), *cloud);  
  28.   
  29.   
  30.     pcl::PointCloud<PointT>outcloud;  
  31.   
  32.   
  33.     // 建立kdtree  
  34.     //pcl::KdTreeFLANN<PointT>::Ptr tree(new pcl::KdTreeFLANN<PointT>);  
  35.     pcl::search::KdTree<PointT>::Ptr tree1(new pcl::search::KdTree<PointT>);  
  36.     pcl::BilateralFilter<PointT> bf;  
  37.     bf.setInputCloud(cloud);  
  38.     bf.setSearchMethod(tree1);  
  39.     bf.setHalfSize(sigma_s);  
  40.     bf.setStdDev(sigma_r);  
  41.     bf.filter(outcloud);  
  42.   
  43.   
  44.     // 保存滤波输出点云文件  
  45.     pcl::io::savePCDFile(outcloudfile.c_str(), outcloud);  
  46.     return (0);  
  47. }  


2、FastBilateralFilter.cpp

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //点的类型的头文件    
  2. #include <pcl/point_types.h>  //required  
  3. //点云文件IO(pcd文件和ply文件)    
  4. #include <pcl/io/pcd_io.h>  //required  
  5. #include <pcl/io/ply_io.h>    
  6. //kd树    
  7. #include <pcl/kdtree/kdtree_flann.h>    
  8. //特征提取    
  9. #include <pcl/features/normal_3d_omp.h>    
  10. #include <pcl/features/normal_3d.h>    
  11. //重构    
  12. #include <pcl/surface/gp3.h>    
  13. #include <pcl/surface/poisson.h>    
  14. //可视化    
  15. #include <pcl/visualization/pcl_visualizer.h>   
  16. #include <pcl/visualization/cloud_viewer.h>  
  17. //多线程    
  18. #include <boost/thread/thread.hpp>    
  19. #include <fstream>    
  20. #include <iostream>    
  21. #include <stdio.h>    
  22. #include <string.h>    
  23. #include <string>    
  24. //计时    
  25. #include <time.h>   
  26. //Bilateral Filter  
  27. #include <pcl/filters/bilateral.h>//required  
  28. #include <pcl/filters/fast_bilateral.h>  
  29. #include <pcl/filters/fast_bilateral_omp.h>  
  30.   
  31. typedef pcl::PointXYZI PointT;  
  32.   
  33. float sigma_s;  
  34. float sigma_r;  
  35.   
  36. int main(int argc, char** argv)  
  37. {  
  38.     // 确定文件格式    
  39.     char tmpStr[100];  
  40.     strcpy(tmpStr, argv[1]);  
  41.     char* pext = strrchr(tmpStr, '.');  
  42.     std::string extply("ply");  
  43.     std::string extpcd("pcd");  
  44.     if (pext){  
  45.         *pext = '\0';  
  46.         pext++;  
  47.     }  
  48.     std::string ext(pext);  
  49.     //如果不支持文件格式,退出程序    
  50.     if (!((ext == extply) || (ext == extpcd))){  
  51.         std::cout << "文件格式不支持!" << std::endl;  
  52.         std::cout << "支持文件格式:*.pcd和*.ply!" << std::endl;  
  53.         return(-1);  
  54.     }  
  55.   
  56.     //根据文件格式选择输入方式    
  57.     pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>); //创建点云对象指针,用于存储输入    
  58.     pcl::PointCloud<pcl::PointXYZI> outcloud;  
  59.     //pcl::PCLPointCloud2::ConstPtr cloud;  
  60.   
  61.     if (ext == extply){  
  62.         if (pcl::io::loadPLYFile(argv[1], *cloud) == -1){  
  63.             PCL_ERROR("Could not read ply file!\n");  
  64.             return -1;  
  65.         }  
  66.     }  
  67.     else{  
  68.         if (pcl::io::loadPCDFile(argv[1], *cloud) == -1){  
  69.             PCL_ERROR("Could not read pcd file!\n");  
  70.             return -1;  
  71.         }  
  72.     }  
  73.     /  
  74.     //create a timer    
  75.     clock_t start, end;  
  76.   
  77.       
  78.   
  79.     //(1)如果点云是有序的,通过 pcl: : Organ izedDatalnd ex 使用有序搜索方法 。  
  80.     //(2 ) 如果点云是无序的,通过 pcl : : KdTreeFLANN 使用通用的 Kd 树  
  81.     //有序点云  
  82.     //Example:  
  83.     //  cloud.width = 640; // Image-like organized structure, with 640 rows and 480 columns,  
  84.     //  cloud.height = 480; // thus 640*480=307200 points total in the dataset  
  85.     //无序点云  
  86.     //Example:  
  87.     //  cloud.width = 307200;  
  88.     //  cloud.height = 1; // unorganized point cloud dataset with 307200 points  
  89.   
  90.   
  91.   
  92.     // 建立kdtree  
  93.     pcl::KdTreeFLANN<pcl::PointXYZI>::Ptr tree(new pcl::KdTreeFLANN<pcl::PointXYZI>);  
  94.   
  95.     pcl::BilateralFilter<pcl::PointXYZI> bf;  
  96.     bf.setInputCloud(cloud);  
  97.     //bf.setSearchMethod(tree);  
  98.     bf.setHalfSize(sigma_s);  
  99.     bf.setStdDev(sigma_r);  
  100.     bf.filter(outcloud);  
  101.   
  102.     // 保存滤波输出点云文件  
  103.     //pcl::io::savePCDFile(outcloud, "outcloud");  
  104.   
  105.     /  
  106.     // Apply the filter  
  107.       
  108.     //pcl::FastBilateralFilterOMP<pcl::PointXYZ> fbf(10);//OpenMP Accelerator  
  109.       
  110.   
  111.     //pcl::FastBilateralFilter<pcl::PointXYZ> fbf;  
  112.     fbf.setInputCloud(cloud);  
  113.     //fbf.setInputCloud(cloud);  
  114.     //fbf.setSigmaS(5.0);//定义算法支持的滤波范围的大小  
  115.     //fbf.setSigmaR(0.003);  
  116.     //pcl::PointCloud<pcl::PointXYZ> cloud_filtered;  
  117.   
  118.     //start = clock();  
  119.     fbf.filter(cloud_filtered);  
  120.     //fbf.applyFilter(cloud_filtered);  
  121.     //end = clock();  
  122.   
  123.     //std::cerr << "Start compute!" << std::endl;  
  124.     //std::cerr << (end - start) / CLOCKS_PER_SEC << "s used!" << std::endl;  
  125.   
  126.      Convert data back  
  127.     //pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_output;  
  128.     toPCLPointCloud2(cloud_filtered, cloud_output);  
  129.     //pcl::concatenateFields(*cloud, cloud_filtered, *cloud_output);  
  130.     //pcl::copyPointCloud(*cloud_output, *cloud);  
  131.   
  132.     pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("BilateralFilter"));  
  133.     viewer->addPointCloud(outcloud, "cloud");  
  134.   
  135.     viewer->updateCamera();  
  136.     viewer->updatePointCloud(cloud, "cloud");  
  137.     viewer->initCameraParameters();  
  138.   
  139.     //viewer->spin();    
  140.     while (!viewer->wasStopped()){  
  141.         viewer->spinOnce(100);  
  142.         boost::this_thread::sleep(boost::posix_time::microseconds(100000));  
  143.     }  
  144.   
  145.     return 0;  
  146. }  

转载:http://blog.csdn.net/sinat_24206709/article/details/51956301
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值