Qt+PCL+VS实现点云Gui界面显示


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();
    }
}