一、环境配置
Visual Studio版本:Visual Studio Community 2019
QT版本:5.15.2
PCL版本:1.12.1
VTK版本:9.1(与PCL使用的VTK 版本一致)
二、安装QT
1. 下载QT
QT官方从5.15版本开始只提供在线安装模式,从如下网站下载对应版本的安装器。
这里我们选择“qt-unified-windows-x86-4.0.1-1-online.exe”安装器进行下载。
2. 安装QT
运行QT 在线安装包,安装需提供QT 账户,
输入账户点击Next 继续安装,到“Select Componets”页面,选择Qt LTS 5.15.2 版本,
展开“Qt 5.15.2”,继续选择组件,这里toolcahin 选择MSVC 2019 64bit(项目部署的PCL 1.12.1 使用VS2019 x64 因此这里选择同样的ToolChain),其他的toolchain 本项目没有使用,因此不勾选节省存储空间。
QT Creator 组件看需求选择,这里使用默认选项。
组件选择完毕之后,继续进行安装,直到安装完毕。
3. 环境变量
QT 安装完毕之后,需要设置QT 相关路径的环境变量,后续其他软件会使用到,如下变量设置好正确的路径,若变量已经存在颗忽略这一步。
二、安装Visual Studio
1. 下载Visual Studio
这里使用Visual Studio Community 2019 版本(项目部署的PCL 1.12.1 使用VS2019 x64 因此这里选择同样的ToolChain)。
2. 安装Visual Studio 2019
运行VS 在线安装包,在开发类型中,这里只选择C++ 桌面开发,右侧组件中圈红两项必选,分别为ToolChain 与调试模块,其他的按需选择。
组件选择完毕,点击安装,等待安装完成即可。
三、安装PCL
1. 下载PCL
这里选择使用PCL1.12.1 版本。
2. 安装PCL
运行PCL安装包,这里勾选自动配置系统环境变量,安装完毕之后可以系统变量中看到PCL 相关路径,后续软件会用到。
PCL 依赖到其他的第三方库,在“选择组件”页面,建议将PCL 使用第三方库一起安装,避免版本对齐的问题,省去很多麻烦。
组件选择完毕后,继续安装,等待安装完成即可。
四、安装VTK
PCL的点云三维显示功能依赖于其VTK组件实现,而PCL内置的VTK缺少QT 支持的组件,因此,为了支持在QT 中部署PCL 我们需要下载VTK源代码重新对其进行编译。
1. 下载VTK
从PCL 安装目录下找到VTK 的版本,如下图,表示该版本的PCL 使用的是VTK 9.1,去VTK 官网下载对应VTK 源码。
2. 配置VTK
使用Cmake 软件构建VTK 工程,
点击“Configure”配置VTK编译环境,这里选择这里使用VS2019-X64,
在Cmake 提取出VTK配置选择中,选择“QT 支持”相关选项,
BUILD_SHARED_LIBS:产生动态库;
CMAKE_INSTALL_PREFIX:产生库文件目录;
其他几项是QT 支持相关的配置;
再次点击“Configure”,完成之后,如果配置正确识别到QT, 从Cmake 窗口可以看到QT 安装路径信息(这里我们安装的是QT 5.15.2,因此识别到QT5 安装路径,如果未正确识别,返回QT 安装章节检查QT 是否正确安装),然后VTK_QT_VERSION 选择5。
点击Generate,Generate 执行完毕切未报错,点击Open Project 进入到Visual Studio 中,进行VTK的编译。
3.编译VTK
为了方便调试的需求,这里会分别编译VTK Release 版本与Debug 版本,进入Visual Studio 后,点击的“菜单栏->生成->批生成”,选择同时生成Release 和Debug。
点击生成进行编译,编译完毕之后,产生的VTK 相关的库文件与头文件会存放到前一章节的配置的目录CMAKE_INSTALL_PREFIX 目录下。
将产生VTK 文件,替换掉PCL 目录下3rdParty\VTK 的文件,完成VTK 的编译替换过程。
五、安装OpenNI2
PCL 1.12.1 安装目录下OpenNI2 只提供了安装包,使用安装包安装OpenNI2进行安装,安装完毕之后,从系统环境变量中可以看到OpenNI2相关的环境变量。
这里为了方便,建议将OpenNI2 安装的问题,复制到PCL 对应的路径下,与其他库保持一致。
六、在QT 中部署PCL
1. QT 依赖PCL 库文件
PCL相关的库文件非常多,且Release 与Debug 版本库文件不可混用,手动再Qmake 中添加非常繁琐,这里提供qmake 引用片段参考,也可以从文末下载链接中获取完整示例。
PCL_ROOT = $$PWD/thirdParty/PCL
VTK_ROOT = $${PCL_ROOT}/3rdParty/VTK
BOOST_ROOT = $${PCL_ROOT}/3rdParty/Boost
EIGEN_ROOT = $${PCL_ROOT}/3rdParty/Eigen
OPENNI2_ROOT = $${PCL_ROOT}/3rdParty/OpenNI2
QHULL_ROOT = $${PCL_ROOT}/3rdParty/Qhull
FLANN_ROOT = $${PCL_ROOT}/3rdParty/FLANN
INCLUDEPATH += $${PCL_ROOT}/include/pcl-1.12
INCLUDEPATH += $${VTK_ROOT}/include/vtk-9.1
INCLUDEPATH += $${BOOST_ROOT}/include/boost-1_78
INCLUDEPATH += $${EIGEN_ROOT}/eigen3
INCLUDEPATH += $${OPENNI2_ROOT}/Include
INCLUDEPATH += $${QHULL_ROOT}/include
INCLUDEPATH += $${FLANN_ROOT}/include
CONFIG(release, debug|release):LIBS += -L$${PCL_ROOT}/lib \
-lpcl_common\
-lpcl_features\
-lpcl_filters\
-lpcl_io\
-lpcl_io_ply\
-lpcl_kdtree\
-lpcl_keypoints\
-lpcl_ml\
-lpcl_octree\
-lpcl_outofcore\
-lpcl_people\
-lpcl_recognition\
-lpcl_registration\
-lpcl_sample_consensus\
-lpcl_search\
-lpcl_segmentation\
-lpcl_stereo\
-lpcl_surface\
-lpcl_tracking\
-lpcl_visualization
else:CONFIG(debug, debug|release):LIBS += -L$${PCL_ROOT}/lib \
-lpcl_commond\
-lpcl_featuresd\
-lpcl_filtersd\
-lpcl_iod\
-lpcl_io_plyd\
-lpcl_kdtreed\
-lpcl_keypointsd\
-lpcl_mld\
-lpcl_octreed\
-lpcl_outofcored\
-lpcl_peopled\
-lpcl_recognitiond\
-lpcl_registrationd\
-lpcl_sample_consensusd\
-lpcl_searchd\
-lpcl_segmentationd\
-lpcl_stereod\
-lpcl_surfaced\
-lpcl_trackingd\
-lpcl_visualizationd
CONFIG(release, debug|release):LIBS += -L$${BOOST_ROOT}/lib \
-llibboost_atomic-vc142-mt-x64-1_78\
-llibboost_bzip2-vc142-mt-x64-1_78\
-llibboost_chrono-vc142-mt-x64-1_78\
-llibboost_container-vc142-mt-x64-1_78\
-llibboost_context-vc142-mt-x64-1_78\
-llibboost_contract-vc142-mt-x64-1_78\
-llibboost_coroutine-vc142-mt-x64-1_78\
-llibboost_date_time-vc142-mt-x64-1_78\
-llibboost_exception-vc142-mt-x64-1_78\
-llibboost_filesystem-vc142-mt-x64-1_78\
-llibboost_graph-vc142-mt-x64-1_78\
-llibboost_graph_parallel-vc142-mt-x64-1_78\
-llibboost_iostreams-vc142-mt-x64-1_78\
-llibboost_json-vc142-mt-x64-1_78\
-llibboost_locale-vc142-mt-x64-1_78\
-llibboost_log-vc142-mt-x64-1_78\
-llibboost_log_setup-vc142-mt-x64-1_78\
-llibboost_math_c99-vc142-mt-x64-1_78\
-llibboost_math_c99f-vc142-mt-x64-1_78\
-llibboost_math_c99l-vc142-mt-x64-1_78\
-llibboost_math_tr1-vc142-mt-x64-1_78\
-llibboost_math_tr1f-vc142-mt-x64-1_78\
-llibboost_math_tr1l-vc142-mt-x64-1_78\
-llibboost_mpi-vc142-mt-x64-1_78\
-llibboost_nowide-vc142-mt-x64-1_78\
-llibboost_numpy38-vc142-mt-x64-1_78\
-llibboost_prg_exec_monitor-vc142-mt-x64-1_78\
-llibboost_program_options-vc142-mt-x64-1_78\
-llibboost_python38-vc142-mt-x64-1_78\
-llibboost_random-vc142-mt-x64-1_78\
-llibboost_regex-vc142-mt-x64-1_78\
-llibboost_serialization-vc142-mt-x64-1_78\
-llibboost_system-vc142-mt-x64-1_78\
-llibboost_test_exec_monitor-vc142-mt-x64-1_78\
-llibboost_thread-vc142-mt-x64-1_78\
-llibboost_timer-vc142-mt-x64-1_78\
-llibboost_type_erasure-vc142-mt-x64-1_78\
-llibboost_unit_test_framework-vc142-mt-x64-1_78\
-llibboost_wave-vc142-mt-x64-1_78\
-llibboost_wserialization-vc142-mt-x64-1_78\
-llibboost_zlib-vc142-mt-x64-1_78
else:CONFIG(debug, debug|release):LIBS += -L$${BOOST_ROOT}/lib \
-llibboost_atomic-vc142-mt-gd-x64-1_78\
-llibboost_bzip2-vc142-mt-gd-x64-1_78\
-llibboost_chrono-vc142-mt-gd-x64-1_78\
-llibboost_container-vc142-mt-gd-x64-1_78\
-llibboost_context-vc142-mt-gd-x64-1_78\
-llibboost_contract-vc142-mt-gd-x64-1_78\
-llibboost_coroutine-vc142-mt-gd-x64-1_78\
-llibboost_date_time-vc142-mt-gd-x64-1_78\
-llibboost_exception-vc142-mt-gd-x64-1_78\
-llibboost_filesystem-vc142-mt-gd-x64-1_78\
-llibboost_graph-vc142-mt-gd-x64-1_78\
-llibboost_graph_parallel-vc142-mt-gd-x64-1_78\
-llibboost_iostreams-vc142-mt-gd-x64-1_78\
-llibboost_json-vc142-mt-gd-x64-1_78\
-llibboost_locale-vc142-mt-gd-x64-1_78\
-llibboost_log-vc142-mt-gd-x64-1_78\
-llibboost_log_setup-vc142-mt-gd-x64-1_78\
-llibboost_math_c99-vc142-mt-gd-x64-1_78\
-llibboost_math_c99f-vc142-mt-gd-x64-1_78\
-llibboost_math_c99l-vc142-mt-gd-x64-1_78\
-llibboost_math_tr1-vc142-mt-gd-x64-1_78\
-llibboost_math_tr1f-vc142-mt-gd-x64-1_78\
-llibboost_math_tr1l-vc142-mt-gd-x64-1_78\
-llibboost_mpi-vc142-mt-gd-x64-1_78\
-llibboost_nowide-vc142-mt-gd-x64-1_78\
-llibboost_numpy38-vc142-mt-gd-x64-1_78\
-llibboost_prg_exec_monitor-vc142-mt-gd-x64-1_78\
-llibboost_program_options-vc142-mt-gd-x64-1_78\
-llibboost_python38-vc142-mt-gd-x64-1_78\
-llibboost_random-vc142-mt-gd-x64-1_78\
-llibboost_regex-vc142-mt-gd-x64-1_78\
-llibboost_serialization-vc142-mt-gd-x64-1_78\
-llibboost_system-vc142-mt-gd-x64-1_78\
-llibboost_test_exec_monitor-vc142-mt-gd-x64-1_78\
-llibboost_thread-vc142-mt-gd-x64-1_78\
-llibboost_timer-vc142-mt-gd-x64-1_78\
-llibboost_type_erasure-vc142-mt-gd-x64-1_78\
-llibboost_unit_test_framework-vc142-mt-gd-x64-1_78\
-llibboost_wave-vc142-mt-gd-x64-1_78\
-llibboost_wserialization-vc142-mt-gd-x64-1_78\
-llibboost_zlib-vc142-mt-gd-x64-1_78
CONFIG(release, debug|release):LIBS += -L$${FLANN_ROOT}/lib \
-lflann\
-lflann_cpp\
-lflann_cpp_s\
-lflann_s
else:CONFIG(debug, debug|release):LIBS += -L$${FLANN_ROOT}/lib \
-lflann-gd\
-lflann_cpp-gd\
-lflann_cpp_s-gd\
-lflann_s-gd
CONFIG(release, debug|release):LIBS += -L$${QHULL_ROOT}/lib \
-lqhullcpp\
-lqhullstatic\
-lqhullstatic_r\
-lqhull_r
else:CONFIG(debug, debug|release):LIBS += -L$${QHULL_ROOT}/lib \
-lqhullcpp_d\
-lqhullstatic_d\
-lqhullstatic_rd\
-lqhull_rd
CONFIG(release, debug|release):LIBS += -L$${OPENNI2_ROOT}/lib \
-lOpenNI2
else:CONFIG(debug, debug|release):LIBS += -L$${OPENNI2_ROOT}/lib \
-lOpenNI2
CONFIG(release, debug|release):LIBS += -L$${VTK_ROOT}/lib \
-lvtkChartsCore-9.1\
-lvtkCommonColor-9.1\
-lvtkCommonComputationalGeometry-9.1\
-lvtkCommonCore-9.1\
-lvtkCommonDataModel-9.1\
-lvtkCommonExecutionModel-9.1\
-lvtkCommonMath-9.1\
-lvtkCommonMisc-9.1\
-lvtkCommonSystem-9.1\
-lvtkCommonTransforms-9.1\
-lvtkDICOMParser-9.1\
-lvtkDomainsChemistry-9.1\
-lvtkDomainsChemistryOpenGL2-9.1\
-lvtkdoubleconversion-9.1\
-lvtkexodusII-9.1\
-lvtkexpat-9.1\
-lvtkFiltersAMR-9.1\
-lvtkFiltersCore-9.1\
-lvtkFiltersExtraction-9.1\
-lvtkFiltersFlowPaths-9.1\
-lvtkFiltersGeneral-9.1\
-lvtkFiltersGeneric-9.1\
-lvtkFiltersGeometry-9.1\
-lvtkFiltersHybrid-9.1\
-lvtkFiltersHyperTree-9.1\
-lvtkFiltersImaging-9.1\
-lvtkFiltersModeling-9.1\
-lvtkFiltersParallel-9.1\
-lvtkFiltersParallelImaging-9.1\
-lvtkFiltersPoints-9.1\
-lvtkFiltersProgrammable-9.1\
-lvtkFiltersSelection-9.1\
-lvtkFiltersSMP-9.1\
-lvtkFiltersSources-9.1\
-lvtkFiltersStatistics-9.1\
-lvtkFiltersTexture-9.1\
-lvtkFiltersTopology-9.1\
-lvtkFiltersVerdict-9.1\
-lvtkfmt-9.1\
-lvtkfreetype-9.1\
-lvtkGeovisCore-9.1\
-lvtkgl2ps-9.1\
-lvtkglew-9.1\
-lvtkGUISupportQt-9.1\
-lvtkGUISupportQtQuick-9.1\
-lvtkGUISupportQtSQL-9.1\
-lvtkhdf5-9.1\
-lvtkhdf5_hl-9.1\
-lvtkImagingColor-9.1\
-lvtkImagingCore-9.1\
-lvtkImagingFourier-9.1\
-lvtkImagingGeneral-9.1\
-lvtkImagingHybrid-9.1\
-lvtkImagingMath-9.1\
-lvtkImagingMorphological-9.1\
-lvtkImagingSources-9.1\
-lvtkImagingStatistics-9.1\
-lvtkImagingStencil-9.1\
-lvtkInfovisCore-9.1\
-lvtkInfovisLayout-9.1\
-lvtkInteractionImage-9.1\
-lvtkInteractionStyle-9.1\
-lvtkInteractionWidgets-9.1\
-lvtkIOAMR-9.1\
-lvtkIOAsynchronous-9.1\
-lvtkIOCGNSReader-9.1\
-lvtkIOChemistry-9.1\
-lvtkIOCityGML-9.1\
-lvtkIOCONVERGECFD-9.1\
-lvtkIOCore-9.1\
-lvtkIOEnSight-9.1\
-lvtkIOExodus-9.1\
-lvtkIOExport-9.1\
-lvtkIOExportGL2PS-9.1\
-lvtkIOExportPDF-9.1\
-lvtkIOGeometry-9.1\
-lvtkIOHDF-9.1\
-lvtkIOImage-9.1\
-lvtkIOImport-9.1\
-lvtkIOInfovis-9.1\
-lvtkIOIOSS-9.1\
-lvtkIOLegacy-9.1\
-lvtkIOLSDyna-9.1\
-lvtkIOMINC-9.1\
-lvtkIOMotionFX-9.1\
-lvtkIOMovie-9.1\
-lvtkIONetCDF-9.1\
-lvtkIOOggTheora-9.1\
-lvtkIOParallel-9.1\
-lvtkIOParallelXML-9.1\
-lvtkIOPLY-9.1\
-lvtkIOSegY-9.1\
-lvtkIOSQL-9.1\
-lvtkioss-9.1\
-lvtkIOTecplotTable-9.1\
-lvtkIOVeraOut-9.1\
-lvtkIOVideo-9.1\
-lvtkIOXML-9.1\
-lvtkIOXMLParser-9.1\
-lvtkjpeg-9.1\
-lvtkjsoncpp-9.1\
-lvtkkissfft-9.1\
-lvtklibharu-9.1\
-lvtklibproj-9.1\
-lvtklibxml2-9.1\
-lvtkloguru-9.1\
-lvtklz4-9.1\
-lvtklzma-9.1\
-lvtkmetaio-9.1\
-lvtknetcdf-9.1\
-lvtkogg-9.1\
-lvtkParallelCore-9.1\
-lvtkParallelDIY-9.1\
-lvtkpng-9.1\
-lvtkpugixml-9.1\
-lvtkRenderingAnnotation-9.1\
-lvtkRenderingContext2D-9.1\
-lvtkRenderingContextOpenGL2-9.1\
-lvtkRenderingCore-9.1\
-lvtkRenderingFreeType-9.1\
-lvtkRenderingGL2PSOpenGL2-9.1\
-lvtkRenderingImage-9.1\
-lvtkRenderingLabel-9.1\
-lvtkRenderingLOD-9.1\
-lvtkRenderingOpenGL2-9.1\
-lvtkRenderingQt-9.1\
-lvtkRenderingSceneGraph-9.1\
-lvtkRenderingUI-9.1\
-lvtkRenderingVolume-9.1\
-lvtkRenderingVolumeOpenGL2-9.1\
-lvtkRenderingVtkJS-9.1\
-lvtksqlite-9.1\
-lvtksys-9.1\
-lvtkTestingRendering-9.1\
-lvtktheora-9.1\
-lvtktiff-9.1\
-lvtkverdict-9.1\
-lvtkViewsContext2D-9.1\
-lvtkViewsCore-9.1\
-lvtkViewsInfovis-9.1\
-lvtkViewsQt-9.1\
-lvtkWrappingTools-9.1\
-lvtkzlib-9.1
else:CONFIG(debug, debug|release):LIBS += -L$${VTK_ROOT}/lib \
-lvtkChartsCore-9.1d\
-lvtkCommonColor-9.1d\
-lvtkCommonComputationalGeometry-9.1d\
-lvtkCommonCore-9.1d\
-lvtkCommonDataModel-9.1d\
-lvtkCommonExecutionModel-9.1d\
-lvtkCommonMath-9.1d\
-lvtkCommonMisc-9.1d\
-lvtkCommonSystem-9.1d\
-lvtkCommonTransforms-9.1d\
-lvtkDICOMParser-9.1d\
-lvtkDomainsChemistry-9.1d\
-lvtkDomainsChemistryOpenGL2-9.1d\
-lvtkdoubleconversion-9.1d\
-lvtkexodusII-9.1d\
-lvtkexpat-9.1d\
-lvtkFiltersAMR-9.1d\
-lvtkFiltersCore-9.1d\
-lvtkFiltersExtraction-9.1d\
-lvtkFiltersFlowPaths-9.1d\
-lvtkFiltersGeneral-9.1d\
-lvtkFiltersGeneric-9.1d\
-lvtkFiltersGeometry-9.1d\
-lvtkFiltersHybrid-9.1d\
-lvtkFiltersHyperTree-9.1d\
-lvtkFiltersImaging-9.1d\
-lvtkFiltersModeling-9.1d\
-lvtkFiltersParallel-9.1d\
-lvtkFiltersParallelImaging-9.1d\
-lvtkFiltersPoints-9.1d\
-lvtkFiltersProgrammable-9.1d\
-lvtkFiltersSelection-9.1d\
-lvtkFiltersSMP-9.1d\
-lvtkFiltersSources-9.1d\
-lvtkFiltersStatistics-9.1d\
-lvtkFiltersTexture-9.1d\
-lvtkFiltersTopology-9.1d\
-lvtkFiltersVerdict-9.1d\
-lvtkfmt-9.1d\
-lvtkfreetype-9.1d\
-lvtkGeovisCore-9.1d\
-lvtkgl2ps-9.1d\
-lvtkglew-9.1d\
-lvtkGUISupportQt-9.1d\
-lvtkGUISupportQtQuick-9.1d\
-lvtkGUISupportQtSQL-9.1d\
-lvtkhdf5-9.1d\
-lvtkhdf5_hl-9.1d\
-lvtkImagingColor-9.1d\
-lvtkImagingCore-9.1d\
-lvtkImagingFourier-9.1d\
-lvtkImagingGeneral-9.1d\
-lvtkImagingHybrid-9.1d\
-lvtkImagingMath-9.1d\
-lvtkImagingMorphological-9.1d\
-lvtkImagingSources-9.1d\
-lvtkImagingStatistics-9.1d\
-lvtkImagingStencil-9.1d\
-lvtkInfovisCore-9.1d\
-lvtkInfovisLayout-9.1d\
-lvtkInteractionImage-9.1d\
-lvtkInteractionStyle-9.1d\
-lvtkInteractionWidgets-9.1d\
-lvtkIOAMR-9.1d\
-lvtkIOAsynchronous-9.1d\
-lvtkIOCGNSReader-9.1d\
-lvtkIOChemistry-9.1d\
-lvtkIOCityGML-9.1d\
-lvtkIOCONVERGECFD-9.1d\
-lvtkIOCore-9.1d\
-lvtkIOEnSight-9.1d\
-lvtkIOExodus-9.1d\
-lvtkIOExport-9.1d\
-lvtkIOExportGL2PS-9.1d\
-lvtkIOExportPDF-9.1d\
-lvtkIOGeometry-9.1d\
-lvtkIOHDF-9.1d\
-lvtkIOImage-9.1d\
-lvtkIOImport-9.1d\
-lvtkIOInfovis-9.1d\
-lvtkIOIOSS-9.1d\
-lvtkIOLegacy-9.1d\
-lvtkIOLSDyna-9.1d\
-lvtkIOMINC-9.1d\
-lvtkIOMotionFX-9.1d\
-lvtkIOMovie-9.1d\
-lvtkIONetCDF-9.1d\
-lvtkIOOggTheora-9.1d\
-lvtkIOParallel-9.1d\
-lvtkIOParallelXML-9.1d\
-lvtkIOPLY-9.1d\
-lvtkIOSegY-9.1d\
-lvtkIOSQL-9.1d\
-lvtkioss-9.1d\
-lvtkIOTecplotTable-9.1d\
-lvtkIOVeraOut-9.1d\
-lvtkIOVideo-9.1d\
-lvtkIOXML-9.1d\
-lvtkIOXMLParser-9.1d\
-lvtkjpeg-9.1d\
-lvtkjsoncpp-9.1d\
-lvtkkissfft-9.1d\
-lvtklibharu-9.1d\
-lvtklibproj-9.1d\
-lvtklibxml2-9.1d\
-lvtkloguru-9.1d\
-lvtklz4-9.1d\
-lvtklzma-9.1d\
-lvtkmetaio-9.1d\
-lvtknetcdf-9.1d\
-lvtkogg-9.1d\
-lvtkParallelCore-9.1d\
-lvtkParallelDIY-9.1d\
-lvtkpng-9.1d\
-lvtkpugixml-9.1d\
-lvtkRenderingAnnotation-9.1d\
-lvtkRenderingContext2D-9.1d\
-lvtkRenderingContextOpenGL2-9.1d\
-lvtkRenderingCore-9.1d\
-lvtkRenderingFreeType-9.1d\
-lvtkRenderingGL2PSOpenGL2-9.1d\
-lvtkRenderingImage-9.1d\
-lvtkRenderingLabel-9.1d\
-lvtkRenderingLOD-9.1d\
-lvtkRenderingOpenGL2-9.1d\
-lvtkRenderingQt-9.1d\
-lvtkRenderingSceneGraph-9.1d\
-lvtkRenderingUI-9.1d\
-lvtkRenderingVolume-9.1d\
-lvtkRenderingVolumeOpenGL2-9.1d\
-lvtkRenderingVtkJS-9.1d\
-lvtksqlite-9.1d\
-lvtksys-9.1d\
-lvtkTestingRendering-9.1d\
-lvtktheora-9.1d\
-lvtktiff-9.1d\
-lvtkverdict-9.1d\
-lvtkViewsContext2D-9.1d\
-lvtkViewsCore-9.1d\
-lvtkViewsInfovis-9.1d\
-lvtkViewsQt-9.1d\
-lvtkWrappingTools-9.1d\
-lvtkzlib-9.1d
2. 使用QT 组件
打开QT Creator 中画布中,添加一个基础Widget,
再对象窗口右键该Widget,右键选择“提升窗口部件”,“提升类的名称”使用“”QVTKOpenGLNativeWidget”,“头文件”选择“QVTKOpenGLNativeWidget.h”(该文件是VTK 章节编译出来),
提升完毕之后,就可以将PCL 显示在该组件上面。
在demo 程序中,我们额外增加一个按钮,点击按钮,窗口读取demo.pcd 点云文件,在VTK Widget 中显示点云效果。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/common/io.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/PolygonMesh.h>
#include <pcl/point_cloud.h>
#include <pcl/io/vtk_lib_io.h>//loadPolygonFileOBJ所属头文件;
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/common/common_headers.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/parse.h>
#include <pcl/io/ply_io.h>
// Visualization Toolkit (VTK)
#include <vtkRenderWindow.h>
#include <QVTKRenderWidget.h>
#include <QVTKOpenGLNativeWidget.h>
#include "vtkGenericOpenGLRenderWindow.h"
typedef pcl::PointXYZRGBA PointT;
typedef pcl::PointCloud<PointT> PointCloudT;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
pcl::visualization::PCLVisualizer::Ptr pclviewer;
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);
auto renderer2 = vtkSmartPointer<vtkRenderer>::New();
auto renderWindow2 = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
renderWindow2->AddRenderer(renderer2);
pclviewer.reset(new pcl::visualization::PCLVisualizer(renderer2, renderWindow2, "viewer", false));
ui->qvtkWidget->setRenderWindow(pclviewer->getRenderWindow());
pclviewer->setupInteractor(ui->qvtkWidget->interactor(), ui->qvtkWidget->renderWindow());
pcl::io::loadPCDFile("demo.pcd", *cloud);
pclviewer->addPointCloud<pcl::PointXYZRGBA>(cloud, "sample cloud");
pclviewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
}
显示效果如图。
七、QT PCL demo 范例