19年12月 因为客户电脑可能是32位,我们执着于编译windows32位的程序,msvc2015配套的相关库比较成熟。所有msvc32位算是目前的一个标准。
当我们使用QT为PCL项目制作UI的时候,需要让QT能够支持"QVTKWidget"。而这个"QVTKWidget"是VTK编译时添加了QT组件时,才会生成的。
PCL-1.8.1-AllInOne-msvc2015-win32.exe 下载链接 https://download.csdn.net/download/u012990344/12017364
一般个人习惯把第三方库放到"F:/extern/"下
选择好目录,期间会弹出OpenNI2的安装弹窗 我选择F:\extern目录下
(它会自动变成F:\extern\PCL 1.8.1\3rdParty)
大部分"PCL-All-in-One"安装包里的VTK是没有编译QT的。
这篇博客旨在描述,编译VTK时,如何添加QT组件。
Cmake编译过程:
下载VTK源码,https://gitlab.kitware.com/vtk/vtk/tree/v8.0.0.rc
国外资源下载慢,特别是公司内网,急用淘宝代下的,以下是CSDN链接 https://download.csdn.net/download/u012990344/12017328
然后建立3个文件夹,分别命名为:
VTK_Src:将VTK的源码存放在此处,作为cmake的代码源路径
VTK_Build:cmake创建工程的,目标路径
VTK_Install:安装版本的,发布路径
然后打开Cmake,进行编译:
设置源路径及目标路径
选择编译器
初次配置,点击"Configuration"
点击Add Entry,添加CMAKE_PREFIX_PATH,设置为QT的安装路径。
点击Add Entry,添加CMAKE_DEBUG_POSTFIX,设置为"-gd"。
点击Add Entry,CMAKE_RELEASE_POSTFIX,设置为"-gr"。
用来区分debug与release版本下的dll和lib文件,不然的话创建安装文件的时候debug与release版本,名字相同相互覆盖。
勾选BUILD_SHARED_LIBIRARES及VTK_GROUP_QT
将CMAKE_INSTALL_PREFIX设置为VTK_Install的路径。默认的路径在C盘的Programfiles里面,需要管理员权限才能在默认路径下发布。
再次配置,点击"Configuration"
将"VTK_QT_VESION"改为5,如果没有cmake没有找到QT5的路径,再次设置。
OPENGL_gl_LIBRARY opengl //若没发现,可以不用管
OPENGL_glu_LIBRARY glu32 //若没发现,可以不用管
VTK_Group_Qt ☑ (check)
VTK_RENDERING_BACKEND OpenGL(注意选择的是OPENGL 还是OPENGL2 对应后面写代码的时候注意初始化哪个)
再次配置,点击"Configuration"
完成配置"Configuration Done"
点击生成"Generate"
完成生成"Generate Done"
创建安装文件:
打开VTK_Build路径下的 VTK.sln
在debug_x64下ALL_Build,然后only build "Install"
在release_x64下ALL_Build,然后only build "Install"
至此,在"…\VTK_Install\ plugins\designer"的路径下,就可以发现"QVTKWidgetPlugin.dll"了。
将此"QVTKWidgetPlugin.dll"(必须是release版的),添加到你的QT的designer的路径下,"C:\Qt\Qt5.6.2\5.6\msvc2015_64\plugins\designer"。
但是,在我的实际运用中QT自带的Designer打开不*.ui的文件,平且自带的qtCreator是32位的,解析不出这个64位的"QVTKWidgetPlugin.dll"控件。所以,从官网上又下载了64位的qtCreator。
最后顺利在QT的UI设计界面上,添加了QVTKWidget。
https://github.com/PointCloudLibrary/pcl/tree/master/doc/tutorials/content/sources/qt_visualizer
将 /tree/master/ 换成 /trunk/ .
svn checkout
https://github.com/PointCloudLibrary/pcl/trunk/doc/tutorials/content/sources/qt_visualizer
上面想用cmake编译,我想直接用qmake 所以我就改了一下。
(pro文件中,链接库有空格的话,自动识别不了,后来发现带空格的链接库可以加引号解决。就加了引号)
pcl_visualizer.pro
#-------------------------------------------------
#
# Project created by QtCreator 2014-05-01T14:24:33
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = pcl_visualizer
TEMPLATE = app
INCLUDEPATH += "F:/extern/PCL 1.8.1/include/pcl-1.8"
INCLUDEPATH += "F:/extern/PCL 1.8.1/3rdParty/Boost/include/boost-1_64"
INCLUDEPATH += "F:/extern/PCL 1.8.1/3rdParty/Eigen/eigen3"
INCLUDEPATH += "F:/extern/PCL 1.8.1/3rdParty/FLANN/include"
INCLUDEPATH += "F:/extern/PCL 1.8.1/3rdParty/OpenNI2/Include"
INCLUDEPATH += "F:/extern/PCL 1.8.1/3rdParty/Qhull/include"
INCLUDEPATH += "F:/extern/PCL 1.8.1/3rdParty/VTK/include/vtk-8.0"
LIBS += "C:/Program Files (x86)/Windows Kits/10/Lib/10.0.10586.0/um/x86/User32.lib"
LIBS += "C:/Program Files (x86)/Windows Kits/10/Lib/10.0.10586.0/um/x86/gdi32.lib"
CONFIG(debug, debug|release) {
LIBS += "F:/extern/PCL 1.8.1/lib/*debug.lib"
LIBS += "F:/extern/PCL 1.8.1/3rdParty/Boost/lib/*mt-gd-1_64.lib"
LIBS += "F:/extern/PCL 1.8.1/3rdParty/FLANN/lib/*-gd.lib"
LIBS += "F:/extern/PCL 1.8.1/3rdParty/OpenNI2/Lib/OpenNI2.lib"
LIBS += "F:/extern/PCL 1.8.1/3rdParty/Qhull/lib/*d.lib"
LIBS += "F:/extern/PCL 1.8.1/3rdParty/VTK/lib/*-gd.lib"
} else {
LIBS += "F:/extern/PCL 1.8.1/lib/*release.lib"
LIBS += "F:/extern/PCL 1.8.1/3rdParty/Boost/lib/*mt-1_64.lib"
LIBS += "F:/extern/PCL 1.8.1/3rdParty/FLANN/lib/*.lib"
LIBS += "F:/extern/PCL 1.8.1/3rdParty/OpenNI2/Lib/OpenNI2.lib"
LIBS += "F:/extern/PCL 1.8.1/3rdParty/Qhull/lib/*.lib"
LIBS += "F:/extern/PCL 1.8.1/3rdParty/VTK/lib/*-gr.lib"
}
SOURCES += main.cpp\
pclviewer.cpp
HEADERS += pclviewer.h \
vtk_include.h
FORMS += pclviewer.ui
vtk_include.h
#ifndef VTK_INCLUDE_H
#define VTK_INCLUDE_H
/*
* 指定VTK初始化为:OpenGL版本.(编译默认)
*/
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL)
VTK_MODULE_INIT(vtkRenderingContextOpenGL)
#endif // VTK_INCLUDE_H
main.cpp
#include "pclviewer.h"
#include
#include
int main (int argc, char *argv[])
{
QApplication a (argc, argv);
PCLViewer w;
w.show ();
return a.exec ();
}
在 pclviewer.cpp 里面引入vtk_include.h