Qt+PCL+VS实现点云Gui界面显示
经历了多次失败,终于成功,这里把我的经验教训写出来供大家参考。首先需要安装VS2015、QT5.14、PCL1.8.1,这里不着重讲解如何安装软件,由于由于预编译的vtk包并没有和qt进行编译得到Qvtk控件(该控件用来在qt上进行显示点云),因此需要下载VTK-8.0(必须是该版本,因为pcl-allinone包之前编译使用的是该版本)使用CMAKE进行编译。
1、cmake 3.10安装
一定要注意CMake的版本,下载较新的版本可能导致之后编译vtk的过程中会出现检测不出VS2015_64位的情况,只能检测出VS2015,所以也建议安装较旧的版本。
选择好自己电脑是什么系统,以及是32位还是64位
cmake官网下载地址
下面是我在网上找的3.8.2的安装教程,只是作为安装教程,为了版本对应,其实我安装的是3.10
下载完成后,双击进行安装。
1.)欢迎界面,点击【next】
2.)如图
3.)按图中红框勾选,然后点【next】
4.)路径选择,然后点【next】。
安装路径根据自己需要自行修改。【建议】路径名是在英文路径下,不要包含中文和空格。
5).开始安装。点【Install】
6).安装完成后点击 finish,因为在安装过程中选择了自动添加环境,所以安装完后不用手动添加环境了,但是此时必须得重启电脑,变量才能使用,否则无法对Cmake安装进行测试。重启电脑后,打开cmd黑窗,输入cmake,能够显示cmake的一些信息即为安装成功
2、Cmake 对VTK编译
经过多次尝试失败,我发现只要VS、PCL、qt、cmake版本对应可以直接下载编译好的VTK,将其复制到D:\PCL1.8.1\PCL 1.8.1\3rdParty文件夹下替换原有的VTK文件,注意一定要与原来的VTK版本对应,然后将D:\PCL1.8.1\PCL1.8.1\3rdParty\VTK\plugins\designer中的QVTKWidgetPlugin.dll文件复制到E:\QT\5.14.0\msvc2015_64\plugins\designer中,打开QT Designer中发现QVTK插件即编译成功。
编译好的VTK8.0
自己编译按照如下步骤:
(1)从官网下载对应的vtk安装包,将其解压至PCL1.8.1\3rdParty下,并清空或备份该路径下VTK文件。
(2)在vtk-v-8.00下新建build文件,打开CMake,参考如下方式添加路径。
(3)点击Add Entry,添加CMAKE_DEBUG_POSTFIX,目的是区分Debug和Release类型为“STRING”,其值设置为"-gd"。
(4)点击configure,选择VS 2015 Win64。如果只有VS 2015,建议安装更低版本的CMake重试一下。
(5)点击configure,得到结果后
勾选“BUILD_SHARED_LIBS”和“VTK_GROUP_QT”
去掉BUILD_EXAMPLES和BUILD_TEST
VTK_RENDERING_BACKEND选为OpenGL
将“CMAKE_INSTALL_PREFIX”设置为之前我们清空后的VTK目录
(6)点击configure,出现错误,将VTK_QT_VERSION设为5
点击configure,如果还报错,没有红色警告,仔细检查,发现VTK_QT_VERSION还是4,将其改为5
点击configure。
如果继续报错将Qt5_Core_DIR修改为下图所示
继续configure。
(7)没有错误后,点击gnenrate,CMake编译完毕
使用VS编译Cmake编译后的VTK。
3.VS编译CMake编译后的vtk
(1)用管理员身份运行VS2015,打开vtk-v8.0.0->build文件下的VTK.sln文件
(2)在这里我们只生成vtk的Release版本,将解决方案配置为Release X64
(3)右击ALL_BUILD,重新生成,大概需要等30分钟
右击INSTALL,生成,大概需要等5分钟
生成之后便可以看到PCL1.8.1\3rdParty\VTK文件夹下出现了以下目录
将PCL1.8.1\3rdParty\VTK\plugins\designer里的QVTkWidgetPlugin.dll放到然后将QVTKWidgetPlugin.dll放到Qt5.11.2\msvc2015_64\plugins\designer中,单独运行Qt Designer,可以看见QtVTKWidget控件:
4.VS配合QVTKWidget显示点云数据
1.新建一个Qt GUI Application
双击.ui文件进入Qt Designer,将QVTKWidget空间拖至中间,并建立菜单,如图所示:
2.依次点击【项目】、【属性】
在【VC++】的包含目录中,按以下方式添加:
在库目录中,按以下方式添加
点击【链接器】、【输入】,在附加依赖项中添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | pcl_tracking_release.lib pcl_stereo_release.lib pcl_people_release.lib pcl_surface_release.lib pcl_segmentation_release.lib pcl_outofcore_release.lib pcl_keypoints_release.lib pcl_recognition_release.lib pcl_visualization_release.lib pcl_ml_release.lib pcl_registration_release.lib pcl_features_release.lib pcl_io_release.lib pcl_io_ply_release.lib pcl_filters_release.lib pcl_search_release.lib pcl_sample_consensus_release.lib pcl_octree_release.lib pcl_kdtree_release.lib pcl_common_release.lib libboost_atomic-vc140-mt-1_64.lib libboost_atomic-vc140-mt-gd-1_64.lib libboost_bzip2-vc140-mt-1_64.lib libboost_bzip2-vc140-mt-gd-1_64.lib libboost_chrono-vc140-mt-1_64.lib libboost_chrono-vc140-mt-gd-1_64.lib libboost_container-vc140-mt-1_64.lib libboost_container-vc140-mt-gd-1_64.lib libboost_context-vc140-mt-1_64.lib libboost_context-vc140-mt-gd-1_64.lib libboost_coroutine-vc140-mt-1_64.lib libboost_coroutine-vc140-mt-gd-1_64.lib libboost_date_time-vc140-mt-1_64.lib libboost_date_time-vc140-mt-gd-1_64.lib libboost_exception-vc140-mt-1_64.lib libboost_exception-vc140-mt-gd-1_64.lib libboost_fiber-vc140-mt-1_64.lib libboost_fiber-vc140-mt-gd-1_64.lib libboost_filesystem-vc140-mt-1_64.lib libboost_filesystem-vc140-mt-gd-1_64.lib libboost_graph_parallel-vc140-mt-1_64.lib libboost_graph_parallel-vc140-mt-gd-1_64.lib libboost_graph-vc140-mt-1_64.lib libboost_graph-vc140-mt-gd-1_64.lib libboost_iostreams-vc140-mt-1_64.lib libboost_iostreams-vc140-mt-gd-1_64.lib libboost_locale-vc140-mt-1_64.lib libboost_locale-vc140-mt-gd-1_64.lib libboost_log_setup-vc140-mt-1_64.lib libboost_log_setup-vc140-mt-gd-1_64.lib libboost_log-vc140-mt-1_64.lib libboost_log-vc140-mt-gd-1_64.lib libboost_math_c99f-vc140-mt-1_64.lib libboost_math_c99f-vc140-mt-gd-1_64.lib libboost_math_c99l-vc140-mt-1_64.lib libboost_math_c99l-vc140-mt-gd-1_64.lib libboost_math_c99-vc140-mt-1_64.lib libboost_math_c99-vc140-mt-gd-1_64.lib libboost_math_tr1f-vc140-mt-1_64.lib libboost_math_tr1f-vc140-mt-gd-1_64.lib libboost_math_tr1l-vc140-mt-1_64.lib libboost_math_tr1l-vc140-mt-gd-1_64.lib libboost_math_tr1-vc140-mt-1_64.lib libboost_math_tr1-vc140-mt-gd-1_64.lib libboost_mpi-vc140-mt-1_64.lib libboost_mpi-vc140-mt-gd-1_64.lib libboost_numpy3-vc140-mt-1_64.lib libboost_numpy3-vc140-mt-gd-1_64.lib libboost_numpy-vc140-mt-1_64.lib libboost_numpy-vc140-mt-gd-1_64.lib libboost_prg_exec_monitor-vc140-mt-1_64.lib libboost_prg_exec_monitor-vc140-mt-gd-1_64.lib libboost_program_options-vc140-mt-1_64.lib libboost_program_options-vc140-mt-gd-1_64.lib libboost_python3-vc140-mt-1_64.lib libboost_python3-vc140-mt-gd-1_64.lib libboost_python-vc140-mt-1_64.lib libboost_python-vc140-mt-gd-1_64.lib libboost_random-vc140-mt-1_64.lib libboost_random-vc140-mt-gd-1_64.lib libboost_regex-vc140-mt-1_64.lib libboost_regex-vc140-mt-gd-1_64.lib libboost_serialization-vc140-mt-1_64.lib libboost_serialization-vc140-mt-gd-1_64.lib libboost_signals-vc140-mt-1_64.lib libboost_signals-vc140-mt-gd-1_64.lib libboost_system-vc140-mt-1_64.lib libboost_system-vc140-mt-gd-1_64.lib libboost_test_exec_monitor-vc140-mt-1_64.lib libboost_test_exec_monitor-vc140-mt-gd-1_64.lib libboost_thread-vc140-mt-1_64.lib libboost_thread-vc140-mt-gd-1_64.lib libboost_timer-vc140-mt-1_64.lib libboost_timer-vc140-mt-gd-1_64.lib libboost_type_erasure-vc140-mt-1_64.lib libboost_type_erasure-vc140-mt-gd-1_64.lib libboost_unit_test_framework-vc140-mt-1_64.lib libboost_unit_test_framework-vc140-mt-gd-1_64.lib libboost_wave-vc140-mt-1_64.lib libboost_wave-vc140-mt-gd-1_64.lib libboost_wserialization-vc140-mt-1_64.lib libboost_wserialization-vc140-mt-gd-1_64.lib libboost_zlib-vc140-mt-1_64.lib libboost_zlib-vc140-mt-gd-1_64.lib flann.lib flann_cpp.lib flann_cpp_s.lib flann_cpp_s-gd.lib flann_cpp-gd.lib flann_s.lib flann_s-gd.lib flann-gd.lib qhull.lib qhull_d.lib qhull_p.lib qhull_p_d.lib qhull_r.lib qhull_r_d.lib qhullcpp.lib qhullcpp_d.lib qhullstatic.lib qhullstatic_d.lib qhullstatic_r.lib qhullstatic_r_d.lib vtkalglib-8.0.lib vtkChartsCore-8.0.lib vtkCommonColor-8.0.lib vtkCommonComputationalGeometry-8.0.lib vtkCommonCore-8.0.lib vtkCommonDataModel-8.0.lib vtkCommonExecutionModel-8.0.lib vtkCommonMath-8.0.lib vtkCommonMisc-8.0.lib vtkCommonSystem-8.0.lib vtkCommonTransforms-8.0.lib vtkDICOMParser-8.0.lib vtkDomainsChemistry-8.0.lib vtkexoIIc-8.0.lib vtkexpat-8.0.lib vtkFiltersAMR-8.0.lib vtkFiltersCore-8.0.lib vtkFiltersExtraction-8.0.lib vtkFiltersFlowPaths-8.0.lib vtkFiltersGeneral-8.0.lib vtkFiltersGeneric-8.0.lib vtkFiltersGeometry-8.0.lib vtkFiltersHybrid-8.0.lib vtkFiltersHyperTree-8.0.lib vtkFiltersImaging-8.0.lib vtkFiltersModeling-8.0.lib vtkFiltersParallel-8.0.lib vtkFiltersParallelImaging-8.0.lib vtkFiltersPoints-8.0.lib vtkFiltersProgrammable-8.0.lib vtkFiltersSelection-8.0.lib vtkFiltersSMP-8.0.lib vtkFiltersSources-8.0.lib vtkFiltersStatistics-8.0.lib vtkFiltersTexture-8.0.lib vtkFiltersTopology-8.0.lib vtkFiltersVerdict-8.0.lib vtkfreetype-8.0.lib vtkGeovisCore-8.0.lib vtkgl2ps-8.0.lib vtkGUISupportQt-8.0.lib vtkGUISupportQtOpenGL-8.0.lib vtkGUISupportQtSQL-8.0.lib vtkhdf5_hl-8.0.lib vtkhdf5-8.0.lib vtkImagingColor-8.0.lib vtkImagingCore-8.0.lib vtkImagingFourier-8.0.lib vtkImagingGeneral-8.0.lib vtkImagingHybrid-8.0.lib vtkImagingMath-8.0.lib vtkImagingMorphological-8.0.lib vtkImagingSources-8.0.lib vtkImagingStatistics-8.0.lib vtkImagingStencil-8.0.lib vtkInfovisCore-8.0.lib vtkInfovisLayout-8.0.lib vtkInteractionImage-8.0.lib vtkInteractionStyle-8.0.lib vtkInteractionWidgets-8.0.lib vtkIOAMR-8.0.lib vtkIOCore-8.0.lib vtkIOEnSight-8.0.lib vtkIOExodus-8.0.lib vtkIOExport-8.0.lib vtkIOExportOpenGL-8.0.lib vtkIOGeometry-8.0.lib vtkIOImage-8.0.lib vtkIOImport-8.0.lib vtkIOInfovis-8.0.lib vtkIOLegacy-8.0.lib vtkIOLSDyna-8.0.lib vtkIOMINC-8.0.lib vtkIOMovie-8.0.lib vtkIONetCDF-8.0.lib vtkIOParallel-8.0.lib vtkIOParallelXML-8.0.lib vtkIOPLY-8.0.lib vtkIOSQL-8.0.lib vtkIOTecplotTable-8.0.lib vtkIOVideo-8.0.lib vtkIOXML-8.0.lib vtkIOXMLParser-8.0.lib vtkjpeg-8.0.lib vtkjsoncpp-8.0.lib vtklibharu-8.0.lib vtklibxml2-8.0.lib vtklz4-8.0.lib vtkmetaio-8.0.lib vtknetcdf_c++.lib vtkNetCDF-8.0.lib vtkoggtheora-8.0.lib vtkParallelCore-8.0.lib vtkpng-8.0.lib vtkproj4-8.0.lib vtkRenderingAnnotation-8.0.lib vtkRenderingContext2D-8.0.lib vtkRenderingContextOpenGL-8.0.lib vtkRenderingCore-8.0.lib vtkRenderingFreeType-8.0.lib vtkRenderingGL2PS-8.0.lib vtkRenderingImage-8.0.lib vtkRenderingLabel-8.0.lib vtkRenderingLIC-8.0.lib vtkRenderingLOD-8.0.lib vtkRenderingOpenGL-8.0.lib vtkRenderingQt-8.0.lib vtkRenderingVolume-8.0.lib vtkRenderingVolumeOpenGL-8.0.lib vtksqlite-8.0.lib vtksys-8.0.lib vtktiff-8.0.lib vtkverdict-8.0.lib vtkViewsContext2D-8.0.lib vtkViewsCore-8.0.lib vtkViewsInfovis-8.0.lib vtkViewsQt-8.0.lib vtkzlib-8.0.lib |
有可能运行时会出现如下错误:
点击【链接器】、【输入】,在附加依赖项中添加
DEBUG:
1 2 3 4 5 6 7 8 9 | vtkGUISupportQtOpenGL-8.0-gd.lib vtkGUISupportQtSQL-8.0-gd.lib vtkGUISupportQt-8.0-gd.lib vtkRenderingGL2PS-8.0-gd.lib vtkViewsQt-8.0-gd.lib vtkRenderingVolumeOpenGL-8.0-gd.lib vtkRenderingQt-8.0-gd.lib vtkRenderingOpenGL-8.0-gd.lib vtkRenderingLIC-8.0-gd.lib |
RELEASE:
1 2 3 4 5 6 7 8 9 | vtkGUISupportQtOpenGL-8.0.lib vtkGUISupportQtSQL-8.0.lib vtkGUISupportQt-8.0.lib vtkRenderingGL2PS-8.0.lib vtkViewsQt-8.0.lib vtkRenderingVolumeOpenGL-8.0.lib vtkRenderingQt-8.0.lib vtkRenderingOpenGL-8.0.lib vtkRenderingLIC-8.0.lib |
程序编写
QtPcl.h`
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #pragma once #include <QtWidgets/QMainWindow> #include "ui_QtPcl.h" #ifndef INITIAL_OPENGL #define INITIAL_OPENGL #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) VTK_MODULE_INIT(vtkInteractionStyle) #endif #include <QFileDialog> #include <vtkRenderWindow.h> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/visualization/pcl_visualizer.h> class QtPcl : public QMainWindow { Q_OBJECT public: QtPcl(QWidget *parent = Q_NULLPTR); private: Ui::QtPclClass ui; pcl::PointCloud<pcl::PointXYZ>::Ptr cloud; boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer; void initialVtkWidget(); private slots : void onOpen(); }; |
QtPcl.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include "QtPcl.h" QtPcl::QtPcl(QWidget *parent) :QMainWindow(parent) { ui.setupUi(this); initialVtkWidget(); connect(ui.actionOpen,SIGNAL(triggered()), this, SLOT(onOpen())); } void QtPcl::initialVtkWidget() { cloud.reset(new pcl::PointCloud<pcl::PointXYZ>); viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false)); viewer->addPointCloud(cloud,"cloud"); ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow()); viewer->setupInteractor(ui.qvtkWidget->GetInteractor(),ui.qvtkWidget->GetRenderWindow()); ui.qvtkWidget->update(); } void QtPcl::onOpen() { QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)"); if (!fileName.isEmpty()){ std::string file_name = fileName.toStdString(); pcl::PCLPointCloud2 cloud2; Eigen::Vector4f origin; Eigen::Quaternionf orientation; int pcd_version; int data_type; unsigned int data_idx; int offset = 0; pcl::PCDReader rd; rd.readHeader(file_name,cloud2, origin, orientation, pcd_version, data_type, data_idx); if (data_type == 0) { pcl::io::loadPCDFile(fileName.toStdString(),*cloud); } else if (data_type == 2) { pcl::PCDReader reader; reader.read<pcl::PointXYZ>(fileName.toStdString(),*cloud); } viewer->updatePointCloud(cloud,"cloud"); viewer->resetCamera(); ui.qvtkWidget->update(); } } |