问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Windows环境下pcl点云库 安装配置全流程(精简、有效)

创作时间:
作者:
@小白创作中心

Windows环境下pcl点云库 安装配置全流程(精简、有效)

引用
CSDN
1.
https://blog.csdn.net/zaibeijixing/article/details/130770476

本文将详细介绍在Windows环境下(具体为win10系统)配置和使用PCL(Point Cloud Library)点云库的完整流程。从下载安装包开始,详细介绍了安装过程、环境变量设置,以及在Visual Studio 2019中进行项目配置和代码实战的完整流程。

【1】下载安装包

下载链接:Releases · PointCloudLibrary/pcl · GitHub

其中,AllInOne是一个包含了PCL库所有模块的单独下载包,方便快速获取整个PCL库,而pdb则是PCL库的调试信息文件,可以在程序崩溃时提供更详细的调试信息来分析解决错误。

【2】安装

2.1 先执行win64.exe

建议自定义安装的位置,按提示操作即可,建议把pcl添加到PATH中。

2.2 解压win64.zip

把解压出来的子文件,全部复制到如下 PCL/bin中

2.3 OpenNI2安装

执行.msi,建议修改路径到该文件夹下;如果已安装过,建议Remove后重新安装,以便后续添加PATH和使用时路径清晰。

安装完毕,该路径如下:

【3】设置环境变量

“此电脑”右键>>属性,如下图添加,再重启电脑:

【4】visual studio 项目实战

4.1 新建C++空项目

可设置Debug-x64,并右键 >> 属性进行配置。

4.2 包含目录

如下图,编辑包含目录:

添加如下路径(不同库的路径层级不同,建议各层级都添加避免包含错误):

D:\tools\PCL 1.11.1\include\pcl-1.11
D:\tools\PCL 1.11.1\include\pcl-1.11\pcl
D:\tools\PCL 1.11.1\3rdParty\Boost\include\boost-1_74
D:\tools\PCL 1.11.1\3rdParty\Boost\include\boost-1_74\boost
D:\tools\PCL 1.11.1\3rdParty\Eigen\eigen3
D:\tools\PCL 1.11.1\3rdParty\Eigen\eigen3\Eigen
D:\tools\PCL 1.11.1\3rdParty\Eigen\eigen3\unsupported
D:\tools\PCL 1.11.1\3rdParty\Eigen\eigen3\unsupported\Eigen
D:\tools\PCL 1.11.1\3rdParty\FLANN\include
D:\tools\PCL 1.11.1\3rdParty\FLANN\include\flann
D:\tools\PCL 1.11.1\3rdParty\OpenNI2\Include
D:\tools\PCL 1.11.1\3rdParty\Qhull\include
D:\tools\PCL 1.11.1\3rdParty\Qhull\include\libqhull
D:\tools\PCL 1.11.1\3rdParty\Qhull\include\libqhull_r
D:\tools\PCL 1.11.1\3rdParty\Qhull\include\libqhullcpp
D:\tools\PCL 1.11.1\3rdParty\VTK\include
D:\tools\PCL 1.11.1\3rdParty\VTK\include\vtk-8.2

4.3 库目录

仿照4.3包含目录添加库目录:

D:\tools\PCL 1.11.1\lib
D:\tools\PCL 1.11.1\3rdParty\Boost\lib
D:\tools\PCL 1.11.1\3rdParty\FLANN\lib
D:\tools\PCL 1.11.1\3rdParty\OpenNI2\Lib
D:\tools\PCL 1.11.1\3rdParty\Qhull\lib
D:\tools\PCL 1.11.1\3rdParty\VTK\lib

4.4 添加附加依赖项

需要添加PCL和VTK的debug版lib,总共140多个。

可以通过以下批处理的方法:

cd\d D:\tools\PCL 1.11.1\lib //转到lib目录
dir/b *d.lib >0.txt //把debug用的d.lib后缀名字写到0.txt中
两次操作把这些名字复制粘贴到附加依赖项中。

4.5 添加.cpp并执行显示效果

#include <iostream>
#include <thread>
#include <pcl/console/parse.h>
#include <pcl/point_cloud.h> // for PointCloud
#include <pcl/common/io.h> // for copyPointCloud
#include <pcl/point_types.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_plane.h>
#include <pcl/sample_consensus/sac_model_sphere.h>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std::chrono_literals;
pcl::visualization::PCLVisualizer::Ptr
simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
{
    // --------------------------------------------
    // -----Open 3D viewer and add point cloud-----
    // --------------------------------------------
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
    viewer->setBackgroundColor(0, 0, 0);
    viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
    //viewer->addCoordinateSystem (1.0, "global");
    viewer->initCameraParameters();
    return (viewer);
}
int
main(int argc, char** argv)
{
    // initialize PointClouds
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr final(new pcl::PointCloud<pcl::PointXYZ>);
    // populate our PointCloud with points
    cloud->width = 500;
    cloud->height = 1;
    cloud->is_dense = false;
    cloud->points.resize(cloud->width * cloud->height);
    for (pcl::index_t i = 0; i < static_cast<pcl::index_t>(cloud->size()); ++i)
    {
        if (pcl::console::find_argument(argc, argv, "-s") >= 0 || pcl::console::find_argument(argc, argv, "-sf") >= 0)
        {
            (*cloud)[i].x = 1024 * rand() / (RAND_MAX + 1.0);
            (*cloud)[i].y = 1024 * rand() / (RAND_MAX + 1.0);
            if (i % 5 == 0)
                (*cloud)[i].z = 1024 * rand() / (RAND_MAX + 1.0);
            else if (i % 2 == 0)
                (*cloud)[i].z = sqrt(1 - ((*cloud)[i].x * (*cloud)[i].x)
- ((*cloud)[i].y * (*cloud)[i].y));
            else
                (*cloud)[i].z = -sqrt(1 - ((*cloud)[i].x * (*cloud)[i].x)
- ((*cloud)[i].y * (*cloud)[i].y));
        }
        else
        {
            (*cloud)[i].x = 1024 * rand() / (RAND_MAX + 1.0);
            (*cloud)[i].y = 1024 * rand() / (RAND_MAX + 1.0);
            if (i % 2 == 0)
                (*cloud)[i].z = 1024 * rand() / (RAND_MAX + 1.0);
            else
                (*cloud)[i].z = -1 * ((*cloud)[i].x + (*cloud)[i].y);
        }
    }
    std::vector<int> inliers;
    // created RandomSampleConsensus object and compute the appropriated model
    pcl::SampleConsensusModelSphere<pcl::PointXYZ>::Ptr
        model_s(new pcl::SampleConsensusModelSphere<pcl::PointXYZ>(cloud));
    pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr
        model_p(new pcl::SampleConsensusModelPlane<pcl::PointXYZ>(cloud));
    if (pcl::console::find_argument(argc, argv, "-f") >= 0)
    {
        pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_p);
        ransac.setDistanceThreshold(.01);
        ransac.computeModel();
        ransac.getInliers(inliers);
    }
    else if (pcl::console::find_argument(argc, argv, "-sf") >= 0)
    {
        pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_s);
        ransac.setDistanceThreshold(.01);
        ransac.computeModel();
        ransac.getInliers(inliers);
    }
    // copies all inliers of the model computed to another PointCloud
    pcl::copyPointCloud(*cloud, inliers, *final);
    // creates the visualization object and adds either our original cloud or all of the inliers
    // depending on the command line arguments specified.
    pcl::visualization::PCLVisualizer::Ptr viewer;
    if (pcl::console::find_argument(argc, argv, "-f") >= 0 || pcl::console::find_argument(argc, argv, "-sf") >= 0)
        viewer = simpleVis(final);
    else
        viewer = simpleVis(cloud);
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
        std::this_thread::sleep_for(100ms);
    }
    return 0;
}

可视化效果
执行结果:

另:执行可能出现的代码错误解决方法

会出现两种错误,如下解决:

错误一:

_CRT_SECURE_NO_DEPRECATE

解决方法有两种:

1、直接跳转到该位置注释;
PCL-1.11.1\include\pcl-1.11\pcl\visualization\point_cloud_color_handlers.h,注释如下:
2、或在预编译器添加 _CRT_SECURE_NO_DEPRECATE

错误二:

getColor (scalars)

解决方法:

找到\PCL-1.11.1\3rdParty\Boost\include\boost-1_74\boost\function_output_iterator.hpp,把getColor (scalars)替换成getColor (),如下:

注:部分地方参考:
PCL学习笔记(一)-- Windows下配置安装PCL开发环境_pcl环境配置_看到我请叫我学C++的博客-CSDN博客

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号