VS2019+PCL1.12.1+Qt5.14.2编译VTK9.1(苦尽甘来系列)

花了两天时间编译VTK9.1,然后通过VS所创建的Qt项目来显示点云。

根本目的

VS创建Qt项目,在ui设计界面中添加一个widget,用于显示点云。

正文

安装PCL过程中本身也会安装VTK,但是这个VTK不是最全的,所以就需要下载VTK的源码编译后对PCL中的VTK进行补充。说到这里,有必要放一个VTK源码下载链接,点击可以选择想要的版本进行下载。
在这里插入图片描述
因为PCL1.12.1中的VTK是9.1版本,所以最好下载VTK9.1.0进行编译。

下载之后需要用CMAKE-gui,本次所用的版本是3.24.0,点击这里去官网下载CMAKE
在这里插入图片描述
编译VTK的教程很多,看的有点眼花缭乱,都尝试过。主要按照这个教程编译成功了VTK9.1。

值得注意的是,这些路径都是需要改的,默认的路径是Qt/5.14.2/mingw73_64/bin/xxx.exe,乍一看好像跟下图中的一模一样,之前一直没改,configure也能成功,后面用VS2019生成时老出错,后面发现原来mingw73_64改成msvc2017_64或者msvc2019_64,本人的是msvc2017_64,教程没问题,真的需要细心。
在这里插入图片描述
这个教程中提到,要C++桌面开发和.net SDK,MFC好像是VTK的一个依赖库。
在这里插入图片描述
如果目前VS2019中还没有安装,可以点击 工具->获取工具和功能,就会跳出Visual Studio Installer,选择单个组件就可以完成MFC和.net SDK的安装了。那到底安装哪个版本的MFC,请参考教程1教程2。

编译结束之后,一般得到一个debug版本的VTK和一个release版本的VTK。每个版本都有下图所示的4个文件夹。
在这里插入图片描述
很多教程中提到,要把编译之后得到的QVTKWidgetPlugin.dll、QVTKWidgetPlugin.exp和QVTKWidgetPlugin.lib这三个文件扔到Qt的某个文件夹中。可问题是,本人编译之后并没有得到,整个文件夹搜索也没有搜索到。后面看了很多帖子才知道,VTK9.1.0是不会产生这三个文件的,老的版本好像是可以。看此处了解详情。
在这里插入图片描述
那么得到VTK的debug和release版本后,需要用来对之前所安装的PCL1.12.1库中的VTK进行完善。这个帖子中说了要把哪些文件给提取出来。
在这里插入图片描述
这个帖子更直接,直接给出了编译好的VTK库,直接拿来替换掉PCL1.12.1中的VTK就可以了,极快。
在这里插入图片描述
真的感激,这个博主是好人。

当PCL库中的VTK被更新之后,是否可以用了呢?不是,在这一步卡了一天。也没有查到有人说的很明白。其实路径啥的都不需要再改了。但是就是会报错,报的错误是无法解析的外部命令,如下图所示。
在这里插入图片描述
后面终于发现,PCL库在没更新之前,关于VTK的外部依赖项有130个,更新之后有144项。只需要打开VS 链接器->输入->附加依赖项,将多出来的十几项加进去就好了。其实多出来的这些.lib就是我们编译VTK所需要的东西。这里直接给出来debug下这144个.lib文件名。直接覆盖掉之前那130个即可,release版本的需要把每个.lib文件名的d去掉,即XXX-9.1d.lib改成XXX-9.1.lib即可。

vtkcgns-9.1d.lib
vtkChartsCore-9.1d.lib
vtkCommonColor-9.1d.lib
vtkCommonComputationalGeometry-9.1d.lib
vtkCommonCore-9.1d.lib
vtkCommonDataModel-9.1d.lib
vtkCommonExecutionModel-9.1d.lib
vtkCommonMath-9.1d.lib
vtkCommonMisc-9.1d.lib
vtkCommonSystem-9.1d.lib
vtkCommonTransforms-9.1d.lib
vtkDICOMParser-9.1d.lib
vtkDomainsChemistry-9.1d.lib
vtkDomainsChemistryOpenGL2-9.1d.lib
vtkdoubleconversion-9.1d.lib
vtkexodusII-9.1d.lib
vtkexpat-9.1d.lib
vtkFiltersAMR-9.1d.lib
vtkFiltersCore-9.1d.lib
vtkFiltersExtraction-9.1d.lib
vtkFiltersFlowPaths-9.1d.lib
vtkFiltersGeneral-9.1d.lib
vtkFiltersGeneric-9.1d.lib
vtkFiltersGeometry-9.1d.lib
vtkFiltersHybrid-9.1d.lib
vtkFiltersHyperTree-9.1d.lib
vtkFiltersImaging-9.1d.lib
vtkFiltersModeling-9.1d.lib
vtkFiltersParallel-9.1d.lib
vtkFiltersParallelImaging-9.1d.lib
vtkFiltersPoints-9.1d.lib
vtkFiltersProgrammable-9.1d.lib
vtkFiltersSelection-9.1d.lib
vtkFiltersSMP-9.1d.lib
vtkFiltersSources-9.1d.lib
vtkFiltersStatistics-9.1d.lib
vtkFiltersTexture-9.1d.lib
vtkFiltersTopology-9.1d.lib
vtkFiltersVerdict-9.1d.lib
vtkfmt-9.1d.lib
vtkfreetype-9.1d.lib
vtkGeovisCore-9.1d.lib
vtkgl2ps-9.1d.lib
vtkglew-9.1d.lib
vtkGUISupportQt-9.1d.lib
vtkGUISupportQtQuick-9.1d.lib
vtkGUISupportQtSQL-9.1d.lib
vtkhdf5-9.1d.lib
vtkhdf5_hl-9.1d.lib
vtkImagingColor-9.1d.lib
vtkImagingCore-9.1d.lib
vtkImagingFourier-9.1d.lib
vtkImagingGeneral-9.1d.lib
vtkImagingHybrid-9.1d.lib
vtkImagingMath-9.1d.lib
vtkImagingMorphological-9.1d.lib
vtkImagingSources-9.1d.lib
vtkImagingStatistics-9.1d.lib
vtkImagingStencil-9.1d.lib
vtkInfovisCore-9.1d.lib
vtkInfovisLayout-9.1d.lib
vtkInteractionImage-9.1d.lib
vtkInteractionStyle-9.1d.lib
vtkInteractionWidgets-9.1d.lib
vtkIOAMR-9.1d.lib
vtkIOAsynchronous-9.1d.lib
vtkIOCGNSReader-9.1d.lib
vtkIOChemistry-9.1d.lib
vtkIOCityGML-9.1d.lib
vtkIOCONVERGECFD-9.1d.lib
vtkIOCore-9.1d.lib
vtkIOEnSight-9.1d.lib
vtkIOExodus-9.1d.lib
vtkIOExport-9.1d.lib
vtkIOExportGL2PS-9.1d.lib
vtkIOExportPDF-9.1d.lib
vtkIOGeometry-9.1d.lib
vtkIOHDF-9.1d.lib
vtkIOImage-9.1d.lib
vtkIOImport-9.1d.lib
vtkIOInfovis-9.1d.lib
vtkIOIOSS-9.1d.lib
vtkIOLegacy-9.1d.lib
vtkIOLSDyna-9.1d.lib
vtkIOMINC-9.1d.lib
vtkIOMotionFX-9.1d.lib
vtkIOMovie-9.1d.lib
vtkIONetCDF-9.1d.lib
vtkIOOggTheora-9.1d.lib
vtkIOParallel-9.1d.lib
vtkIOParallelXML-9.1d.lib
vtkIOPLY-9.1d.lib
vtkIOSegY-9.1d.lib
vtkIOSQL-9.1d.lib
vtkioss-9.1d.lib
vtkIOTecplotTable-9.1d.lib
vtkIOVeraOut-9.1d.lib
vtkIOVideo-9.1d.lib
vtkIOXML-9.1d.lib
vtkIOXMLParser-9.1d.lib
vtkjpeg-9.1d.lib
vtkjsoncpp-9.1d.lib
vtkkissfft-9.1d.lib
vtklibharu-9.1d.lib
vtklibproj-9.1d.lib
vtklibxml2-9.1d.lib
vtkloguru-9.1d.lib
vtklz4-9.1d.lib
vtklzma-9.1d.lib
vtkmetaio-9.1d.lib
vtknetcdf-9.1d.lib
vtkogg-9.1d.lib
vtkParallelCore-9.1d.lib
vtkParallelDIY-9.1d.lib
vtkpng-9.1d.lib
vtkpugixml-9.1d.lib
vtkRenderingAnnotation-9.1d.lib
vtkRenderingContext2D-9.1d.lib
vtkRenderingContextOpenGL2-9.1d.lib
vtkRenderingCore-9.1d.lib
vtkRenderingFreeType-9.1d.lib
vtkRenderingGL2PSOpenGL2-9.1d.lib
vtkRenderingImage-9.1d.lib
vtkRenderingLabel-9.1d.lib
vtkRenderingLOD-9.1d.lib
vtkRenderingOpenGL2-9.1d.lib
vtkRenderingQt-9.1d.lib
vtkRenderingSceneGraph-9.1d.lib
vtkRenderingUI-9.1d.lib
vtkRenderingVolume-9.1d.lib
vtkRenderingVolumeOpenGL2-9.1d.lib
vtkRenderingVtkJS-9.1d.lib
vtksqlite-9.1d.lib
vtksys-9.1d.lib
vtkTestingRendering-9.1d.lib
vtktheora-9.1d.lib
vtktiff-9.1d.lib
vtkverdict-9.1d.lib
vtkViewsContext2D-9.1d.lib
vtkViewsCore-9.1d.lib
vtkViewsInfovis-9.1d.lib
vtkViewsQt-9.1d.lib
vtkWrappingTools-9.1d.lib
vtkzlib-9.1d.lib

到此刻,便可以通过VS创建Qt项目,然后用Qt Creator添加一个widget或者openGLwidget,将其提升为QVTKOpenGLNativeWidget。如下图所示。
在这里插入图片描述
然后就可以控制widget来显示点云了。这widget也是很多帖子中所谓的qvtkwidget,不过是个对象的名称罢了。这篇帖子最后一个示例

#include <QSurfaceFormat>
#include <QVTKOpenGLNativeWidget.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkNamedColors.h>
#include <vtkProperty.h>
#include <vtkSmartPointer.h>

#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);

MyVtk::MyVtk(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MyVtk){
    
    
    ui->setupUi(this);
    
    QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());
    vtkNew<vtkNamedColors> colors;
    vtkNew<vtkSphereSource> sphereSource;
    vtkNew<vtkPolyDataMapper> sphereMapper;
    sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
    vtkNew<vtkActor> sphereActor;
    sphereActor->SetMapper(sphereMapper);
    sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());
    vtkNew<vtkRenderer> renderer;
    renderer->AddActor(sphereActor);
    renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());
    vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
    renderWindow->AddRenderer(renderer);
    renderWindow->SetWindowName("RenderWindowNoUIFile");
    setCentralWidget(ui->vtkRenderWidget);
    ui->vtkRenderWidget->setRenderWindow(renderWindow);
}

跑出来效果也是一样的,至此结束。
在这里插入图片描述
配置过程太费劲了,终于搞定了,可以开始学习如何使用VTK了~

参考:
参考教程
参考教程2
参考教程3

猜你喜欢

转载自blog.csdn.net/dyk4ever/article/details/126629052