点云处理c++库——pcl安装

c++版本的pcl安装教程

PCL点云库安装

除了c++版本的pcl,pcl的python版本绑定库主要有两个,一个pcl官方的python-pcl,一个是pclpy。
pclpy的安装请参考系列文章:点云处理库pclpy安装
python-pcl的安装请参考系列文章python-pcl安装教程

c++ 版本的PCL

下载

GitHub:https://github.com/PointCloudLibrary/pcl

最简单的方式就是使用官方编译好的文件——使用All-in-one installers 进行安装,它将将安装PCL和它的所有依赖,除了Qt。

下载:pcl各版本下载.

安装

安装参考:

博客:https://blog.csdn.net/weixin_42059276/article/details/106149359

旧版网站下载安装:https://web.archive.org/web/20191019170325/http://www.pointclouds.org/downloads/windows.html

新网站下载安装:https://pointclouds.org/downloads/#cross-platform

(就网站上讲的比较详细,新网站上面使用vcpkg安装,时间有限未测试)

下面是windows平台下使用All-in-one installers 进行安装过程:

安装PCL

根据自己visual studio的版本选择相应的All-in-one installers ,以及pdb文件,安装。

比如VS2019 + PCL-1.11.0-AllInOne-msvc2019-win64.exe + pcl-1.11.0-pdb-msvc2019-win64.zip,解压“pcl-1.11.0-pdb-msvc2019-win64.zip”,将解压得到的文件夹中的内容添加“…\PCL 1.11.0\bin”中

选择安装路径的时候默认C盘,可以改到自己的路径,其他的默认安装即可。
安装到最后的时候会弹出安装OpenNI的提示,此时也会选择安装路径,默认是C盘。但此前安装已经在pcl的安装目录下的3rdParty文件夹中已经有了空的OpenNI2文件夹,建议将OpenNI安装路径改到此文件夹下,即安装路径为“D:\programming\PCL 1.11.0\3rdParty\OpenNI2”

扩展:

如果使用All-in-one installers 安装,又需要调试基于PCL的代码,进入PCL源码,需要下载All-in-one installers对应的PDB存档文件,将其解压之后放在PCL安装路径下的bin文件夹下面,和DLL文件放在一起。一旦调试器需要进入PCL代码,就会要求你输入PCL源代码文件夹。你可以从官网下载源代码pdb。将它解压到磁盘上的某个地方,并给出调试器的路径。

参考:https://web.archive.org/web/20191019170325/http://www.pointclouds.org/downloads/windows.html

vs2019中配置pcl1.11.0

在Visual studio中的配置方法其实和OpenCV差不多,导入库文件、头文件,依赖项。

主要是PCL以及它的6个第三方库中的库文件、头文件,依赖项:

vc++目录->包含目录:

D:\programming\PCL 1.11.0\include\pcl-1.11
D:\programming\PCL 1.11.0\3rdParty\Boost\include\boost-1_73
D:\programming\PCL 1.11.0\3rdParty\Eigen\eigen3
D:\programming\PCL 1.11.0\3rdParty\FLANN\include
D:\programming\PCL 1.11.0\3rdParty\Qhull\include
D:\programming\PCL 1.11.0\3rdParty\VTK\include\vtk-8.2
D:\programming\PCL 1.11.0\3rdParty\OpenNI2\Include

vc++目录->库目录:

D:\programming\PCL 1.11.0\lib
D:\programming\PCL 1.11.0\3rdParty\Boost\lib
D:\programming\PCL 1.11.0\3rdParty\FLANN\lib
D:\programming\PCL 1.11.0\3rdParty\Qhull\lib
D:\programming\PCL 1.11.0\3rdParty\VTK\lib
D:\programming\PCL 1.11.0\3rdParty\OpenNI2\Lib

链接器—>输入—>附加的依赖项:

PCL 1.11.0\3rdParty\VTK\libPCL 1.11.0\lib这两个文件夹下的lib文件的release版本和Debug版本分别添加到各自的附加依赖项中

由于lib文件较多,手动添加太慢了,可以通过批处理 + python来提取lib文件的名称:

通过批处理把文件夹中的文件名写入到一个txt中:

//win+r调出“运行”窗口并输出cmd
//(填自己的路径)
cd /d D:\programming\PCL 1.11.0\lib 
dir /b *.lib *>0.txt

注意,这个0.txt中会把0.txt和一个pkgconfig文件夹也写进去,复制到附加依赖项之前,应该把这两个删掉,否则会报错

对于相同功能的库,两个版本是挨着的,可以用程序把他们分别写到两个txt中。

分离程序

import numpy as np

file = open('0.txt', 'r')
i = 0
releaseTxt = []
debugTxt = []
while 1:
  line = file.readline()
  line = str(line).replace('\n', '')
  if not line:
    break
  if i%2 == 0:
      releaseTxt.append(line)
  else:
      debugTxt.append(line)
  i = i + 1
file.close()

de = np.array(debugTxt)
np.savetxt('debug.txt', de, fmt="%s", delimiter="")

re = np.array(releaseTxt)
np.savetxt('release.txt', re, fmt="%s", delimiter="")

分离结果如下:

Release版本:

pcl_common.lib
pcl_features.lib
pcl_filters.lib
pcl_io.lib
pcl_io_ply.lib
pcl_kdtree.lib
pcl_keypoints.lib
pcl_ml.lib
pcl_octree.lib
pcl_outofcore.lib
pcl_people.lib
pcl_recognition.lib
pcl_registration.lib
pcl_sample_consensus.lib
pcl_search.lib
pcl_segmentation.lib
pcl_stereo.lib
pcl_surface.lib
pcl_tracking.lib
pcl_visualization.lib
vtkChartsCore-8.2.lib
vtkCommonColor-8.2.lib
vtkCommonComputationalGeometry-8.2.lib
vtkCommonCore-8.2.lib
vtkCommonDataModel-8.2.lib
vtkCommonExecutionModel-8.2.lib
vtkCommonMath-8.2.lib
vtkCommonMisc-8.2.lib
vtkCommonSystem-8.2.lib
vtkCommonTransforms-8.2.lib
vtkDICOMParser-8.2.lib
vtkDomainsChemistry-8.2.lib
vtkDomainsChemistryOpenGL2-8.2.lib
vtkdoubleconversion-8.2.lib
vtkexodusII-8.2.lib
vtkexpat-8.2.lib
vtkFiltersAMR-8.2.lib
vtkFiltersCore-8.2.lib
vtkFiltersExtraction-8.2.lib
vtkFiltersFlowPaths-8.2.lib
vtkFiltersGeneral-8.2.lib
vtkFiltersGeneric-8.2.lib
vtkFiltersGeometry-8.2.lib
vtkFiltersHybrid-8.2.lib
vtkFiltersHyperTree-8.2.lib
vtkFiltersImaging-8.2.lib
vtkFiltersModeling-8.2.lib
vtkFiltersParallel-8.2.lib
vtkFiltersParallelImaging-8.2.lib
vtkFiltersPoints-8.2.lib
vtkFiltersProgrammable-8.2.lib
vtkFiltersSelection-8.2.lib
vtkFiltersSMP-8.2.lib
vtkFiltersSources-8.2.lib
vtkFiltersStatistics-8.2.lib
vtkFiltersTexture-8.2.lib
vtkFiltersTopology-8.2.lib
vtkFiltersVerdict-8.2.lib
vtkfreetype-8.2.lib
vtkGeovisCore-8.2.lib
vtkgl2ps-8.2.lib
vtkglew-8.2.lib
vtkGUISupportMFC-8.2.lib
vtkhdf5-8.2.lib
vtkhdf5_hl-8.2.lib
vtkImagingColor-8.2.lib
vtkImagingCore-8.2.lib
vtkImagingFourier-8.2.lib
vtkImagingGeneral-8.2.lib
vtkImagingHybrid-8.2.lib
vtkImagingMath-8.2.lib
vtkImagingMorphological-8.2.lib
vtkImagingSources-8.2.lib
vtkImagingStatistics-8.2.lib
vtkImagingStencil-8.2.lib
vtkInfovisCore-8.2.lib
vtkInfovisLayout-8.2.lib
vtkInteractionImage-8.2.lib
vtkInteractionStyle-8.2.lib
vtkInteractionWidgets-8.2.lib
vtkIOAMR-8.2.lib
vtkIOAsynchronous-8.2.lib
vtkIOCityGML-8.2.lib
vtkIOCore-8.2.lib
vtkIOEnSight-8.2.lib
vtkIOExodus-8.2.lib
vtkIOExport-8.2.lib
vtkIOExportOpenGL2-8.2.lib
vtkIOExportPDF-8.2.lib
vtkIOGeometry-8.2.lib
vtkIOImage-8.2.lib
vtkIOImport-8.2.lib
vtkIOInfovis-8.2.lib
vtkIOLegacy-8.2.lib
vtkIOLSDyna-8.2.lib
vtkIOMINC-8.2.lib
vtkIOMovie-8.2.lib
vtkIONetCDF-8.2.lib
vtkIOParallel-8.2.lib
vtkIOParallelXML-8.2.lib
vtkIOPLY-8.2.lib
vtkIOSegY-8.2.lib
vtkIOSQL-8.2.lib
vtkIOTecplotTable-8.2.lib
vtkIOVeraOut-8.2.lib
vtkIOVideo-8.2.lib
vtkIOXML-8.2.lib
vtkIOXMLParser-8.2.lib
vtkjpeg-8.2.lib
vtkjsoncpp-8.2.lib
vtklibharu-8.2.lib
vtklibxml2-8.2.lib
vtklz4-8.2.lib
vtklzma-8.2.lib
vtkmetaio-8.2.lib
vtkNetCDF-8.2.lib
vtkogg-8.2.lib
vtkParallelCore-8.2.lib
vtkpng-8.2.lib
vtkproj-8.2.lib
vtkpugixml-8.2.lib
vtkRenderingAnnotation-8.2.lib
vtkRenderingContext2D-8.2.lib
vtkRenderingContextOpenGL2-8.2.lib
vtkRenderingCore-8.2.lib
vtkRenderingExternal-8.2.lib
vtkRenderingFreeType-8.2.lib
vtkRenderingGL2PSOpenGL2-8.2.lib
vtkRenderingImage-8.2.lib
vtkRenderingLabel-8.2.lib
vtkRenderingLOD-8.2.lib
vtkRenderingOpenGL2-8.2.lib
vtkRenderingVolume-8.2.lib
vtkRenderingVolumeOpenGL2-8.2.lib
vtksqlite-8.2.lib
vtksys-8.2.lib
vtktheora-8.2.lib
vtktiff-8.2.lib
vtkverdict-8.2.lib
vtkViewsContext2D-8.2.lib
vtkViewsCore-8.2.lib
vtkViewsInfovis-8.2.lib
vtkzlib-8.2.lib

Debug版本的lib文件:

pcl_commond.lib
pcl_featuresd.lib
pcl_filtersd.lib
pcl_iod.lib
pcl_io_plyd.lib
pcl_kdtreed.lib
pcl_keypointsd.lib
pcl_mld.lib
pcl_octreed.lib
pcl_outofcored.lib
pcl_peopled.lib
pcl_recognitiond.lib
pcl_registrationd.lib
pcl_sample_consensusd.lib
pcl_searchd.lib
pcl_segmentationd.lib
pcl_stereod.lib
pcl_surfaced.lib
pcl_trackingd.lib
pcl_visualizationd.lib
vtkChartsCore-8.2-gd.lib
vtkCommonColor-8.2-gd.lib
vtkCommonComputationalGeometry-8.2-gd.lib
vtkCommonCore-8.2-gd.lib
vtkCommonDataModel-8.2-gd.lib
vtkCommonExecutionModel-8.2-gd.lib
vtkCommonMath-8.2-gd.lib
vtkCommonMisc-8.2-gd.lib
vtkCommonSystem-8.2-gd.lib
vtkCommonTransforms-8.2-gd.lib
vtkDICOMParser-8.2-gd.lib
vtkDomainsChemistry-8.2-gd.lib
vtkDomainsChemistryOpenGL2-8.2-gd.lib
vtkdoubleconversion-8.2-gd.lib
vtkexodusII-8.2-gd.lib
vtkexpat-8.2-gd.lib
vtkFiltersAMR-8.2-gd.lib
vtkFiltersCore-8.2-gd.lib
vtkFiltersExtraction-8.2-gd.lib
vtkFiltersFlowPaths-8.2-gd.lib
vtkFiltersGeneral-8.2-gd.lib
vtkFiltersGeneric-8.2-gd.lib
vtkFiltersGeometry-8.2-gd.lib
vtkFiltersHybrid-8.2-gd.lib
vtkFiltersHyperTree-8.2-gd.lib
vtkFiltersImaging-8.2-gd.lib
vtkFiltersModeling-8.2-gd.lib
vtkFiltersParallel-8.2-gd.lib
vtkFiltersParallelImaging-8.2-gd.lib
vtkFiltersPoints-8.2-gd.lib
vtkFiltersProgrammable-8.2-gd.lib
vtkFiltersSelection-8.2-gd.lib
vtkFiltersSMP-8.2-gd.lib
vtkFiltersSources-8.2-gd.lib
vtkFiltersStatistics-8.2-gd.lib
vtkFiltersTexture-8.2-gd.lib
vtkFiltersTopology-8.2-gd.lib
vtkFiltersVerdict-8.2-gd.lib
vtkfreetype-8.2-gd.lib
vtkGeovisCore-8.2-gd.lib
vtkgl2ps-8.2-gd.lib
vtkglew-8.2-gd.lib
vtkGUISupportMFC-8.2-gd.lib
vtkhdf5-8.2-gd.lib
vtkhdf5_hl-8.2-gd.lib
vtkImagingColor-8.2-gd.lib
vtkImagingCore-8.2-gd.lib
vtkImagingFourier-8.2-gd.lib
vtkImagingGeneral-8.2-gd.lib
vtkImagingHybrid-8.2-gd.lib
vtkImagingMath-8.2-gd.lib
vtkImagingMorphological-8.2-gd.lib
vtkImagingSources-8.2-gd.lib
vtkImagingStatistics-8.2-gd.lib
vtkImagingStencil-8.2-gd.lib
vtkInfovisCore-8.2-gd.lib
vtkInfovisLayout-8.2-gd.lib
vtkInteractionImage-8.2-gd.lib
vtkInteractionStyle-8.2-gd.lib
vtkInteractionWidgets-8.2-gd.lib
vtkIOAMR-8.2-gd.lib
vtkIOAsynchronous-8.2-gd.lib
vtkIOCityGML-8.2-gd.lib
vtkIOCore-8.2-gd.lib
vtkIOEnSight-8.2-gd.lib
vtkIOExodus-8.2-gd.lib
vtkIOExport-8.2-gd.lib
vtkIOExportOpenGL2-8.2-gd.lib
vtkIOExportPDF-8.2-gd.lib
vtkIOGeometry-8.2-gd.lib
vtkIOImage-8.2-gd.lib
vtkIOImport-8.2-gd.lib
vtkIOInfovis-8.2-gd.lib
vtkIOLegacy-8.2-gd.lib
vtkIOLSDyna-8.2-gd.lib
vtkIOMINC-8.2-gd.lib
vtkIOMovie-8.2-gd.lib
vtkIONetCDF-8.2-gd.lib
vtkIOParallel-8.2-gd.lib
vtkIOParallelXML-8.2-gd.lib
vtkIOPLY-8.2-gd.lib
vtkIOSegY-8.2-gd.lib
vtkIOSQL-8.2-gd.lib
vtkIOTecplotTable-8.2-gd.lib
vtkIOVeraOut-8.2-gd.lib
vtkIOVideo-8.2-gd.lib
vtkIOXML-8.2-gd.lib
vtkIOXMLParser-8.2-gd.lib
vtkjpeg-8.2-gd.lib
vtkjsoncpp-8.2-gd.lib
vtklibharu-8.2-gd.lib
vtklibxml2-8.2-gd.lib
vtklz4-8.2-gd.lib
vtklzma-8.2-gd.lib
vtkmetaio-8.2-gd.lib
vtkNetCDF-8.2-gd.lib
vtkogg-8.2-gd.lib
vtkParallelCore-8.2-gd.lib
vtkpng-8.2-gd.lib
vtkproj-8.2-gd.lib
vtkpugixml-8.2-gd.lib
vtkRenderingAnnotation-8.2-gd.lib
vtkRenderingContext2D-8.2-gd.lib
vtkRenderingContextOpenGL2-8.2-gd.lib
vtkRenderingCore-8.2-gd.lib
vtkRenderingExternal-8.2-gd.lib
vtkRenderingFreeType-8.2-gd.lib
vtkRenderingGL2PSOpenGL2-8.2-gd.lib
vtkRenderingImage-8.2-gd.lib
vtkRenderingLabel-8.2-gd.lib
vtkRenderingLOD-8.2-gd.lib
vtkRenderingOpenGL2-8.2-gd.lib
vtkRenderingVolume-8.2-gd.lib
vtkRenderingVolumeOpenGL2-8.2-gd.lib
vtksqlite-8.2-gd.lib
vtksys-8.2-gd.lib
vtktheora-8.2-gd.lib
vtktiff-8.2-gd.lib
vtkverdict-8.2-gd.lib
vtkViewsContext2D-8.2-gd.lib
vtkViewsCore-8.2-gd.lib
vtkViewsInfovis-8.2-gd.lib
vtkzlib-8.2-gd.lib

添加环境变量

然后把PCL和第三方库的的DLL文件添加到环境变量里面。(一般在bin下面),将下面的三个路径添加到系统环境变量里面。

PCL 1.11.0\bin
PCL 1.11.0\3rdParty\VTK\bin
PCL 1.11.0\3rdParty\OpenNI2\Redist

扩展:

**静态库:**函数和数据被编译进一个二进制文件,通常扩展名为.lib,在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件。

**动态库:**往往提供2个文件,一个是引入库和一个DLL,引入库包含被DLL导出的函数和变量的符号名,DLL包含实际的函数和数据。在编译链接可执行文件时,只需要链接引入库,DLL中的函数代码和数据并不复制到可执行文件中,在运行的时候,再去加载DLL,访问DLL中导出的函数。

**使用DLL的好处:**1.可以采用多种编程语言来编写;2.增强产品的功能;3.提供二次开发的平台;4.简化项目管理,同时进行开发;5.可以节省磁盘空间和内存,多个程序使用同一种资源;6.有助于资源的共享;7.有助于实现应用程序的本地化。

C/C++—>预处理器—>预处理器定义

添加如下:

BOOST_USE_WINDOWS_H
NOMINMAX
_CRT_SECURE_NO_DEPRECATE

属性->C/C++ ->所有选项->SDL检查 改为

项目->属性->C/C++ ->所有选项->SDL检查

测试

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
int  main (int argc, char** argv)
{ 
    pcl::PointCloud<pcl::PointXYZ> cloud;   // Fill in the cloud data  
    cloud.width    = 5;  
    cloud.height   = 1;  
    cloud.is_dense = false;  
    cloud.points.resize (cloud.width * cloud.height);  
    for (std::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::io::savePCDFileASCII ("test_pcd.pcd", cloud);  
        std::cerr << "Saved " << cloud.points.size () << " data points to test_pcd.pcd." << std::endl;  
        for (std::size_t i = 0; i < cloud.points.size (); ++i)    
             std::cerr << "    " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;  
        return (0);
}

结果:

参考:https://blog.csdn.net/weixin_42059276/article/details/106149359

问题及解决方法

  • Visual Studio C++报错: 无法将参数 1 从“const char [5]”转换为“char *”
    将项目属性 >> 语言 >> 符合模式调成否:
    在这里插入图片描述
  • E2512 功能测试宏的参数必须是简单标识符
    在这里插入图片描述

选择“仅生成”,然后清理,重新生成即可。

“生成+IntelliSense”是说:Visual Studio的IntelliSense功能类似其他IDE中的auto-completion,也就是能够自动补全。对于我来说只要调试就可以,所以关闭,就解决了。

  • error C4996解决方法
  1. 加入 #define _CRT_SECURE_NO_WARNINGS

  2. 加入 #pragma warning (disable: 4996)

  3. (你的项目)–>右键 --> 属性, 进去以后,在C++ --> 高级 --> 禁用特定警告 中添加:4996

  4. (你的项目)–>右键 --> 属性, 进去以后,在C++ --> 预处理器 --> 预处理器定义 中添加:_CRT_SECURE_NO_WARNINGS

  5. 如果使用“win32应用程序向导”创建项目时,可以将“安全开发生命周期(SDL)检查”的选项去掉

参考:https://www.pianshen.com/article/8983380449/

猜你喜欢

转载自blog.csdn.net/weixin_44456692/article/details/113508167