因为自己最近要用到Qt和PCL,所以就在网上搜集了一下资料,经过一天的折腾,总算是将PCL装上并且在Qt上配置成功。过程总的来说还是有些艰难的,毕竟我之前没用过Qt,不了解Qt的机制,只能靠自己看一些书和网上的教程才得以没走太多的弯路。不过这中间也是碰到了一些问题,正好在这记录一下。
我们所需要的软件主要有一下几个:
1、 VS2015:这就不用怎么介绍了,使用很广泛的一个软件,到网上搜一搜就有一大堆安装教程。
2、 Qt5.9.4:Qt虽然说没有VS那么普遍,但是其功能的强大是毋庸置疑的,我用的版本是5.9.4,我也推荐对于要学习Qt的同学尽量安装Qt的5.9系列,因为Qt5.9版本是一个长期支持的版本(long term supported,LTS),在未来的一段时间内会持续更新。当然了,最新版本的Qt肯定也是不错的选择,这就要看个人的需求了。
下载地址:http://download.qt.io/archive/qt/
3、 PCL1.8.1:一个处理点云的第三方库,其拥有这强大的三维显示功能,我也是刚接触只知道这么多了。
下载地址:https://github.com/PointCloudLibrary/pcl/releases/tag/pcl-1.8.1
4、 cmake:是一种跨平台的编译工具,它可以应用于Windows、Linux等系统,也是刚接触也就知道这么多了哈哈。下载地址:https://cmake.org/download/
5、VTK8.0.0:VTK是一个开源的软件系统,它在图像处理、三维可视化等方面有这很广泛的应用。
下载地址:https://gitlab.kitware.com/vtk/vtk/tree/v8.0.0
至此我们所需要的所有软件都已经罗列完毕,在这要特意说明一下,因为我的系统是64位Windows10系统,所以上述的软件都是64位Windows软件。话不多说,接下来就开始安装软件。
VS和QT的安装教程网上有很多,随便找一个把软件装上就可以了。安装pcl1.8.1的安装过程一定要注意下面几点:
1、安装过程中不要忘记将PCL的安装目录添加到系统变量中去。
2、安装的路径中尽量不要有空格,据说这是因为Qt会把空格两边的字符串分开看成两个字符串,这就会使得之后为Qt添加PCL的头文件是造成麻烦。
如果你已经安装好了,那只要把安装路径中的PCL 1.8.1中间的空格删掉就行了。
我当时虽然按照网上的说明删掉了pcl 1.8.1中的空格,但是没想到Pragram Files中间也有空格,害得我只能在重新找了一个路径重装了一下软件,这浪费了我几个小时的时间啊,坑人。
3、安装过程中会出现让我们安装OpenNI2的界面,尽量把其安装路径放到…\PCL1.8.1\3rdParty\OpenNI2中,方便之后的使用和管理。
4、安装完成之后,手动添加系统变量
接下来终于到了我们的重头戏了,就是把pcl中的头文件和库文件添加到Qt的项目中去,步骤如下:
1、新建一个Qt控制台程序,如下所示:
2、为了考虑到我日后使用PCL的方便,所以我就按照网上的教程建立个.pri文件,这个文件有点像VS中的.props文件(属性表文件),如下所示:
(1)新建一个.txt文件,取名pcl,将.txt后缀改为.pri。
(2)用记事本打开pcl.prj文件,向其中添加pcl的头文件和库文件路径,如下所示:
添加路径如下:
INCLUDEPATH += C:\PCL\PCL1.8.1\include\pcl-1.8
INCLUDEPATH += C:\PCL\PCL1.8.1\include\pcl-1.8\pcl
INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\Boost\include\boost-1_64
INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\Boost\include\boost-1_64\boost
INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\Eigen\eigen3
INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\FLANN\include
INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\FLANN\include\flann
INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\OpenNI2\Include
INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\Qhull\include
INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\VTK\include\vtk-8.0
CONFIG(debug,debug|release){
LIBS += -LC:\PCL\PCL1.8.1\lib\
-lpcl_common_debug\
-lpcl_features_debug\
-lpcl_filters_debug\
-lpcl_io_debug\
-lpcl_io_ply_debug\
-lpcl_kdtree_debug\
-lpcl_keypoints_debug\
-lpcl_ml_debug\
-lpcl_octree_debug\
-lpcl_outofcore_debug\
-lpcl_people_debug\
-lpcl_recognition_debug\
-lpcl_registration_debug\
-lpcl_sample_consensus_debug\
-lpcl_search_debug\
-lpcl_segmentation_debug\
-lpcl_stereo_debug\
-lpcl_surface_debug\
-lpcl_tracking_debug\
-lpcl_visualization_debug
LIBS += -LC:\PCL\PCL1.8.1\3rdParty\Boost\lib\
-llibboost_atomic-vc140-mt-gd-1_64\
-llibboost_bzip2-vc140-mt-gd-1_64\
-llibboost_chrono-vc140-mt-gd-1_64\
-llibboost_container-vc140-mt-gd-1_64\
-llibboost_context-vc140-mt-gd-1_64\
-llibboost_coroutine-vc140-mt-gd-1_64\
-llibboost_date_time-vc140-mt-gd-1_64\
-llibboost_exception-vc140-mt-gd-1_64\
-llibboost_fiber-vc140-mt-gd-1_64\
-llibboost_filesystem-vc140-mt-gd-1_64\
-llibboost_graph-vc140-mt-gd-1_64\
-llibboost_graph_parallel-vc140-mt-gd-1_64\
-llibboost_iostreams-vc140-mt-gd-1_64\
-llibboost_locale-vc140-mt-gd-1_64\
-llibboost_log-vc140-mt-gd-1_64\
-llibboost_log_setup-vc140-mt-gd-1_64\
-llibboost_math_c99-vc140-mt-gd-1_64\
-llibboost_math_c99f-vc140-mt-gd-1_64\
-llibboost_math_c99l-vc140-mt-gd-1_64\
-llibboost_math_tr1-vc140-mt-gd-1_64\
-llibboost_math_tr1f-vc140-mt-gd-1_64\
-llibboost_math_tr1l-vc140-mt-gd-1_64\
-llibboost_mpi-vc140-mt-gd-1_64\
-llibboost_numpy-vc140-mt-gd-1_64\
-llibboost_numpy3-vc140-mt-gd-1_64\
-llibboost_prg_exec_monitor-vc140-mt-gd-1_64\
-llibboost_program_options-vc140-mt-gd-1_64\
-llibboost_python-vc140-mt-gd-1_64\
-llibboost_python3-vc140-mt-gd-1_64\
-llibboost_random-vc140-mt-gd-1_64\
-llibboost_regex-vc140-mt-gd-1_64\
-llibboost_serialization-vc140-mt-gd-1_64\
-llibboost_signals-vc140-mt-gd-1_64\
-llibboost_system-vc140-mt-gd-1_64\
-llibboost_test_exec_monitor-vc140-mt-gd-1_64\
-llibboost_thread-vc140-mt-gd-1_64\
-llibboost_timer-vc140-mt-gd-1_64\
-llibboost_type_erasure-vc140-mt-gd-1_64\
-llibboost_unit_test_framework-vc140-mt-gd-1_64\
-llibboost_wave-vc140-mt-gd-1_64\
-llibboost_wserialization-vc140-mt-gd-1_64\
-llibboost_zlib-vc140-mt-gd-1_64
LIBS += -LC:\PCL\PCL1.8.1\3rdParty\FLANN\lib\
-lflann-gd\
-lflann_cpp-gd\
-lflann_cpp_s-gd\
-lflann_s-gd
LIBS += -LC:\PCL\PCL1.8.1\3rdParty\OpenNI2\Lib\
-lOpenNI2
LIBS += -LC:\PCL\PCL1.8.1\3rdParty\Qhull\lib\
-lqhull_d\
-lqhullcpp_d\
-lqhullstatic_d\
-lqhullstatic_r_d\
-lqhull_p_d\
-lqhull_r_d
LIBS += -LC:\Qt\Qt5.9.4\5.9.4\msvc2015_64\lib\
-lQt5OpenGL
LIBS += -LC:\PCL\PCL1.8.1\3rdParty\VTK\lib\
-lvtkalglib-8.0-gd\
-lvtkChartsCore-8.0-gd\
-lvtkCommonColor-8.0-gd\
-lvtkCommonComputationalGeometry-8.0-gd\
-lvtkCommonCore-8.0-gd\
-lvtkCommonDataModel-8.0-gd\
-lvtkCommonExecutionModel-8.0-gd\
-lvtkCommonMath-8.0-gd\
-lvtkCommonMisc-8.0-gd\
-lvtkCommonSystem-8.0-gd\
-lvtkCommonTransforms-8.0-gd\
-lvtkDICOMParser-8.0-gd\
-lvtkDomainsChemistry-8.0-gd\
-lvtkexoIIc-8.0-gd\
-lvtkexpat-8.0-gd\
-lvtkFiltersAMR-8.0-gd\
-lvtkFiltersCore-8.0-gd\
-lvtkFiltersExtraction-8.0-gd\
-lvtkFiltersFlowPaths-8.0-gd\
-lvtkFiltersGeneral-8.0-gd\
-lvtkFiltersGeneric-8.0-gd\
-lvtkFiltersGeometry-8.0-gd\
-lvtkFiltersHybrid-8.0-gd\
-lvtkFiltersHyperTree-8.0-gd\
-lvtkFiltersImaging-8.0-gd\
-lvtkFiltersModeling-8.0-gd\
-lvtkFiltersParallel-8.0-gd\
-lvtkFiltersParallelImaging-8.0-gd\
-lvtkFiltersPoints-8.0-gd\
-lvtkFiltersProgrammable-8.0-gd\
-lvtkFiltersSelection-8.0-gd\
-lvtkFiltersSMP-8.0-gd\
-lvtkFiltersSources-8.0-gd\
-lvtkFiltersStatistics-8.0-gd\
-lvtkFiltersTexture-8.0-gd\
-lvtkFiltersTopology-8.0-gd\
-lvtkFiltersVerdict-8.0-gd\
-lvtkfreetype-8.0-gd\
-lvtkGeovisCore-8.0-gd\
-lvtkgl2ps-8.0-gd\
-lvtkGUISupportQt-8.0-gd\
-lvtkGUISupportQtOpenGL-8.0-gd\
-lvtkGUISupportQtSQL-8.0-gd\
-lvtkhdf5-8.0-gd\
-lvtkhdf5_hl-8.0-gd\
-lvtkImagingColor-8.0-gd\
-lvtkImagingCore-8.0-gd\
-lvtkImagingFourier-8.0-gd\
-lvtkImagingGeneral-8.0-gd\
-lvtkImagingHybrid-8.0-gd\
-lvtkImagingMath-8.0-gd\
-lvtkImagingMorphological-8.0-gd\
-lvtkImagingSources-8.0-gd\
-lvtkImagingStatistics-8.0-gd\
-lvtkImagingStencil-8.0-gd\
-lvtkInfovisCore-8.0-gd\
-lvtkInfovisLayout-8.0-gd\
-lvtkInteractionImage-8.0-gd\
-lvtkInteractionStyle-8.0-gd\
-lvtkInteractionWidgets-8.0-gd\
-lvtkIOAMR-8.0-gd\
-lvtkIOCore-8.0-gd\
-lvtkIOEnSight-8.0-gd\
-lvtkIOExodus-8.0-gd\
-lvtkIOExport-8.0-gd\
-lvtkIOExportOpenGL-8.0-gd\
-lvtkIOGeometry-8.0-gd\
-lvtkIOImage-8.0-gd\
-lvtkIOImport-8.0-gd\
-lvtkIOInfovis-8.0-gd\
-lvtkIOLegacy-8.0-gd\
-lvtkIOLSDyna-8.0-gd\
-lvtkIOMINC-8.0-gd\
-lvtkIOMovie-8.0-gd\
-lvtkIONetCDF-8.0-gd\
-lvtkIOParallel-8.0-gd\
-lvtkIOParallelXML-8.0-gd\
-lvtkIOPLY-8.0-gd\
-lvtkIOSQL-8.0-gd\
-lvtkIOTecplotTable-8.0-gd\
-lvtkIOVideo-8.0-gd\
-lvtkIOXML-8.0-gd\
-lvtkIOXMLParser-8.0-gd\
-lvtkjpeg-8.0-gd\
-lvtkjsoncpp-8.0-gd\
-lvtklibharu-8.0-gd\
-lvtklibxml2-8.0-gd\
-lvtklz4-8.0-gd\
-lvtkmetaio-8.0-gd\
-lvtkNetCDF-8.0-gd\
-lvtknetcdf_c++-gd\
-lvtkoggtheora-8.0-gd\
-lvtkParallelCore-8.0-gd\
-lvtkpng-8.0-gd\
-lvtkproj4-8.0-gd\
-lvtkRenderingAnnotation-8.0-gd\
-lvtkRenderingContext2D-8.0-gd\
-lvtkRenderingContextOpenGL-8.0-gd\
-lvtkRenderingCore-8.0-gd\
-lvtkRenderingFreeType-8.0-gd\
-lvtkRenderingGL2PS-8.0-gd\
-lvtkRenderingImage-8.0-gd\
-lvtkRenderingLabel-8.0-gd\
-lvtkRenderingLIC-8.0-gd\
-lvtkRenderingLOD-8.0-gd\
-lvtkRenderingOpenGL-8.0-gd\
# -lvtkRenderingQt-8.0-gd\
-lvtkRenderingVolume-8.0-gd\
-lvtkRenderingVolumeOpenGL-8.0-gd\
-lvtksqlite-8.0-gd\
-lvtksys-8.0-gd\
-lvtktiff-8.0-gd\
-lvtkverdict-8.0-gd\
-lvtkViewsContext2D-8.0-gd\
-lvtkViewsCore-8.0-gd\
-lvtkViewsInfovis-8.0-gd\
# -lvtkViewsQt-8.0-gd\
-lvtkzlib-8.0-gd
} else {
LIBS += -LC:\PCL\PCL1.8.1\lib\
-lpcl_common_release\
-lpcl_features_release\
-lpcl_filters_release\
-lpcl_io_ply_release\
-lpcl_io_release\
-lpcl_kdtree_release\
-lpcl_keypoints_release\
-lpcl_ml_release\
-lpcl_octree_release\
-lpcl_outofcore_release\
-lpcl_people_release\
-lpcl_recognition_release\
-lpcl_registration_release\
-lpcl_sample_consensus_release\
-lpcl_search_release\
-lpcl_segmentation_release\
-lpcl_stereo_release\
-lpcl_surface_release\
-lpcl_tracking_release\
-lpcl_visualization_release
LIBS += -LC:\PCL\PCL1.8.1\3rdParty\Boost\lib\
-llibboost_atomic-vc140-mt-1_64\
-llibboost_bzip2-vc140-mt-1_64\
-llibboost_chrono-vc140-mt-1_64\
-llibboost_container-vc140-mt-1_64\
-llibboost_context-vc140-mt-1_64\
-llibboost_coroutine-vc140-mt-1_64\
-llibboost_date_time-vc140-mt-1_64\
-llibboost_exception-vc140-mt-1_64\
-llibboost_fiber-vc140-mt-1_64\
-llibboost_filesystem-vc140-mt-1_64\
-llibboost_graph-vc140-mt-1_64\
-llibboost_graph_parallel-vc140-mt-1_64\
-llibboost_iostreams-vc140-mt-1_64\
-llibboost_locale-vc140-mt-1_64\
-llibboost_log-vc140-mt-1_64\
-llibboost_log_setup-vc140-mt-1_64\
-llibboost_math_c99-vc140-mt-1_64\
-llibboost_math_c99f-vc140-mt-1_64\
-llibboost_math_c99l-vc140-mt-1_64\
-llibboost_math_tr1-vc140-mt-1_64\
-llibboost_math_tr1f-vc140-mt-1_64\
-llibboost_math_tr1l-vc140-mt-1_64\
-llibboost_mpi-vc140-mt-1_64\
-llibboost_numpy-vc140-mt-1_64\
-llibboost_numpy3-vc140-mt-1_64\
-llibboost_prg_exec_monitor-vc140-mt-1_64\
-llibboost_program_options-vc140-mt-1_64\
-llibboost_python-vc140-mt-1_64\
-llibboost_python3-vc140-mt-1_64\
-llibboost_random-vc140-mt-1_64\
-llibboost_regex-vc140-mt-1_64\
-llibboost_serialization-vc140-mt-1_64\
-llibboost_signals-vc140-mt-1_64\
-llibboost_system-vc140-mt-1_64\
-llibboost_test_exec_monitor-vc140-mt-1_64\
-llibboost_thread-vc140-mt-1_64\
-llibboost_timer-vc140-mt-1_64\
-llibboost_type_erasure-vc140-mt-1_64\
-llibboost_unit_test_framework-vc140-mt-1_64\
-llibboost_wave-vc140-mt-1_64\
-llibboost_wserialization-vc140-mt-1_64\
-llibboost_zlib-vc140-mt-1_64
LIBS += -LC:\PCL\PCL1.8.1\3rdParty\FLANN\lib\
-lflann\
-lflann_cpp\
-lflann_cpp_s\
-lflann_s
LIBS += -LC:\PCL\PCL1.8.1\3rdParty\OpenNI2\Lib\
-lOpenNI2
LIBS += -LC:\PCL\PCL1.8.1\3rdParty\Qhull\lib\
-lqhull\
-lqhullcpp\
-lqhullstatic\
-lqhullstatic_r\
-lqhull_p\
-lqhull_r
LIBS += -LC:\PCL\PCL1.8.1\3rdParty\VTK\lib\
-lvtkalglib-8.0\
-lvtkChartsCore-8.0\
-lvtkCommonColor-8.0\
-lvtkCommonComputationalGeometry-8.0\
-lvtkCommonCore-8.0\
-lvtkCommonDataModel-8.0\
-lvtkCommonExecutionModel-8.0\
-lvtkCommonMath-8.0\
-lvtkCommonMisc-8.0\
-lvtkCommonSystem-8.0\
-lvtkCommonTransforms-8.0\
-lvtkDICOMParser-8.0\
-lvtkDomainsChemistry-8.0\
-lvtkDomainsChemistryOpenGL2-8.0\
-lvtkexoIIc-8.0\
-lvtkexpat-8.0\
-lvtkFiltersAMR-8.0\
-lvtkFiltersCore-8.0\
-lvtkFiltersExtraction-8.0\
-lvtkFiltersFlowPaths-8.0\
-lvtkFiltersGeneral-8.0\
-lvtkFiltersGeneric-8.0\
-lvtkFiltersGeometry-8.0\
-lvtkFiltersHybrid-8.0\
-lvtkFiltersHyperTree-8.0\
-lvtkFiltersImaging-8.0\
-lvtkFiltersModeling-8.0\
-lvtkFiltersParallel-8.0\
-lvtkFiltersParallelImaging-8.0\
-lvtkFiltersProgrammable-8.0\
-lvtkFiltersSelection-8.0\
-lvtkFiltersSMP-8.0\
-lvtkFiltersSources-8.0\
-lvtkFiltersStatistics-8.0\
-lvtkFiltersTexture-8.0\
-lvtkFiltersVerdict-8.0\
-lvtkfreetype-8.0\
-lvtkGeovisCore-8.0\
-lvtkglew-8.0\
-lvtkGUISupportQt-8.0\
-lvtkGUISupportQtSQL-8.0\
-lvtkhdf5-8.0\
-lvtkhdf5_hl-8.0\
-lvtkImagingColor-8.0\
-lvtkImagingCore-8.0\
-lvtkImagingFourier-8.0\
-lvtkImagingGeneral-8.0\
-lvtkImagingHybrid-8.0\
-lvtkImagingMath-8.0\
-lvtkImagingMorphological-8.0\
-lvtkImagingSources-8.0\
-lvtkImagingStatistics-8.0\
-lvtkImagingStencil-8.0\
-lvtkInfovisCore-8.0\
-lvtkInfovisLayout-8.0\
-lvtkInteractionImage-8.0\
-lvtkInteractionStyle-8.0\
-lvtkInteractionWidgets-8.0\
-lvtkIOAMR-8.0\
-lvtkIOCore-8.0\
-lvtkIOEnSight-8.0\
-lvtkIOExodus-8.0\
-lvtkIOExport-8.0\
-lvtkIOGeometry-8.0\
-lvtkIOImage-8.0\
-lvtkIOImport-8.0\
-lvtkIOInfovis-8.0\
-lvtkIOLegacy-8.0\
-lvtkIOLSDyna-8.0\
-lvtkIOMINC-8.0\
-lvtkIOMovie-8.0\
-lvtkIONetCDF-8.0\
-lvtkIOParallel-8.0\
-lvtkIOParallelXML-8.0\
-lvtkIOPLY-8.0\
-lvtkIOSQL-8.0\
-lvtkIOVideo-8.0\
-lvtkIOXML-8.0\
-lvtkIOXMLParser-8.0\
-lvtkjpeg-8.0\
-lvtkjsoncpp-8.0\
-lvtklibxml2-8.0\
-lvtkmetaio-8.0\
-lvtkNetCDF-8.0\
# -lvtkNetCDF_c++-8.0\ #因为我的VTK库文件中不存在该文件,所以把它注释掉
-lvtkoggtheora-8.0\
-lvtkParallelCore-8.0\
-lvtkpng-8.0\
-lvtkproj4-8.0\
-lvtkRenderingAnnotation-8.0\
-lvtkRenderingContext2D-8.0\
-lvtkRenderingContextOpenGL2-8.0\
-lvtkRenderingCore-8.0\
-lvtkRenderingFreeType-8.0\
-lvtkRenderingImage-8.0\
-lvtkRenderingLabel-8.0\
-lvtkRenderingLOD-8.0\
-lvtkRenderingOpenGL2-8.0\
-lvtkRenderingQt-8.0\
-lvtkRenderingVolume-8.0\
-lvtkRenderingVolumeOpenGL2-8.0\
-lvtksqlite-8.0\
-lvtksys-8.0\
-lvtktiff-8.0\
-lvtkverdict-8.0\
-lvtkViewsContext2D-8.0\
-lvtkViewsCore-8.0\
-lvtkViewsInfovis-8.0\
-lvtkViewsQt-8.0\
-lvtkzlib-8.0
}
具体的路径要按照我们自己安装的路径来改一下就行了,现在的软件基本都有替换功能,将上述路径中的C:\PCL替换成你的安装路径就没问题了。
本着学习的态度,我又对上面的一些关键字查了一下帮助文档:
·INCLUDEPATH:当你要编译项目时,通过这个关键字你可以指定需要搜索的#include目录(头文件目录)。
可能翻译的不怎么好,我也没用机翻,将就着看吧哈哈。
·LIBS:指定要链接到项目中的库列表。如果你是用了Unix系统中的-l和-L符号,那么qmake编译工具就会在Windows系统上正确的处理这些库(即将库的绝对路径传递给链接器)。这个库必须存在,qmake编译工具才可以找到-l库所在的目录位置。
2、双击.pro文件,在文件中的末尾向其中添加PCL的头文件和库文件的路径,如下所示:
如果你的文件在项目文件夹中,则直接就可以使用include(pcl.pri)就可以了。
4、做完上述的工作之后,我们不要忘了右击项目名,点击执行qmake,如下所示:
执行之后pcl.pri文件也就自动添加到项目中去了,如下所示:
qmake编译工具类似于我们之后要用到的cmake工具,按我的理解就是我们执行qmake命令,就相当于在VC++6.0中执行“编译+链接”,只不过可能qmake工具更方便,功能更为强大,其也不是仅仅只是编译链接而已。
5、项目测试
(1)头文件测试:我们可以像下面一样添加一下头文件试试,如果报错,那就是INCLUDEPATH中的路径没有填正确,如下所示:
#include
#include
#include
(2)库文件测试:如果添加头文件没有报错,那么我们就可以尝试的添加一些代码来测试一下库文件,如下所示:
#include
#include
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
std::string strfilepath = "rabbit_t.pcd";
if (-1 == pcl::io::loadPCDFile(strfilepath, *cloud)) //打开点云文件
{
cout << "error input!" << endl;
return -1;
}
pcl::visualization::CloudViewer viewer("Cloud Viewer"); //创建viewer对象
cout<<"Point couting:"<<cloud->size()<<endl;
viewer.showCloud(cloud);
// viewer.runOnVisualizationThreadOnce(viewerOneOff);
// system("pause");
return a.exec();
}
如果没有点云文件,我可以提供一个点云文件:链接:https://pan.baidu.com/s/1iSMApxzvOv9tLfMVizEmaA 提取码:zfpk
点击运行程序,然后就大功告成了。
6、错误分析
这当然是不可能的了,要是仅仅是这样我就不会折腾一天了。运行程序之后,下面的输出界面就开始它的表演了。
(1)error LINK:无法打开***.lib文件。
看到这个信息,我就去到报错的安装路径中找了一下,的确没有这个文件,那么我就采用了眼不见心不烦的做法,把.pro中的这个库文件名给注释掉,注释掉所有报错的库文件名之后呢,那么恭喜你解锁新的错误。
(2)error LNK2019: 无法解析的外部符号×××,该符号在函数×××中被引用。
没办法,只能又去网上去搜索了一下,找了几个小时之后,我归纳了几个原因(以下纯属自己结合网上材料的推测,不一定正确,但也记录一下):
·1>缺少库文件路径。首先,我们应该能够确定,这个错误不是缺少某个.lib文件的问题,因为如果是的话,那么应该会出现(1)中的错误,所以我第一个想到的就是,是不是我的库路径没有全部添加。等我检查一遍之后,发现我的库路径已经全部添加上了,那么就可以排除这种可能。
·2>编译器位数问题。那么现在,我们大概可以判断的是,我们的应用程序应该已经连接上了第三方的库文件,但是他在调用某个东西的时候发生了问题。解决方案:我们可以尝试改变不同位数的编译器来测试程序,如将32位的编译器换成64位的编译器。
·3>库文件的问题。而如果是这种情况,那就是最坏的一种情况了,因为造成这种情况的原因可能就很多了,如网上所说:
【1】C语言和C++语言混编,因为C++支持函数重载所以C++编译器生成的库文件中的函数名会面目全非,也就是说不同语言的命名方式不同,这也就导致了查找的方式不同。
【2】模板声明和实现要放在同一文件夹中,具体可以看https://blog.csdn.net/jtop0/article/details/5779782
【3】 内联函数定义在头文件中。
…
总的来看,库文件如果自身有问题,那么我们就要修改库文件,可是我们使用的是第三方的PCL库,根本不可能去修改它们。那么,我们就需要重新去编译库文件将这些旧的库文件换掉。就这样第二个重头戏也就来了。
1、将我们下载好的cmake安装包解压,解压之后找到cmake-gui.exe文件。
2、双击该文件,会出现下面的界面。
3、设置输入输出路径并配置生成器信息(注意:输入输出的路径尽可能的不要出现中文名称,因为这可能导致路径乱码,以至于之后再生成库文件的过程中出现错误)。
点击确定,即可完成第一次配置。
而cmake的第一次配置给我的感觉就是在检查VTK8.0.0中的头文件和库文件,检查各个头文件和库文件的关系以及这些文件的版本信息等等,这也就是我个人的推测,因为我看到输出界面有许多检查信息。
4、第一次配置完成后,我们就要进行第二次配置,如下所示:
图中的BUILD_EXAMPLES、BUILD_TESTING我们可以加,也可以不加,不过我建议还是不要加上BUILD_EXAMPLES、BUILD_TESTING,因为要是加上了就会造成要编译的项目文件很大,我之前就是都加上了也不知道为什么就说HTTP error(下载错误),可能是VTK8.0下载数据的网站有点问题吧。我的要求只是要生成我所需要的.lib文件应该就可以了,所以我就没管那么多。
如果你还想要生成更多的文件,你还可以选择其他选项。除此之外,就是有时候可能没有找到自己想生成的文件,那你可以点击上面的“Advance(高级)”和“Group(组)”选项,再找一下可能会有你说需要的东西。
5、配置好了之后就可以点击“Configure”即可。
在这中间可能会出现下面的情况,如图所示:
你只需要这样配置一下就可以了,如下:
6、再次点击“Configure”,对照下面的信息是否相同。
7、如果相同的话,那就点击“Generate”生成VS项目文件。
8、点击“Open Project”,会调到VS软件中。在保证是编译器是64位的情况下,直接编译Debug(事后来看其实不需要Debug版本的文件)和Release两个版本的文件。
Debug版:
同上过程也可以生成Release版库文件,如果生成结果有错误那就需要重新再来一遍了,这挺麻烦的。
9、生成的文件如下所示:
10、库文件生成成功之后,那么接下来我们就可以右击“INSTALL”,生成我们需要的VTK头文件和库文件,输出路径为我们之前设置的路径(CMAKE_INSTALL_PREFIX)。
到这里,我们的VTK文件已经全部生成完毕。
其实很简单,就是将C:\PCL\PCL1.8.1\3rdParty\VTK替换为我们编译生成的VTK文件(为了方便称呼,我就将前者叫做旧版VTK,后者叫做新版VTK),我是将旧版VTK文件夹改名为VTK8.0,然后将新版VTK文件整个都复制过去就行了。
不过我们还要注意的就是,新版VTK文件中没有Debug版的.lib文件,我想这应该是我们在“INSTALL”生成的时候只能生成Release版本的.lib文件。
新版VTK库文件:
旧版本VTK库文件:
所以我们没有办法在Debug模式下运行程序,所以就只能在Release模式下运行,不过这已经够用了。
抱着不死心的态度,我又在VS中配置了一下PCL,这次是用的旧版的VTK库文件,在VS中Debug模式下程序成功运行,不过这好像并没有什么用哈哈。
1、测试代码如下:
#include
#include
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
std::string strfilepath = "D:/ComputerLanguage/C++/QT/QtPractice/ConsoleTest/rabbit_t.pcd";
if (-1 == pcl::io::loadPCDFile(strfilepath, *cloud)) //打开点云文件
{
cout << "error input!" << endl;
return -1;
}
pcl::visualization::CloudViewer viewer("Cloud Viewer"); //创建viewer对象
cout<<"Point couting:"<<cloud->size()<<endl;
viewer.showCloud(cloud);
// viewer.runOnVisualizationThreadOnce(viewerOneOff);
// system("pause");
return a.exec();
}
2、运行程序及实现效果。
3、最后的礼物。
特别要注意的是,我们之前在生成新版VTK的过程中,除了生成了新的VTK文件之外,还生成了一个插件,看下图去找到它吧。
将它放到C:\Qt\Qt5.9.4\5.9.4\msvc2015_64\plugins\designer文件夹中,打开Qt的64位designer就会发现产生了一个新的控件。
不过遗憾的是我还没有学会使用它,到这里算是真的结束了。
折腾了一天之后,总算是配置成功了,怎么说呢,感觉自己在这个过程中也学到了一点东西,就是要学会去分析程序出现的错误,冷静去思考错误的信息也是一种学习吧。
补:QT配置PCL过程记录(二)