如何在QT 中部署点云库(Point Cloud Library)

一、环境配置

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 Download

这里我们选择“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)。

VS Download

2. 安装Visual Studio 2019

运行VS 在线安装包,在开发类型中,这里只选择C++ 桌面开发,右侧组件中圈红两项必选,分别为ToolChain 与调试模块,其他的按需选择。

组件选择完毕,点击安装,等待安装完成即可。

三、安装PCL

1. 下载PCL

这里选择使用PCL1.12.1 版本。

PCL Download

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 源码。

VTK 9.1 DownLoad

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 范例

  • 25
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CloudCompare是一个开源的三维点云处理软件,支持在Qt下进行编译。 编译CloudCompare的过程相对复杂,下面是一个大致的步骤: 1. 安装Qt开发环境:在Qt官网下载并安装最新版的Qt开发环境。 2. 下载CloudCompare源代码:从CloudCompare的官方GitHub仓下载最新版的源代码。 3. 配置Qt开发环境:在Qt Creator打开CloudCompare的.pro文件,并配置相关的构建和部署选项。 4. 配置第三方CloudCompare依赖于一些第三方,如PCL(Point Cloud Library)和VTK(Visualization Toolkit)。根据你的系统和需求,下载并编译这些。 5. 配置构建选项:根据你的系统和需求,设置CloudCompare的构建选项。例如,你可以选择编译带有GUI界面的版本或者只编译命令行工具。 6. 编译和构建:在Qt Creator点击构建按钮,开始编译和构建CloudCompare。编译过程可能需要一些时间,取决于你的系统性能和代码的大小。 7. 运行和测试:当编译完成后,你可以在Qt Creator运行和测试CloudCompare。确保一切正常工作,并根据需要进行调整和优化。 需要注意的是,编译CloudCompare可能需要一些编程和系统知识,同时也需要一些时间和耐心。如果你是一个新手或者没有足够的经验,可能需要参考更详细的文档或者向社区寻求帮助。 ### 回答2: CloudCompare是一种基于点云数据的开源软件,可以实现点云处理、分析和可视化。在Qt下编译CloudCompare可以让用户更方便地使用CloudCompare的功能。 首先,我们需要下载CloudCompare的源代码。可以从官方网站或者Github上获取到CloudCompare的源代码。下载完成后,解压源代码到本地目录。 接下来,我们需要安装Qt开发环境。Qt是一套跨平台的应用程序开发框架,可以方便地进行界面设计和编写程序逻辑。根据自己的操作系统,选择合适的Qt版本进行安装。 安装完成后,打开Qt Creator,创建一个新的Qt项目。选择"Import Existing Project",将CloudCompare的源代码导入到项目。 然后,我们需要配置Qt项目的编译选项。选择"Projects"菜单,进入项目配置页面。在"Build & Run"选项,选择正确的编译器和构建目录。根据需要,可以进一步设置编译选项,如优化级别和编译标志。 在进行编译之前,需要确保系统上已安装依赖和工具。根据CloudCompare的文档,安装所需的依赖和工具,并将它们配置到项目。这些依赖和工具通常涉及点云处理、数学计算、图形渲染等方面。 最后,进行编译和构建。选择"Build"菜单,点击"Build All"或按下快捷键Ctrl+B,开始编译CloudCompare。编译过程可能需要一些时间,取决于计算机性能和项目的复杂度。 一旦编译成功,就可以在Qt Creator的"Compile Output"窗口看到编译信息。同时,在项目的构建目录,可以找到CloudCompare的可执行文件。运行该可执行文件,即可启动CloudCompare。 总结起来,编译CloudCompare在Qt下实际上是一个典型的Qt项目构建过程。首先,导入源代码并配置编译选项。然后,安装依赖和工具,确保编译环境正常。最后,进行编译和构建,生成可执行文件并运行。这样,就可以在Qt下使用CloudCompare的功能了。 ### 回答3: CloudCompare是一个开源点云数据处理软件,它支持在Qt下进行编译。下面是在Qt环境下编译CloudCompare的步骤: 1.安装Qt开发环境:首先,你需要下载并安装Qt开发环境。你可以从Qt官方网站上获取适用于你操作系统的Qt安装程序。安装完成后,确保你已经正确配置了Qt环境变量,以便在命令行可以运行Qt相关命令。 2.获取CloudCompare源代码:你可以从CloudCompare的官方GitHub仓上获取CloudCompare的源代码。通过克隆仓或直接下载源代码的压缩包。 3.打开Qt Creator:打开Qt Creator IDE,选择“打开项目”选项,然后导航到你下载的CloudCompare源代码所在的目录,选择CloudCompare.pro文件进行打开。 4.选择编译目标:在Qt Creator的左侧项目窗口,选择你想要编译的目标,比如CloudCompare主程序或者其他衍生项目。 5.配置项目:根据你的编译需求,你可能需要配置一些编译选项,比如编译器、构建目录等。你可以在"项目"菜单找到这些选项。确保选择了正确的构建套件和目标平台。 6.构建项目:点击Qt Creator工具栏上的“构建”按钮,开始构建CloudCompare项目。Qt Creator将会执行编译过程,并在构建输出窗口显示编译日志。 7.查看构建结果:一旦编译完成,你可以在Qt Creator的构建输出窗口查看构建结果。如果一切顺利,你将会看到编译成功的提示。 8.运行CloudCompare:构建完成后,你可以在Qt Creator点击运行按钮来运行CloudCompare程序。你也可以在输出目录找到编译生成的可执行文件,然后在命令行运行它。 以上是在Qt下编译CloudCompare的大致步骤。具体操作可能会因操作系统、Qt版本等因素而有所不同,请根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值