感谢PCL-1.8.0-AllInOne VS2013 Win8 X64 安装配置及部分问题解决方法的文章,本文在其基础上稍作调整,希望可以帮到PCL用户和爱好者!(经过测试,新版的PCL缺少一些类,如:sensor_msgs,导致PointCloud2不能用。另外,本文适用于win10和win7,我在这两个系统上都安装好了。
Win7/win10 x64
Visual Studio 2013 (注意:VS2013安装包不区分64位和32位,所用位数都是在平台下自己设置)
我的百度网盘安装包:
PCL-1.8.0-msvc2013-64/32位链接:链接:https://pan.baidu.com/s/1ElnlIyEUaCAkFhf4gboxiQ 提取码:q1fd
VS2013链接:https://pan.baidu.com/s/1Ewaa2nuTYXNyW0XPMkQihQ 密码:hvas
一.准备工作
首先需要下载PCL-1.8.0-AllInOne安装包文件和相应的pdb文件。
属性表可以不用下载,路径不同的情况下不能直接用,建议跟着教程自己新建属性表
二.安装
1.PCL库安装
双击安装包,安装的时候注意选上“Add PCL to the system PATH for allusers”,这样安装程序会自动在系统环境变量中添加“PCL_ROOT”、“OPENNI2_INCLUDE64”、“OPENNI2_LIB64”、“OPENNI2_REDIST64”四个项。
(注意:若安装结束后提示“路径过长无法添加环境变量”,这并不影响;如果安装结束后没有自动在系统环境变量中增加以上四项,则手动加上即可。添加路径过长可参看解决Windows7 Path环境变量过长的方法和环境变量path的值大于1023的解决办法)
RUDY选择了安装在C盘默认路径:C:\Program Files\PCL 1.8.0。
图示皆以我的安装路径为例。(下图为自动添加的环境变量,可检查一下,也可以暂时不管,因为一般都是自动添加,RUDY都没有去注意这个)
2.OpenNI安装
安装过程中会弹出OpenNI的安装程序,可以选择将OpenNI的安装路径设置为“PCL_ROOT”下3rdParty\OpenNI2文件夹(但是rudy是安装在默认路径“C:\Program Files\OpenNI2”了,如果安装路径不同,那么不能应用同一个“项目属性表“PCLDebug64.props,必须新建),(这里可以选择安装在其他目录,但是需要重新建立第四章第二节的属性表。)
3.pdb安装
安装程序执行完成后将pdb文件包解压(即PCL-1.8.0-AllInOne-msvc2013-win64-pdb.rar),pdb文件拷贝到“PCL_ROOT”下的bin文件夹中(即“C:\Program Files\PCL 1.8.0\bin”文件下),一般还需要将PDB复制到“C:\Windows\System32”目录下。
三.环境变量
上面说过了安装程序会自动添加“PCL_ROOT”项到系统环境变量(不是用户变量)Path中,此外还要手动添加PCL、Qhull、FLANN、VTK、OpenNI2的bin目录以及%OPENNI2_REDIST64%到PATH(右击“我的电脑[此电脑]”,然后如下图,win7的对话框与win10略有不同,是在同一行添加,用分号“;”隔开即可)中。
WIN7的如图:
Win10的如图:
rudy的电脑中路径是(win7用“;”隔开,win10不用隔开,每行一条):
C:\ProgramFiles\PCL1.8.0\bin;
C:\ProgramFiles\PCL 1.8.0\3rdParty\Qhull\bin;
C:\ProgramFiles\PCL1.8.0\3rdParty\FLANN\bin;
C:\ProgramFiles\PCL1.8.0\3rdParty\VTK\bin;
C:\Program Files\OpenNI2\Tools;
(C:\Program Files\OpenNI2\Redist,可以不添加,因为“OPENNI2_REDIST64”自动添加了)
该篇博文原作者是用下图方式添加的环境变量,作用与rudy添加的方式没有区别:
注意:如果按照原作者的方式添加,而且安装程序没有自动添加“PCL_ROOT”,则需要手动填上,因为上图是将C:\Program Files\PCL 1.8.0简化成了PCL_ROOT。。。而且因为如果结合CMake等工具生成工程的话,PCLConfig.cmake文件是通过“PCL_ROOT”来找PCL库的。添加完毕后不要忘记了重启或者注销电脑。
四.项目配置
1.在VS2013中新建空项目并进行活动平台修改
注意VS2013中配置管理器(Configuration Manager)默认的活动平台(Active Solution plantform)是win32,如果安装的是x64的PCL,需要将其改成x64,否则编译的时候会出现奇怪的问题。修改方法如下:(注意,这是本文重点)
打开“解决方案资源管理器”,右击刚才新建的项目(例如“ConsoleApplication1”),点击“属性”,进入程序属性页 -> 点击“配置管理器” -> 下拉“平台”按钮,点击“新建” -> 新建平台“x64”,选择从“win32”复制(之后就不用每次配置“环境目录”了,而且,生成的.exe也可以直接在dos命令下运行了),创建新的解决方案平台打钩 -> 完成。
原博客错:“从此处复制设置”选“空”,切记,不可选择“空”,一定要选择从“win32”复制。
2.新项目属性表的建立与设置(也可以通过添加现有的属性表,就不用下面这些设置了,但是安装路径需要与现有属性表生成时的路径一致(主要是OpenNI2的安装路径不要不一致))
切换到“属性管理器”视图,解决方案资源管理器(Property Manager)与属性管理器(Solution Explorer)在同一个tab布局中,如果没找到的话,按如下方式打开:
菜单栏的“视图”(View) -> 其他窗口(Other Windows) -> 属性管理器(Property Manager)。
在项目PCLTest的“Debug | 64”下右键添加新项目属性表,取名PCLDebug64.props。双击该项目属性表,打开其属性页并进行以下四项操作。
(1)修改左侧“VC++目录”下的“包含目录”。
添加设置如下:
(2)修改左侧“VC++目录”下的“库目录”。
添加设置如下:
(3)点击左侧“连接器” -> 点击“输入” -> 添加相关的“附加依赖项”。
添加配置如下:
pcl_apps_debug.lib
pcl_common_debug.lib
pcl_features_debug.lib
pcl_filters_debug.lib
pcl_io_ply_debug.lib
pcl_io_debug.lib
pcl_kdtree_debug.lib
pcl_keypoints_debug.lib
pcl_ml_debug.lib
pcl_octree_debug.lib
pcl_outofcore_debug.lib
pcl_people_debug.lib
pcl_recognition_debug.lib
pcl_registration_debug.lib
pcl_sample_consensus_debug.lib
pcl_search_debug.lib
pcl_segmentation_debug.lib
pcl_simulation_debug.lib
pcl_stereo_debug.lib
pcl_surface_debug.lib
pcl_tracking_debug.lib
pcl_visualization_debug.lib
libboost_atomic-vc120-mt-gd-1_59.lib
libboost_chrono-vc120-mt-gd-1_59.lib
libboost_container-vc120-mt-gd-1_59.lib
libboost_context-vc120-mt-gd-1_59.lib
libboost_coroutine-vc120-mt-gd-1_59.lib
libboost_date_time-vc120-mt-gd-1_59.lib
libboost_exception-vc120-mt-gd-1_59.lib
libboost_filesystem-vc120-mt-gd-1_59.lib
libboost_graph-vc120-mt-gd-1_59.lib
libboost_iostreams-vc120-mt-gd-1_59.lib
libboost_locale-vc120-mt-gd-1_59.lib
libboost_log-vc120-mt-gd-1_59.lib
libboost_log_setup-vc120-mt-gd-1_59.lib
libboost_math_c99-vc120-mt-gd-1_59.lib
libboost_math_c99f-vc120-mt-gd-1_59.lib
libboost_math_c99l-vc120-mt-gd-1_59.lib
libboost_math_tr1-vc120-mt-gd-1_59.lib
libboost_math_tr1f-vc120-mt-gd-1_59.lib
libboost_math_tr1l-vc120-mt-gd-1_59.lib
libboost_mpi-vc120-mt-gd-1_59.lib
libboost_prg_exec_monitor-vc120-mt-gd-1_59.lib
libboost_program_options-vc120-mt-gd-1_59.lib
libboost_random-vc120-mt-gd-1_59.lib
libboost_regex-vc120-mt-gd-1_59.lib
libboost_serialization-vc120-mt-gd-1_59.lib
libboost_signals-vc120-mt-gd-1_59.lib
libboost_system-vc120-mt-gd-1_59.lib
libboost_test_exec_monitor-vc120-mt-gd-1_59.lib
libboost_thread-vc120-mt-gd-1_59.lib
libboost_timer-vc120-mt-gd-1_59.lib
libboost_unit_test_framework-vc120-mt-gd-1_59.lib
libboost_wave-vc120-mt-gd-1_59.lib
libboost_wserialization-vc120-mt-gd-1_59.lib
flann-gd.lib
flann_cpp_s-gd.lib
flann_s-gd.lib
qhull-gd.lib
qhullcpp-gd.lib
qhullstatic-gd.lib
qhullstatic_r-gd.lib
qhull_p-gd.lib
qhull_r-gd.lib
vtkalglib-7.0-gd.lib
vtkChartsCore-7.0-gd.lib
vtkCommonColor-7.0-gd.lib
vtkCommonComputationalGeometry-7.0-gd.lib
vtkCommonCore-7.0-gd.lib
vtkCommonDataModel-7.0-gd.lib
vtkCommonExecutionModel-7.0-gd.lib
vtkCommonMath-7.0-gd.lib
vtkCommonMisc-7.0-gd.lib
vtkCommonSystem-7.0-gd.lib
vtkCommonTransforms-7.0-gd.lib
vtkDICOMParser-7.0-gd.lib
vtkDomainsChemistry-7.0-gd.lib
vtkDomainsChemistryOpenGL2-7.0-gd.lib
vtkexoIIc-7.0-gd.lib
vtkexpat-7.0-gd.lib
vtkFiltersAMR-7.0-gd.lib
vtkFiltersCore-7.0-gd.lib
vtkFiltersExtraction-7.0-gd.lib
vtkFiltersFlowPaths-7.0-gd.lib
vtkFiltersGeneral-7.0-gd.lib
vtkFiltersGeneric-7.0-gd.lib
vtkFiltersGeometry-7.0-gd.lib
vtkFiltersHybrid-7.0-gd.lib
vtkFiltersHyperTree-7.0-gd.lib
vtkFiltersImaging-7.0-gd.lib
vtkFiltersModeling-7.0-gd.lib
vtkFiltersParallel-7.0-gd.lib
vtkFiltersParallelImaging-7.0-gd.lib
vtkFiltersProgrammable-7.0-gd.lib
vtkFiltersSelection-7.0-gd.lib
vtkFiltersSMP-7.0-gd.lib
vtkFiltersSources-7.0-gd.lib
vtkFiltersStatistics-7.0-gd.lib
vtkFiltersTexture-7.0-gd.lib
vtkFiltersVerdict-7.0-gd.lib
vtkfreetype-7.0-gd.lib
vtkGeovisCore-7.0-gd.lib
vtkglew-7.0-gd.lib
vtkGUISupportQt-7.0-gd.lib
vtkGUISupportQtSQL-7.0-gd.lib
vtkhdf5-7.0-gd.lib
vtkhdf5_hl-7.0-gd.lib
vtkImagingColor-7.0-gd.lib
vtkImagingCore-7.0-gd.lib
vtkImagingFourier-7.0-gd.lib
vtkImagingGeneral-7.0-gd.lib
vtkImagingHybrid-7.0-gd.lib
vtkImagingMath-7.0-gd.lib
vtkImagingMorphological-7.0-gd.lib
vtkImagingSources-7.0-gd.lib
vtkImagingStatistics-7.0-gd.lib
vtkImagingStencil-7.0-gd.lib
vtkInfovisCore-7.0-gd.lib
vtkInfovisLayout-7.0-gd.lib
vtkInteractionImage-7.0-gd.lib
vtkInteractionStyle-7.0-gd.lib
vtkInteractionWidgets-7.0-gd.lib
vtkIOAMR-7.0-gd.lib
vtkIOCore-7.0-gd.lib
vtkIOEnSight-7.0-gd.lib
vtkIOExodus-7.0-gd.lib
vtkIOExport-7.0-gd.lib
vtkIOGeometry-7.0-gd.lib
vtkIOImage-7.0-gd.lib
vtkIOImport-7.0-gd.lib
vtkIOInfovis-7.0-gd.lib
vtkIOLegacy-7.0-gd.lib
vtkIOLSDyna-7.0-gd.lib
vtkIOMINC-7.0-gd.lib
vtkIOMovie-7.0-gd.lib
vtkIONetCDF-7.0-gd.lib
vtkIOParallel-7.0-gd.lib
vtkIOParallelXML-7.0-gd.lib
vtkIOPLY-7.0-gd.lib
vtkIOSQL-7.0-gd.lib
vtkIOVideo-7.0-gd.lib
vtkIOXML-7.0-gd.lib
vtkIOXMLParser-7.0-gd.lib
vtkjpeg-7.0-gd.lib
vtkjsoncpp-7.0-gd.lib
vtklibxml2-7.0-gd.lib
vtkmetaio-7.0-gd.lib
vtkNetCDF-7.0-gd.lib
vtkNetCDF_cxx-7.0-gd.lib
vtkoggtheora-7.0-gd.lib
vtkParallelCore-7.0-gd.lib
vtkpng-7.0-gd.lib
vtkproj4-7.0-gd.lib
vtkRenderingAnnotation-7.0-gd.lib
vtkRenderingContext2D-7.0-gd.lib
vtkRenderingContextOpenGL2-7.0-gd.lib
vtkRenderingCore-7.0-gd.lib
vtkRenderingFreeType-7.0-gd.lib
vtkRenderingImage-7.0-gd.lib
vtkRenderingLabel-7.0-gd.lib
vtkRenderingLOD-7.0-gd.lib
vtkRenderingOpenGL2-7.0-gd.lib
vtkRenderingQt-7.0-gd.lib
vtkRenderingVolume-7.0-gd.lib
vtkRenderingVolumeOpenGL2-7.0-gd.lib
vtksqlite-7.0-gd.lib
vtksys-7.0-gd.lib
vtktiff-7.0-gd.lib
vtkverdict-7.0-gd.lib
vtkViewsContext2D-7.0-gd.lib
vtkViewsCore-7.0-gd.lib
vtkViewsInfovis-7.0-gd.lib
vtkViewsQt-7.0-gd.lib
vtkzlib-7.0-gd.lib
(4)点击左侧“C/C++” -> 点击“预处理器” -> 添加相关的“预处理器定义”。
添加设置为:(个人以为可以不用设置,但我第一次新建属性表的时候设置了也就没改)
_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS
_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS
对该新建立的“项目属性表”进行以上四步操作后,可以把这个属性文件保存出来,每次用的时候在新建项目里导入就可以了。
五、测试代码
我用的是PCL1.7.2以后的新版本中才有的regiongrowing函数,为了方便大家运行,我打包上传了,大家可以直接点击.sln打开工程运行。详见:https://download.youkuaiyun.com/download/liukunrs/10463584
也可以使用下列代码:
#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
int user_data;
void viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
viewer.setBackgroundColor(1.0, 0.5, 1.0);
pcl::PointXYZ o;
o.x = 1.0;
o.y = 0;
o.z = 0;
viewer.addSphere(o, 0.25, "sphere", 0);
std::cout << "i only run once" << std::endl;
}
void viewerPsycho(pcl::visualization::PCLVisualizer& viewer)
{
static unsigned count = 0;
std::stringstream ss;
ss << "Once per viewer loop: " << count++;
viewer.removeShape("text", 0);
viewer.addText(ss.str(), 200, 300, "text", 0);
//FIXME: possible race condition here:
user_data++;
}
int main()
{
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);
pcl::io::loadPCDFile("my_point_cloud.pcd", *cloud);
pcl::visualization::CloudViewer viewer("Cloud Viewer");
//blocks until the cloud is actually rendered
viewer.showCloud(cloud);
//use the following functions to get access to the underlying more advanced/powerful
//PCLVisualizer
//This will only get called once
viewer.runOnVisualizationThreadOnce(viewerOneOff);
//This will get called once per visualization iteration
viewer.runOnVisualizationThread(viewerPsycho);
while (!viewer.wasStopped())
{
//you can also do cool processing here
//FIXME: Note that this is running in a separate thread from viewerPsycho
//and you should guard against race conditions yourself...
user_data++;
}
return 0;
}
如果出现如下图所示则说明没有问题,配置成功:
如果出现下图状态(博主就是),上下划几下鼠标,再滚几下滚轮,就好了。
如果出现“vtkRenderingOpenGL2-7.0-gd.pdb”等VTK相关问题,那么参见本文第九节。
六、环境变量path的值大于1023的解决办法
1.计算机—>属性—>更改设置—>高级—>环境变量
2.然后编辑Path,全选将其中的路径全部复制出来。新建一个系统变量取名path2,将复制的内容放入其中。
3.然后再Path中建立一个引用。也就是引用path1的路径。
方法:在path中开头或者结尾中放入%path1% 注意前后加;就行
例如:把”%PCL_ROOT%\bin;%PCL_ROOT%\3rdParty\Qhull\bin;%PCL_ROOT%\3rdParty\FLANN\bin;%PCL_ROOT%\3rdParty\VTK\bin;%PCL_ROOT%\3rdParty\OpenNI2\Tools;%OPENNI2_REDIST64%”剪切出来,放到新建的Path1中,而原Path中在最后加上“%Path1%”
七、遇到的问题:
1、如果头文件中包含了
#include <pcl/sample_consensus/model_types.h>
那么会出现pcl::SAC_SAMPLE_SIZE的报错,可查看我优快云博客解决:https://blog.youkuaiyun.com/liukunrs/article/details/80361134
八、环境变量path的值大于1023的解决办法
1.计算机—>属性—>更改设置—>高级—>环境变量
2.然后编辑Path,全选将其中的路径全部复制出来。新建一个系统变量取名path2,将复制的内容放入其中。
3.然后再Path中建立一个引用。也就是引用path1的路径。
方法:在path中开头或者结尾中放入%path1% 注意前后加“;”就行
例如:把”%PCL_ROOT%\bin;%PCL_ROOT%\3rdParty\Qhull\bin;%PCL_ROOT%\3rdParty\FLANN\bin;%PCL_ROOT%\3rdParty\VTK\bin;%PCL_ROOT%\3rdParty\OpenNI2\Tools;%OPENNI2_REDIST64%”剪切出来,放到新建的Path1中,而原Path中在最后加上“%Path1%”
九、出现“vtkRenderingOpenGL2-7.0-gd.pdb”等VTK相关问题
这是由于VTK只支持英伟达的显卡(与CloudCompare不能正常打开的问题很类似)。
1.如果出现这种问题,首先确保你有独立显卡(英伟达的)。
2.找开显卡设置面板,将全局设置那一栏下的首先图形处理器设为高性能NVDIA处理器。
十、C:\Windows\System32无法打开PDB
所以还需要将复制到PDB文件复制一份到该目录下
已加载“C:\Windows\System32\apphelp.dll”。无法查找或打开 PDB 文件。