寫在前面
- 本文內容
本文是PCL1.14.0在Windows下的安裝、使用教程;
PCL、Open3D其他版本的編譯和使用相關教程見
各個版本的Open3D、PCL的編譯、使用教程 - 平臺/環境
windows11(windows10): visual studio 2022;cmake 3.22+; VsCode - 轉載請注明出處:
https://blog.csdn.net/qq_41102371/article/details/136423654
目錄
- 寫在前面
- 安裝PCL1.14.0
- 使用
- 準備測試demo源碼和文件
- 添加可視化源碼
- 編譯運行
- 參考
- 完
安裝PCL1.14.0
-下載
從官方下載編譯好的包:
https://github.com/PointCloudLibrary/pcl/releases
- 開始安裝
- 環境變量
為PCL添加環境變量,這一步是為了運行基于PCL的程序時自動加載PCL相關動態庫的,可以選擇添加,這里選擇不添加,因為電腦上已有其他版本PCL的環境變量,下文會在使用時教大家怎么用腳本添加臨時的環境變量
- 安裝路徑
自己選擇合適的安裝路徑,這里是D:\carlos\install\PCL 1.14.0,因為我自己所有的庫都安裝在這里
- 選擇組件
都選上
可能會彈出一些確認窗口,點擊安裝就行
- 安裝完成
此時檢查下3rdparty/OpenNI2里面是不是只有一個.msi,如果是,那么就是你之前安裝過其他版本的PCL可能導致OpenNI2沒法安裝到當前位置,那么把之前的復制過來就好了
比如我之前裝過PCL1.10.0,系統就會檢測到OpenNI2已經被安裝而不會繼續被安裝到當前目錄
使用
準備測試demo源碼和文件
我們隨便找一個PCL官方提供的demo,這里選的是正態分布濾波(官方文檔在此),先點擊下載測試數據,再找打本地源碼路徑
YOUR_PATH_\PCL 1.14.0\share\doc\pcl-1.14\tutorials\sources\statistical_removal
把下載的測試數據放到該目錄下
然后命令行cd進入該目錄,并用vscode打開該目錄(注意下列命令是我的安裝路徑,根據自己的修改)
d:
cd "D:/carlos/install/PCL 1.14.0/share/doc/pcl-1.14/tutorials/sources/statistical_removal"
code .
添加可視化源碼
官方源碼將濾波后的點云直接保存,沒有可視化,下面是添加了可視化的代碼,將下面的代碼替換statistical_removal.cpp里的內容即可
#include <iostream>
#include <chrono>
#include <thread>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/visualization/cloud_viewer.h>template <typename PointT>
void PcdVisualizer(pcl::PointCloud<PointT> cloud, bool coordinate = false)
{pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::PointCloud<PointT>::Ptr cloud_ptr(new pcl::PointCloud<PointT>);*cloud_ptr = cloud;viewer->addPointCloud<PointT>(cloud_ptr, "cloud");if (coordinate){viewer->addCoordinateSystem(1.0, "global");}while (!viewer->wasStopped()){viewer->spinOnce(100);// td::this_thread::sleep_for(100ms);std::this_thread::sleep_for(std::chrono::milliseconds(100));}
}int main()
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered_inliers(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered_outliers(new pcl::PointCloud<pcl::PointXYZ>);// Fill in the cloud datapcl::PCDReader reader;// Replace the path below with the path where you saved your filereader.read<pcl::PointXYZ>("table_scene_lms400.pcd", *cloud);std::cerr << "Cloud before filtering: " << std::endl;std::cerr << *cloud << std::endl;// Create the filtering objectpcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;sor.setInputCloud(cloud);sor.setMeanK(50);sor.setStddevMulThresh(1.0);sor.filter(*cloud_filtered_inliers);std::cerr << "Cloud after filtering: " << std::endl;std::cerr << *cloud_filtered_inliers << std::endl;pcl::PCDWriter writer;writer.write<pcl::PointXYZ>("table_scene_lms400_inliers.pcd", *cloud_filtered_inliers, false);sor.setNegative(true);sor.filter(*cloud_filtered_outliers);writer.write<pcl::PointXYZ>("table_scene_lms400_outliers.pcd", *cloud_filtered_outliers, false);std::cout << "before filter" << std::endl;PcdVisualizer(*cloud);std::cout << "after filter" << std::endl;PcdVisualizer(*cloud_filtered_inliers);return (0);
}
編譯運行
添加compile.bat和運行腳本run.bat,用來寫編譯腳本和運行腳本
compile.bat內容,這里DPCL_DIR就指定了尋找PCL的位置
cmake -DCMAKE_BUILD_TYPE=Release ^
-DPCL_DIR="D:/carlos/install/PCL 1.14.1/cmake" ^
-S ./ -B ./buildcmake --build ./build --config Release --target ALL_BUILD
run.bat內容,這里set PATH就在添加PCL的環境變量,程序運行時才能找到PCL的動態庫
@REM 設置PCL環境變量
set PATH=D:\carlos\install\PCL 1.14.0\bin;^
D:\carlos\install\PCL 1.14.0\3rdParty\FLANN\bin;^
D:\carlos\install\PCL 1.14.0\3rdParty\VTK\bin;^
D:\carlos\install\PCL 1.14.0\3rdParty\Qhull\bin;^
D:\carlos\install\PCL 1.14.0\3rdParty\OpenNI2\Tools;%PATH%
@REM 運行程序
.\build\Release\statistical_removal.exe .\table_scene_lms400.pcd
開始編譯,打開一個terminal窗口,執行編譯腳本compile.bat
編譯成功后生成statistical_removal.exe
運行,執行run.bat腳本
結果
濾波前
濾波后
參考
文中已列出
完
主要做激光/影像三維重建,配準、分割等常用點云算法,熟悉open3d、pcl等開源點云庫,技術交流、咨詢可私信