前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >win下使用QT添加VTK插件实现点云可视化GUI

win下使用QT添加VTK插件实现点云可视化GUI

作者头像
点云PCL博主
发布2020-04-10 15:25:16
7.1K0
发布2020-04-10 15:25:16
举报
文章被收录于专栏:点云PCL点云PCL

大家在做点云的时候经常会用到QT,但是我们需要使用QT做点云的可视化的时候又需要VTK,虽然我们在windows下安装PCL的时候就已经安装了VTK,由于跟着PCL安装的VTK是没有和QT联合编译的,所以在使用PCL和QT做点云可视化界面的时候是无法使用可是QT的插件QVTKWidget,本文将主要讲解一些PCL在Ubuntu系统和windows使用QT做界面的一些分享。

ubuntu 中使用QT和PCL

(1)如果是Ubuntu14.04,无论是使用命令行安装PCL或者是QT,系统都已经将QVTKWidget的库安装好了,在使用QT时会自动的加载了QVTKWideget,并且使用我的例子正常cmake就可以实现QT与点云的相关功能,有兴趣的可以查阅我们公众号的github地址,当然在PCL的官方的源码中也是有一些基本的例子,以我的经验来说,在ubuntu14.04上使用应该是没有什么问题。

(2)如果你安装的是ubuntu16.04那么就可能比较麻烦,因为在使用的时候发现PCL中的QT的依赖工程并没有改变,并且ubuntu16.04会默认安装qt5,这就导致一些依赖项的冲突,甚至如果安装了ROS包,也会出现一些问题,主要是PCL中的例子中都是依赖的QT4,而Ubuntu16.04的一些库都是默认安装QT5,所以会导致你编译不过,所以有问题的可以欢迎讨论。

我们知道在ubuntu系统下学习和使用PCL是十分方便的,并且安装任何第三方库都十分的便捷,这里就不再过多的说明。

windows 中使用QT和PCL

在windows上使用PCL实现QT设计点云的可视化界面,这就又涉及到了工程软件的问题,我相信大多数人都是使用VS,所以我的电脑安装了VS3013 和VS2015,这里主要是使用VS2015 编译实现点云PCL的开发在VS下的GUI的开发。如果你真的需要使用在VS下的界面设计点云的可视化的界面,那么你可以安装以下的步骤试试,但是不能保证一定可以编译通过,但是即便你编译不过,只要你安装了VS2015,并且你编译的程序是X64 release那么就可以直接使用我编译好的VTK的库,直接使用,方便又省心。并在最后我将做一个简单的demo用于大家的测试。

安装和编译的步骤

首先下载安装PCL1.8windows的版本正常安装,因为我们只需要替换掉第三方库的VTK的部分,其他部分的库原封不动。

PCL1.8.1依赖的第三方库是VTK8.0,所以我们下载一个VTK的源码,使用cmake进行编译,接下来就是一步一步来,当然比可以跳过,直接去下载我编译好的QVTK的库

首先我们需要安装了Qt5.8,这个很简单直接去Qt官网搜索下载下来,一路安装完成即可,这里没什么需要值得注意的地方,接下来就是要使用cmake编译VTK。

(1)启动CMake,指定源码目录和编译目录,点击Configure。

(2)VS 的版本一定是你安装的版本指定,我选择的是:Visual Studio 14 2015 Win64。点击finish就,等待配置完成。会自动进行第一次的cmake.

(3)在第一次configure之后需要更新一下设置,首先点击一下advanced,然后我们找到会找到以下几个选项进行修改

该选择为为VTK设置Qt的版本,这里需要选择你已经安装好的qt 的位置,主要是qmake.exe和Qtcmake.config这两个路径指定成功即可

如果出现错误,就需要你正常设置,这里其实主要就是QT的qmake以及qtcmake.config这两个地方,如果提示DONXYGEN找不到,那么就将build_decument整个选项去掉。总之就是要配置好QT的路径就可以了,如果你不知道如何在win对VTK进行cmake的编译,没关系,如果你也使用了Qt5.8并且使用VS2013,PCL的版本是1.8.1版本,那么就直接下载我已经编译好的VTK X64的库既可以了。

在cmake之后我们就可以生成了对应的VS工程文件

(5)Generate工程

配置成功后,出现Configure done提示。点击Generate生成工程。

(6)启动VS2015开始编译

出现Generating done提示表示VS2015工程已经生成成功。点击Open Project,VS2015会启动,并打开工程。

即便你没有编译成功,也没有关系,这里我已经将编译好的VTK打包https://download.csdn.net/download/u013019296/12093433(这里的下载积分不是我能决定的)

下载对应的VTK即可,前提是你也要保证你使用的是VS2015,QT 5.8,PCL1.8.1,在下载了我编译好的依赖项之后,只需要安装包复制在我们安装的PCL1.8.1的thirdtarty,后面的程序中设置好路径一般都是没问题

(7)将3rdParty\QVTK\plugins\designer下的QVTKWidgetPlugin.dll拷贝到QT\5.8\msvc2015_64\plugins\designer下,这样Qt里面就有了QVtk的控件了。这一步将会让你在打开QT_creator的界面的时候会看见

这里多了一个控件,整个时候就说明你已经安装成功了,安装成功要如果使用,也比较难以一次搞定。下面就是要设置VS的环境

以上就是将VTK的插件正确的放在了QT的第三方库中,但是我们在使用配置环境的时候,总是会出现一些小问题,比如我们在上述的编译的时候忘了设置为X64 release模式,等等

配置环境

如果一切准备工作都结束了,接下来我们为了测试一些我们新建一个工程,配置一下路径,用来测试一下我们库安装是否有问题

(1)在VS2015中下载VS2015_QT的插件,选择“扩展与更新”

(2)选择网络搜索输入关键字“qt”下载第一个安装即可。

(3)下载完成后重启VS2015,你会发现”Qt VS Tool“这个选项,设置qmake所在路径,在“QT option”中设置好qmake所在路径即可

(4)此时我们就已经将所有的准备工作完成,可以新建一个QT的项目。此时比较头疼的就是设置各种路径的问题了:这里因为每个人的安装路径不一样,但是如果你熟练的使用VS,就知道VS中的环境设置其实就只有三个主要的关键地方 include lib所在的路径以及我们需要使用的lib列表,这里给出了我新建工程的设置文件的截图,希望对你有所启发。

lib路径的列表:

最后是我们要输入lib的列表,整个lib 因为我也不知道暂时会使用到哪一个,所以一般我是将所有的lib都作为输入

代码语言:javascript
复制
qtmain.lib
Qt5Core.lib
Qt5Gui.lib
Qt5Widgets.lib
pcl_common_release.lib
pcl_features_release.lib
pcl_filters_release.lib
pcl_io_release.lib
pcl_io_ply_release.lib
pcl_kdtree_release.lib
pcl_keypoints_release.lib
pcl_ml_release.lib
pcl_octree_release.lib
pcl_outofcore_release.lib
pcl_people_release.lib
pcl_recognition_release.lib
pcl_registration_release.lib
pcl_sample_consensus_release.lib
pcl_search_release.lib
pcl_segmentation_release.lib
pcl_stereo_release.lib
pcl_surface_release.lib
pcl_tracking_release.lib
pcl_visualization_release.lib
flann_cpp_s.lib
flann_s.lib
flann.lib
libboost_atomic-vc140-mt-1_64.lib
libboost_chrono-vc140-mt-1_64.lib
libboost_container-vc140-mt-1_64.lib
libboost_context-vc140-mt-1_64.lib
libboost_coroutine-vc140-mt-1_64.lib
libboost_date_time-vc140-mt-1_64.lib
libboost_exception-vc140-mt-1_64.lib
libboost_filesystem-vc140-mt-1_64.lib
libboost_graph-vc140-mt-1_64.lib
libboost_iostreams-vc140-mt-1_64.lib
libboost_locale-vc140-mt-1_64.lib
libboost_log-vc140-mt-1_64.lib
libboost_log_setup-vc140-mt-1_64.lib
libboost_math_c99-vc140-mt-1_64.lib
libboost_math_c99f-vc140-mt-1_64.lib
libboost_math_c99l-vc140-mt-1_64.lib
libboost_math_tr1-vc140-mt-1_64.lib
libboost_math_tr1f-vc140-mt-1_64.lib
libboost_math_tr1l-vc140-mt-1_64.lib
libboost_mpi-vc140-mt-1_64.lib
libboost_prg_exec_monitor-vc140-mt-1_64.lib
libboost_program_options-vc140-mt-1_64.lib
libboost_random-vc140-mt-1_64.lib
libboost_regex-vc140-mt-1_64.lib
libboost_serialization-vc140-mt-1_64.lib
libboost_signals-vc140-mt-1_64.lib
libboost_system-vc140-mt-1_64.lib
libboost_test_exec_monitor-vc140-mt-1_64.lib
libboost_thread-vc140-mt-1_64.lib
libboost_timer-vc140-mt-1_64.lib
libboost_unit_test_framework-vc140-mt-1_64.lib
libboost_wave-vc140-mt-1_64.lib
libboost_wserialization-vc140-mt-1_64.lib
qhullstatic.lib
qhull.lib
qhull_p.lib
qhull_r.lib
qhullcpp.lib
qhullstatic_r.lib
libEGL.lib
QVTKWidgetPlugin.lib
QVTKWidgetPlugin.lib
vtkInteractionWidgets-8.0.lib
vtkalglib-8.0.lib
vtkIOAMR-8.0.lib
vtkChartsCore-8.0.lib
vtkIOCore-8.0.lib
vtkCommonColor-8.0.lib
vtkIOEnSight-8.0.lib
vtkCommonComputationalGeometry-8.0.lib
vtkIOExodus-8.0.lib
vtkCommonCore-8.0.lib
vtkIOExport-8.0.lib
vtkCommonDataModel-8.0.lib
vtkIOExportOpenGL2-8.0.lib
vtkCommonExecutionModel-8.0.lib
vtkIOGeometry-8.0.lib
vtkCommonMath-8.0.lib
vtkIOImage-8.0.lib
vtkCommonMisc-8.0.lib
vtkIOImport-8.0.lib
vtkCommonSystem-8.0.lib
vtkIOInfovis-8.0.lib
vtkCommonTransforms-8.0.lib
vtkIOLegacy-8.0.lib
vtkDICOMParser-8.0.lib
vtkIOLSDyna-8.0.lib
vtkDomainsChemistry-8.0.lib
vtkIOMINC-8.0.lib
vtkDomainsChemistryOpenGL2-8.0.lib
vtkIOMovie-8.0.lib
vtkexoIIc-8.0.lib
vtkIONetCDF-8.0.lib
vtkexpat-8.0.lib
vtkIOParallel-8.0.lib
vtkFiltersAMR-8.0.lib
vtkIOParallelXML-8.0.lib
vtkFiltersCore-8.0.lib
vtkIOPLY-8.0.lib
vtkFiltersExtraction-8.0.lib
vtkIOSQL-8.0.lib
vtkFiltersFlowPaths-8.0.lib
vtkIOTecplotTable-8.0.lib
vtkFiltersGeneral-8.0.lib
vtkIOVideo-8.0.lib
vtkFiltersGeneric-8.0.lib
vtkIOXML-8.0.lib
vtkFiltersGeometry-8.0.lib
vtkIOXMLParser-8.0.lib
vtkFiltersHybrid-8.0.lib
vtkjpeg-8.0.lib
vtkFiltersHyperTree-8.0.lib
vtkjsoncpp-8.0.lib
vtkFiltersImaging-8.0.lib
vtklibharu-8.0.lib
vtkFiltersModeling-8.0.lib
vtklibxml2-8.0.lib
vtkFiltersParallel-8.0.lib
vtklz4-8.0.lib
vtkFiltersParallelImaging-8.0.lib
vtkmetaio-8.0.lib
vtkFiltersPoints-8.0.lib
vtknetcdf_c++.lib
vtkFiltersProgrammable-8.0.lib
vtkNetCDF-8.0.lib
vtkFiltersSelection-8.0.lib
vtkoggtheora-8.0.lib
vtkFiltersSMP-8.0.lib
vtkParallelCore-8.0.lib
vtkFiltersSources-8.0.lib
vtkpng-8.0.lib
vtkFiltersStatistics-8.0.lib
vtkproj4-8.0.lib
vtkFiltersTexture-8.0.lib
vtkRenderingAnnotation-8.0.lib
vtkFiltersTopology-8.0.lib
vtkRenderingContext2D-8.0.lib
vtkFiltersVerdict-8.0.lib
vtkRenderingContextOpenGL2-8.0.lib
vtkfreetype-8.0.lib
vtkRenderingCore-8.0.lib
vtkGeovisCore-8.0.lib
vtkRenderingFreeType-8.0.lib
vtkgl2ps-8.0.lib
vtkRenderingGL2PSOpenGL2-8.0.lib
vtkglew-8.0.lib
vtkRenderingImage-8.0.lib
vtkGUISupportQt-8.0.lib
vtkRenderingLabel-8.0.lib
vtkGUISupportQtSQL-8.0.lib
vtkRenderingLOD-8.0.lib
vtkhdf5_hl-8.0.lib
vtkRenderingOpenGL2-8.0.lib
vtkhdf5-8.0.lib
vtkRenderingQt-8.0.lib
vtkImagingColor-8.0.lib
vtkRenderingVolume-8.0.lib
vtkImagingCore-8.0.lib
vtkRenderingVolumeOpenGL2-8.0.lib
vtkImagingFourier-8.0.lib
vtksqlite-8.0.lib
vtkImagingGeneral-8.0.lib
vtksys-8.0.lib
vtkImagingHybrid-8.0.lib
vtkTestingGenericBridge-8.0.lib
vtkImagingMath-8.0.lib
vtkTestingIOSQL-8.0.lib
vtkImagingMorphological-8.0.lib
vtkTestingRendering-8.0.lib
vtkImagingSources-8.0.lib
vtktiff-8.0.lib
vtkImagingStatistics-8.0.lib
vtkverdict-8.0.lib
vtkImagingStencil-8.0.lib
vtkViewsContext2D-8.0.lib
vtkInfovisCore-8.0.lib
vtkViewsCore-8.0.lib
vtkInfovisLayout-8.0.lib
vtkViewsInfovis-8.0.lib
vtkInteractionImage-8.0.lib
vtkViewsQt-8.0.lib
vtkInteractionStyle-8.0.lib
vtkzlib-8.0.lib

这里比较多,就没有都列举出来

这里我们先试用一个VTK的程序测试一下我们的环境是否正常的配置成功。

代码语言:javascript
复制
#include <vtkVersion.h>
#include <vtkPlaneSource.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
int main(int, char *[])
{
       // Create a plane
       vtkSmartPointer<vtkPlaneSource> planeSource =
              vtkSmartPointer<vtkPlaneSource>::New();
       planeSource->SetCenter(1.0, 0.0, 0.0);
       planeSource->SetNormal(1.0, 0.0, 1.0);
       planeSource->Update();
       vtkPolyData* plane = planeSource->GetOutput();
       // Create a mapper and actor
       vtkSmartPointer<vtkPolyDataMapper> mapper =
              vtkSmartPointer<vtkPolyDataMapper>::New();
#if VTK_MAJOR_VERSION <= 5
       mapper->SetInput(plane);
#else
       mapper->SetInputData(plane);
#endif
       vtkSmartPointer<vtkActor> actor =
              vtkSmartPointer<vtkActor>::New();
       actor->SetMapper(mapper);
       // Create a renderer, render window and interactor
       vtkSmartPointer<vtkRenderer> renderer =
              vtkSmartPointer<vtkRenderer>::New();
       vtkSmartPointer<vtkRenderWindow> renderWindow =
              vtkSmartPointer<vtkRenderWindow>::New();
       renderWindow->AddRenderer(renderer);
       vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
              vtkSmartPointer<vtkRenderWindowInteractor>::New();
       renderWindowInteractor->SetRenderWindow(renderWindow);
       // Add the actors to the scene
       renderer->AddActor(actor);
       renderer->SetBackground(.1, .2, .3); // Background color dark blue
                                                                      // Render  and interact
       renderWindow->Render();
       renderWindowInteractor->Start();
       return EXIT_SUCCESS;
}

一般是是没有问题的,有问题的那么就是在启动VTK的界面的时候,提示你初始化错误。

这个问题在之前的博客中是有记录过的,只需要添加

#include <vtkAutoInit.h>

VTK_MODULE_INIT(vtkRenderingOpenGL2)

VTK_MODULE_INIT(vtkInteractionStyle);

VTK_MODULE_INIT(vtkRenderingFreeType);

编译成功后,在VTK中可视化了一个平面。

win 下PCL联合QT点云GUI开发

新建的VS工程中,我们打开.ui进行界面编辑,注意其实QT的使用,你可以直接使用代码进行排版,你也可以在界面的地方将你的控件排版好,然后保存,这个时候QT会帮你生成对应的代码,比如我再找个ui的界面上,放了两个按钮,一个QVTKWideget可视化的插件,一个文本浏览器,需要实现的工程是:

第一个按钮实现了打开一个PCD文件可视化在右边的插件上,并且点云是可以可以使用鼠标自由的拖动的。

第二个按钮实现了生成一个5000个点的正方体点云,并且每次点击都会改变点云颜色。

QVTKWideget需要你设置一下显示的位置,和在界面中的位置。

文本浏览器主要是说明一下程序的基本用途。如下图设计

具体的每一个控件的命名我就不在一一说明了,在我们布局排版之后,我们可以点击保存去实现每一个按钮的功能即可,这里由于篇幅有限,就不再贴出实现的代码。简单截图如下:

有兴趣的小伙伴可以下载一下程序在自己的电脑上运行,下载地址 :

https://download.csdn.net/download/u013019296/12115883

这种使用QT的GUI布局有一些局限性,就是当我们放大和缩小的时候会导致界面不够美观,所以很多人会选择使用代码来排版,但是代码排版就会让你的代码量比较多。我们尝试打开程序 如下图:

说明:

这是一个由“点云PCL”公众号发布的一个关于使用VS2015联合QT设计的一个点云可视化界面的程序,已经完成了封装的发布的一个exe,可以在win7上直接点击exe打开界面,实现了两个按钮,一个是打开一个PCD文件并且可视化,如右图上,一个按钮实现了生成一个正方体的点云,并且每一次按钮就会改变点云的颜色。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 点云PCL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档