1. 程式人生 > 其它 >6、ubuntu16.04 下 pcl的vogelgrid降取樣處理 過程

6、ubuntu16.04 下 pcl的vogelgrid降取樣處理 過程

技術標籤:三維點雲計算機視覺自動駕駛

pcl的vogelgrid降取樣處理 過程

pcl安裝:Ubuntu16.04下面 PCL的最簡單的安裝方法

PCL可以實現點雲柵格化降取樣的功能。PCL實現的VoxelGrid是通過將整個空間劃分為若干大小相等的三維空間,把空間中的重心點代表整個柵格中的點保留下來,以此來達到實現降取樣的目的。
這樣處理過的點雲的密度將會顯著減小,但是能夠很好的保留原始的曲面特徵。

步驟:

1、新建voxel_grid_filter,voxel_grid_filter檔案下新建voxel_grid_filter.cpp 程式碼見:

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
 
#include <pcl/console/parse.h>
#include <pcl/visualization/cloud_viewer.h>

using namespace std;

int main(int argc, char** argv) 
{
     std::vector<int> filenames;
     filenames = pcl::console::parse_file_extension_argument (argc, argv, ".pcd");

     pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>);
     pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZI>);
     
     // 裝載點雲資料
     pcl::io::loadPCDFile(argv[filenames[0]], *cloud);
     
      //輸出取樣前的點雲資訊
      std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height 
       << " data points (" << pcl::getFieldsList (*cloud) << ")."<<endl;

     // 建立濾波器物件
     pcl::VoxelGrid<pcl::PointXYZI> sor;//濾波器處理物件
     
     sor.setInputCloud(cloud);//設定輸入點雲
     
      //設定濾波器處理時採用的體素大小的引數,體素大小是長寬高均初始化為0.5,可以自己設定改變最後降取樣點的數量
     sor.setLeafSize(0.50f, 0.50f, 0.50f);

     sor.filter(*cloud_filtered);//執行下采樣,下采樣之後的點雲資料儲存到 cloud_filtered 中
     
     //輸出取樣後的點雲資訊
     std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height
          << " data points (" << pcl::getFieldsList(*cloud_filtered) << ")."<<endl;
      
    
     pcl::io::savePCDFileASCII("output_downsampled.pcd", *cloud_filtered); //儲存轉換後的點雲

     pcl::visualization::CloudViewer viewer("Cloud Viewer");//建立名為Cloud Viewer
     
     viewer.showCloud(cloud_filtered);//showCloud函式是同步的,會在此處等待直到渲染顯示為止
    
     while (!viewer.wasStopped())
     {
          //在此處新增其他處理
          
     }

     return (0);
}

2、voxel_grid_filter檔案下新建CMakeLists.txt 程式碼見檔案:

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

3、編譯:
voxel_grid_filter檔案下新建build編譯。(在 voxel_grid_filter檔案下開啟終端跟著做就可以了):

   mkdir build
   cd build
   cmake ..
   make 
   cd ..
   build/voxel_grid_filter twoDroneLocalization.pcd

mkdir build
cd build/
cmake …
make #編譯
cd …#切換目錄
build/voxel_grid_filter twoDroneLocalization.pcd#執行,twoDroneLocalization.pcd可以換成自己的pcd檔案,但是要放在voxel_grid_filte下

4、結束:

降取樣前:

三維點雲降取樣前的樣子

降取樣後:

三維點雲降取樣後點樣子


在這裡插入圖片描述

從視覺化結果,明顯也能看出,點的密度大小與整齊程度不同,雖然處理後資料量大大減少,但很明顯其所含有的形狀特徵與空間結構資訊與原始點雲差不多。
降取樣的結果會儲存到同文件夾下的 output_downsampled.pcd 中。檔案中包含(除了sample_result):
在這裡插入圖片描述
在voxel_grid_filter下開啟終端,輸入pcl_viewer twoDroneLocalization.pcd可檢視原始點雲,
當前資料夾開啟終端輸入:pcl_viewer output_downsampled.pcd 可檢視醬菜樣結果。
需要pcd格式檔案做實驗的話可以留言。

同樣優秀的部落格推薦:https://blog.csdn.net/weixin_42208807/article/details/109807006

PCl 經典資料:《點雲庫PCL學習教程》 朱德海