点云库PCL环境配置:QT 5.9.2+ msvc2017 + PCL1.8.1 + VTK8.0

一、背景:

        由于项目需要对传感器数据进行滤波、计算、显示等操作处理,现有对组成面的线依次进行递归中值平均滤波算法处理,面型不够平滑,效果比较差。因此,查阅资料后,决定尝试点云库进行相关处理,已经过测试,解决了面型不够平滑的问题。(PS:采用的移动最小二乘拟合MLS进行的数据滤波平滑。)

       

二、配置步骤及主要问题:

        之前QT 5.9.2+ msvc2017的环境是配置好的,因此不过多介绍,主要进行PCL1.8.1 + VTK8.0的安装配置介绍。

1、PCL1.8.1的安装

                注意安装时VC的版本和PCL的版本还有QT的版本一定要一致,另外32位和64位也要一致,选64位。

双击“PCL-1.8.1-AllInOne-msvc2017-win64.exe”安装,注意事项:pcl与QT进行联合开发的情况下,QT因为不支持带中文和空格的路径,例如可以将pcl安装在D盘根目录下,如图

安装时这一步这样选择:

       

安装过程中会会弹出OpenNI2的安装窗口,上次没注意选在了目录“D:\PCL1.8.1\OpenNI2”。其实可以设置在“D:\PCL1.8.1\3rdParty\OpenNI2”。在OpenNI2安装时可能会提示文件路径过长,此时点击确认即可。

        等待安装完成后,要添加PCL的环境变量,将下面的路径核对后,添加到系统变量中:

        解压“PCL-1.8.1-pdb-msvc2017-win64.zip”,将里面的.pdb文件全部复制到PCL安装路径下bin文件夹中。

 2、VTK8.0配置

        VTK编译,PCL中已有VTK 为什么需要手动编译VTK?

        PCL 依赖 VTK,在其3rdParty目录下可以看到 VTK。那为什么还要自己手动编译 VTK 呢?这是因为,PCL 安装目录下的 VTK 并不完整,其中就少了与 Qt 相关的模块,而这些模块是 CloudViewer 编译运行所需要的(如QVTKWidget)。所以我们需要手动编译 VTK,并替换 PCL3rdParty下的 VTK。

        可以发现,PCL1.8.1 依赖 VTK8.0,所以我们编译这个版本的 VTK(如果你使用的是其他版本的 PCL,请编译对应版本的 VTK)。可以在 VTK Github 下的 release 页面获取对应版本的 VTK 源码。在此之前,假设你已经安装好了 cmake 和 Visual Studio,前者用于生成平台相关的解决方案,后者用于编译。

       我从网上找了针对win10\win11编译好的VTK8.0库下载下来直接用的,所以跳过了编译的这个步骤,如果需要可以网上查询编译步骤及编译的注意事项。(后面又自己用源码进行了编译)

        编译好的库: 

 

 

         将“D:\PCL1.8.1\3rdParty\VTK”目录下的文件全部替换成编译好的或下载等其他方式得到的VTK文件Release版本,将Debug的lib中的文件整合到一起也放到Release的bin文件夹下

将目录“D:\PCL1.8.1\3rdParty\VTK\plugins\designer”下面文件“QVTKWidgetPlugin.dll”放到QT安装目录下的这个地方“D:\Qt\Qt5.9.2\5.9.2\msvc2017_64\plugins\designer”???

“QVTKWidgetPlugin-gd.dll”可以不放???

         至此VTK8.0配置完成

3、QT5.9.2项目配置使用PCL

        新建文本文件,然后写入下面的文件后,改后缀名位为.pri,然后将该.pri文件加入到项目中即可。其中注释掉几行,因为从网上下载的这个文件,可能因为版本或其他问题我这里找不到这几个引用的文件。

INCLUDEPATH += D:\PCL1.8.1\include\pcl-1.8

INCLUDEPATH += D:\PCL1.8.1\include\pcl-1.8\pcl

INCLUDEPATH += D:\PCL1.8.1\3rdParty\Boost\include\boost-1_64

INCLUDEPATH += D:\PCL1.8.1\3rdParty\Boost\include\boost-1_64\boost

INCLUDEPATH += D:\PCL1.8.1\3rdParty\Eigen\eigen3

INCLUDEPATH += D:\PCL1.8.1\3rdParty\FLANN\include

INCLUDEPATH += D:\PCL1.8.1\3rdParty\FLANN\include\flann

INCLUDEPATH += D:\PCL1.8.1\OpenNI2\Include

INCLUDEPATH += D:\PCL1.8.1\3rdParty\Qhull\include

INCLUDEPATH += D:\PCL1.8.1\3rdParty\VTK\include\vtk-8.0


CONFIG(debug,debug|release){


LIBS += -LD:\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 += -LD:\PCL1.8.1\3rdParty\Boost\lib\
        -llibboost_atomic-vc141-mt-gd-1_64\
        -llibboost_bzip2-vc141-mt-gd-1_64\
        -llibboost_chrono-vc141-mt-gd-1_64\
        -llibboost_container-vc141-mt-gd-1_64\
        -llibboost_context-vc141-mt-gd-1_64\
        -llibboost_coroutine-vc141-mt-gd-1_64\
        -llibboost_date_time-vc141-mt-gd-1_64\
        -llibboost_exception-vc141-mt-gd-1_64\
        -llibboost_fiber-vc141-mt-gd-1_64\
        -llibboost_filesystem-vc141-mt-gd-1_64\
        -llibboost_graph-vc141-mt-gd-1_64\
        -llibboost_graph_parallel-vc141-mt-gd-1_64\
        -llibboost_iostreams-vc141-mt-gd-1_64\
        -llibboost_locale-vc141-mt-gd-1_64\
        -llibboost_log-vc141-mt-gd-1_64\
        -llibboost_log_setup-vc141-mt-gd-1_64\
        -llibboost_math_c99-vc141-mt-gd-1_64\
        -llibboost_math_c99f-vc141-mt-gd-1_64\
        -llibboost_math_c99l-vc141-mt-gd-1_64\
        -llibboost_math_tr1-vc141-mt-gd-1_64\
        -llibboost_math_tr1f-vc141-mt-gd-1_64\
        -llibboost_math_tr1l-vc141-mt-gd-1_64\
        -llibboost_mpi-vc141-mt-gd-1_64\
        -llibboost_numpy-vc141-mt-gd-1_64\
        -llibboost_numpy3-vc141-mt-gd-1_64\
        -llibboost_prg_exec_monitor-vc141-mt-gd-1_64\
        -llibboost_program_options-vc141-mt-gd-1_64\
        -llibboost_python-vc141-mt-gd-1_64\
        -llibboost_python3-vc141-mt-gd-1_64\
        -llibboost_random-vc141-mt-gd-1_64\
        -llibboost_regex-vc141-mt-gd-1_64\
        -llibboost_serialization-vc141-mt-gd-1_64\
        -llibboost_signals-vc141-mt-gd-1_64\
        -llibboost_system-vc141-mt-gd-1_64\
        -llibboost_test_exec_monitor-vc141-mt-gd-1_64\
        -llibboost_thread-vc141-mt-gd-1_64\
        -llibboost_timer-vc141-mt-gd-1_64\
        -llibboost_type_erasure-vc141-mt-gd-1_64\
        -llibboost_unit_test_framework-vc141-mt-gd-1_64\
        -llibboost_wave-vc141-mt-gd-1_64\
        -llibboost_wserialization-vc141-mt-gd-1_64\
        -llibboost_zlib-vc141-mt-gd-1_64

LIBS += -LD:\PCL1.8.1\3rdParty\FLANN\lib\
        -lflann-gd\
        -lflann_cpp-gd\
        -lflann_cpp_s-gd\
        -lflann_s-gd

LIBS += -LD:\PCL1.8.1\OpenNI2\Lib\
        -lOpenNI2

LIBS += -LD:\PCL1.8.1\3rdParty\Qhull\lib\
        -lqhull_d\
        -lqhullcpp_d\
        -lqhullstatic_d\
        -lqhullstatic_r_d\
        -lqhull_p_d\
        -lqhull_r_d

LIBS += -LD:\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\
-lvtkIOExportOpenGL2-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\
-lvtkRenderingContextOpenGL2-8.0-gd\
        -lvtkRenderingCore-8.0-gd\
        -lvtkRenderingFreeType-8.0-gd\
        #-lvtkRenderingGL2PS-8.0-gd\
-lvtkRenderingGL2PSOpenGL2-8.0-gd\
        -lvtkRenderingImage-8.0-gd\
        -lvtkRenderingLabel-8.0-gd\
        #-lvtkRenderingLIC-8.0-gd\
        -lvtkRenderingLOD-8.0-gd\
        #-lvtkRenderingOpenGL-8.0-gd\
-lvtkRenderingOpenGL2-8.0-gd\
        -lvtkRenderingQt-8.0-gd\
        -lvtkRenderingVolume-8.0-gd\
        #-lvtkRenderingVolumeOpenGL-8.0-gd\
-lvtkRenderingVolumeOpenGL2-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 += -LD:\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 += -LD:\PCL1.8.1\3rdParty\Boost\lib\
        -llibboost_atomic-vc141-mt-1_64\
        -llibboost_bzip2-vc141-mt-1_64\
        -llibboost_chrono-vc141-mt-1_64\
        -llibboost_container-vc141-mt-1_64\
        -llibboost_context-vc141-mt-1_64\
        -llibboost_coroutine-vc141-mt-1_64\
        -llibboost_date_time-vc141-mt-1_64\
        -llibboost_exception-vc141-mt-1_64\
        -llibboost_fiber-vc141-mt-1_64\
        -llibboost_filesystem-vc141-mt-1_64\
        -llibboost_graph-vc141-mt-1_64\
        -llibboost_graph_parallel-vc141-mt-1_64\
        -llibboost_iostreams-vc141-mt-1_64\
        -llibboost_locale-vc141-mt-1_64\
        -llibboost_log-vc141-mt-1_64\
        -llibboost_log_setup-vc141-mt-1_64\
        -llibboost_math_c99-vc141-mt-1_64\
        -llibboost_math_c99f-vc141-mt-1_64\
        -llibboost_math_c99l-vc141-mt-1_64\
        -llibboost_math_tr1-vc141-mt-1_64\
        -llibboost_math_tr1f-vc141-mt-1_64\
        -llibboost_math_tr1l-vc141-mt-1_64\
        -llibboost_mpi-vc141-mt-1_64\
        -llibboost_numpy-vc141-mt-1_64\
        -llibboost_numpy3-vc141-mt-1_64\
        -llibboost_prg_exec_monitor-vc141-mt-1_64\
        -llibboost_program_options-vc141-mt-1_64\
        -llibboost_python-vc141-mt-1_64\
        -llibboost_python3-vc141-mt-1_64\
        -llibboost_random-vc141-mt-1_64\
        -llibboost_regex-vc141-mt-1_64\
        -llibboost_serialization-vc141-mt-1_64\
        -llibboost_signals-vc141-mt-1_64\
        -llibboost_system-vc141-mt-1_64\
        -llibboost_test_exec_monitor-vc141-mt-1_64\
        -llibboost_thread-vc141-mt-1_64\
        -llibboost_timer-vc141-mt-1_64\
        -llibboost_type_erasure-vc141-mt-1_64\
        -llibboost_unit_test_framework-vc141-mt-1_64\
        -llibboost_wave-vc141-mt-1_64\
        -llibboost_wserialization-vc141-mt-1_64\
        -llibboost_zlib-vc141-mt-1_64

LIBS += -LD:\PCL1.8.1\3rdParty\FLANN\lib\
        -lflann\
        -lflann_cpp\
        -lflann_cpp_s\
        -lflann_s

LIBS += -LD:\PCL1.8.1\OpenNI2\Lib\
        -lOpenNI2

LIBS += -LD:\PCL1.8.1\3rdParty\Qhull\lib\
        -lqhull\
        -lqhullcpp\
        -lqhullstatic\
        -lqhullstatic_r\
        -lqhull_p\
        -lqhull_r

LIBS += -LD:\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\
        -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\
        -lvtkFiltersPoints-8.0\
        -lvtkFiltersProgrammable-8.0\
        -lvtkFiltersSelection-8.0\
        -lvtkFiltersSMP-8.0\
        -lvtkFiltersSources-8.0\
        -lvtkFiltersStatistics-8.0\
        -lvtkFiltersTexture-8.0\
        -lvtkFiltersTopology-8.0\
        -lvtkFiltersVerdict-8.0\
        -lvtkfreetype-8.0\
        -lvtkGeovisCore-8.0\
        -lvtkgl2ps-8.0\
        -lvtkGUISupportQt-8.0\
        #-lvtkGUISupportQtOpenGL-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\
        #-lvtkIOExportOpenGL-8.0\
-lvtkIOExportOpenGL2-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\
        -lvtkIOTecplotTable-8.0\
        -lvtkIOVideo-8.0\
        -lvtkIOXML-8.0\
        -lvtkIOXMLParser-8.0\
        -lvtkjpeg-8.0\
        -lvtkjsoncpp-8.0\
        -lvtklibharu-8.0\
        -lvtklibxml2-8.0\
        -lvtklz4-8.0\
        -lvtkmetaio-8.0\
        -lvtkNetCDF-8.0\
        -lvtknetcdf_c++\
        -lvtkoggtheora-8.0\
        -lvtkParallelCore-8.0\
        -lvtkpng-8.0\
        -lvtkproj4-8.0\
        -lvtkRenderingAnnotation-8.0\
        -lvtkRenderingContext2D-8.0\
        #-lvtkRenderingContextOpenGL-8.0\
-lvtkRenderingContextOpenGL2-8.0\
        -lvtkRenderingCore-8.0\
        -lvtkRenderingFreeType-8.0\
        #-lvtkRenderingGL2PS-8.0\
-lvtkRenderingGL2PSOpenGL2-8.0\
        -lvtkRenderingImage-8.0\
        -lvtkRenderingLabel-8.0\
        #-lvtkRenderingLIC-8.0\
        -lvtkRenderingLOD-8.0\
        #-lvtkRenderingOpenGL-8.0\
-lvtkRenderingOpenGL2-8.0\
        -lvtkRenderingQt-8.0\
        -lvtkRenderingVolume-8.0\
        #-lvtkRenderingVolumeOpenGL-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\
        
}

4.简单测试,需要rabbit.pcd

#include<iostream>
#include<pcl/io/pcd_io.h>
#include<pcl/visualization/cloud_viewer.h>

void viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
    viewer.setBackgroundColor(0.5, 0.9, 0.5);   //设置背景颜色
}
int main()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    char strfilepath[256] = "rabbit.pcd";//这里填点云路径
    pcl::io::loadPCDFile(strfilepath, *cloud);
    pcl::visualization::CloudViewer viewer("Cloud Viewer");   //创建viewer对象
    viewer.showCloud(cloud);
    viewer.runOnVisualizationThreadOnce(viewerOneOff);
    pcl::io::savePCDFile("Savepcd.pcd", *cloud);
    system("pause");
    return 0;
}

5.QT中加入VTK的最正确方法(该方法是在Designer中使用VTK的正确方法)

这个应该是最正确的方法了。方法的核心就是将QWidget提升为自定义控件。

QVTKOpenGLNativeWidget 实际上是VTK给写好的一个自定义控件,继承自QWidget类,所以只需要将QWdiget类提升为QVTKOpenGLNativeWidget类就行了

1.用Designer打开项目的界面文件(.ui后缀文件)

2.在左边的控件栏中,将Containers下的“Widget”这个控件拖入到用户界面中,然后右边的对象查看器中就能查到你拖入的QWidget控件对象。

在这里插入图片描述

3.对该对象点右键,选择“提升为”,提升为可以理解是将QT自带的控件类提升为开发者编写的自定义控件类。而QVTKOpenGLNativeWidget就是VTK编写的自定义控件类。

在这里插入图片描述
4.然后提升的类名称填上“QVTKOpenGLNativeWidget”,头文件填写“QVTKOpenGLNativeWidget.h”。基类选择QWidget。然后点击“添加”-》“提升”

 在这里插入图片描述

提升的类名称:指自定义控件的类名称,VTK提供的自定义类名称就是QVTKOpenGLNativeWidget。
头文件:指自定义控件的头文件,VTK提供的自定义控件类的头文件就是QVTKOpenGLNativeWidget.h。注意大小写。如果不对应的话,会失效。
基类名称:指自定义的控件类的基类是谁,QVTKOpenGLNativeWidget的基类就是QWidget。选错了也是不行的。
添加:指保存这个设定,下次可以直接拿来使用,不用重新输入以上信息。
提升:指将你拖入UI中的QWidget控件,变成你写好的自定义控件类,在这里就是将QWidget类变成QVTKOpenGLNativeWidget类。

5.重命名该窗口控件的对象名,用来写代码的时候识别。网上所见通常命名为“qvtkWidget”

在这里插入图片描述

6.最后在你的主窗口类下调用ui的成员变量可以成功呼出qvtkWidget这个vtk窗口控件。

 在这里插入图片描述

实际上以上就是自定义控件类的定义过程,区别是该自定义控件类不需要自己写一个类,而是VTK已经写好提供给我们,我们直接拿来提升就行了。

6.最方便方法,不使用Designer,直接用代码实现加入VTK窗口的方式(最推荐方法)

这是最简单的方法了,不要用到.ui文件,不需要用到Designer,直接在代码上用。都不需要提升类,直接包含头文件后拿来用就行。

在MainWindow的构造函数中写代码:(不需要照抄,理解以下几行代码在干嘛即可)

	//初始化VTK窗口,命名为qvtkWidget(原理和QPushButton这种QT自带的控件一样,只是该控件由VTK提供,用法跟QPushButton是一样的)
	QVTKOpenGLNativeWidget* qvtkWidget = new QVTKOpenGLNativeWidget();
	//初始化VTK的渲染器,平时用的比较多是vtkRenderWindow,但是在QT中要改用vtkGenericOpenGLRenderWindow,实质上与vtkRenderWindow功能一致
	vtkGenericOpenGLRenderWindow* renderWindow = vtkGenericOpenGLRenderWindow()::New();
	//将渲染器加入到VTK窗口中。可以先写这一行,后续再将准备好的vtkRenderer加入到renderWindow中也是可以同步数据的
	qvtkWidget->setRenderWindow(renderWindow);
	//创建网格布局,只是为了方便布局,实际上可以直接调用qvtkwidget的baseSize函数指定窗口大小也行
	QGridLayout* displayGrid = new QGridLayout(this);
	displayGrid->addWidget(qvtkWidget);
	this->setLayout(displayGrid);

需要在MainWindow头文件中包含vtkGenericOpenGLRenderWindow.h和QVTKOpenGLNativeWidget.h头文件。

理解上面的代码,自己在MainWindow构造函数中去使用(在其他地方用也没问题,用法一样)

————————————————
版权声明:本文为CSDN博主「864306337」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37366618/article/details/124926853

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值