从PointNet到PCL:我是如何用VS2019在Win10上搭建第一个点云可视化Demo的

发布时间:2026/7/5 8:05:22

从PointNet到PCL:我是如何用VS2019在Win10上搭建第一个点云可视化Demo的 从PointNet到PCL我是如何用VS2019在Win10上搭建第一个点云可视化Demo的第一次读到PointNet论文时那些在三维空间中跳动的点云数据让我着迷。但论文中的可视化效果似乎依赖于专业CAD软件而我更想用代码直接操控这些空间点阵。经过一番探索我发现了点云库PCL——这个被誉为OpenCV for 3D的强大工具。本文将分享我在Windows 10系统下使用Visual Studio 2019搭建PCL开发环境并实现第一个点云可视化Demo的全过程。1. 环境准备PCL与VS2019的完美组合选择PCL 1.11.0版本是因为它与VS2019有着最佳的兼容性。就像搭积木需要稳固的基础环境配置是整个项目成功的关键第一步。1.1 获取安装包需要下载两个核心文件PCL-1.11.0-AllInOne-msvc2019-win64.exe主安装程序pcl-1.11.0-pdb-msvc2019-win64.zip调试符号文件提示建议从PCL官方GitHub仓库下载确保文件完整性。1.2 安装过程详解安装时有两个关键决策点勾选Add PCL to the system PATH for all users选项修改OpenNI2的安装路径到PCL目录下的3rdParty文件夹安装完成后需要将pdb文件解压到PCL的bin目录。这一步经常被忽略但对后续调试至关重要。2. 环境变量配置让系统找到PCL即使安装程序自动添加了部分路径手动检查仍是必要的。以下是必须包含的系统环境变量变量类型路径示例PATHD:\PCL\binPATHD:\PCL\3rdParty\VTK\binPATHD:\PCL\3rdParty\OpenNI2\Redist# 验证环境变量是否生效 echo %PATH%如果发现路径缺失需要手动添加并重启系统使更改生效。3. VS2019项目配置精细调整每一步3.1 基础项目设置新建空项目后首先确保平台工具集设置为Visual Studio 2019解决方案平台为x64配置为Release3.2 包含目录与库目录在属性管理器中需要添加以下包含目录D:\PCL\include\pcl-1.11 D:\PCL\3rdParty\Boost\include\boost-1_73 D:\PCL\3rdParty\Eigen\eigen3 D:\PCL\3rdParty\FLANN\include D:\PCL\3rdParty\Qhull\include D:\PCL\3rdParty\VTK\include\vtk-8.2 D:\PCL\3rdParty\OpenNI2\Include库目录则需要包含D:\PCL\lib D:\PCL\3rdParty\Boost\lib D:\PCL\3rdParty\FLANN\lib D:\PCL\3rdParty\Qhull\lib D:\PCL\3rdParty\VTK\lib D:\PCL\3rdParty\OpenNI2\Lib3.3 预处理器与链接器设置关键预处理器定义BOOST_USE_WINDOWS_H NOMINMAX _CRT_SECURE_NO_DEPRECATE同时需要关闭SDL检查这在项目属性和属性页中都需要设置。4. 第一个点云可视化Demo配置完成后终于可以编写代码了。我们从最简单的点云生成和显示开始。4.1 创建随机点云#include pcl/visualization/cloud_viewer.h #include pcl/point_cloud.h #include pcl/point_types.h int main() { // 创建点云对象 pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ); // 生成1000个随机点 cloud-width 1000; cloud-height 1; cloud-points.resize(cloud-width * cloud-height); for (size_t i 0; i cloud-points.size(); i) { cloud-points[i].x 1024 * rand() / (RAND_MAX 1.0f); cloud-points[i].y 1024 * rand() / (RAND_MAX 1.0f); cloud-points[i].z 1024 * rand() / (RAND_MAX 1.0f); } // 创建可视化窗口 pcl::visualization::CloudViewer viewer(Simple Cloud Viewer); viewer.showCloud(cloud); // 保持窗口打开 while (!viewer.wasStopped()) {} return 0; }4.2 加载并显示PCD文件实际项目中我们更多需要处理已有的点云数据。PCL支持多种点云文件格式其中PCD是最常用的。#include pcl/io/pcd_io.h #include pcl/visualization/cloud_viewer.h int main(int argc, char** argv) { if (argc 2) { std::cerr Usage: argv[0] pcd-file\n; return -1; } pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ); // 加载PCD文件 if (pcl::io::loadPCDFilepcl::PointXYZ(argv[1], *cloud) -1) { std::cerr Couldnt read file argv[1] \n; return -1; } std::cout Loaded cloud-width * cloud-height data points\n; // 可视化 pcl::visualization::CloudViewer viewer(PCD Viewer); viewer.showCloud(cloud); while (!viewer.wasStopped()) {} return 0; }5. 常见问题与解决方案在配置过程中我遇到了几个典型问题这里分享解决方法5.1 OpenNI2.dll缺失错误现象运行时提示找不到OpenNI2.dll解决确保环境变量中包含OpenNI2的Redist目录路径5.2 链接错误现象编译时报LNK2019等链接错误解决检查附加依赖项是否包含所有必要的lib文件确认平台工具集和解决方案平台设置正确确保使用的是Release版本的库文件5.3 可视化窗口闪退现象CloudViewer窗口立即关闭解决添加while循环保持窗口打开如示例代码所示6. 进阶自定义点云显示基础的显示功能实现后我们可以进一步定制可视化效果pcl::visualization::PCLVisualizer viewer(Custom Viewer); viewer.setBackgroundColor(0, 0, 0); // 黑色背景 viewer.addPointCloudpcl::PointXYZ(cloud, sample cloud); viewer.setPointCloudRenderingProperties( pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, sample cloud); viewer.addCoordinateSystem(1.0); // 添加坐标系 viewer.initCameraParameters(); while (!viewer.wasStopped()) { viewer.spinOnce(100); std::this_thread::sleep_for(std::chrono::milliseconds(100)); }这段代码实现了自定义背景颜色调整点大小添加参考坐标系更流畅的交互体验7. 从Demo到实际应用完成基础Demo后我尝试将其应用到实际项目中。例如处理Kinect捕获的点云数据时可以添加以下功能点云滤波去除离群点和噪声特征提取计算法线、曲率等特征分割处理将场景分割为不同对象配准对齐将多帧点云拼接为完整场景// 简单的VoxelGrid滤波示例 pcl::VoxelGridpcl::PointXYZ voxel; voxel.setInputCloud(cloud); voxel.setLeafSize(0.01f, 0.01f, 0.01f); // 1cm的体素大小 voxel.filter(*filteredCloud);通过这些扩展简单的Demo就变成了一个实用的点云处理工具。

相关新闻