写在前面
- 本文内容
本文是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等开源点云库,技术交流、咨询可私信