在VS2017中,想要在qt生成界面中显示点云,但是pcl的vtk并没有,所以需要自己编译。
原因:因为没有单独安装VTK,PCL中安装版中自带的vtk缺少QVTKWidget.dll,这样在QT Designer中就无法显示点云,故需自己编译VTK。
前提:已经安装好VS2017、QT5.9.、PCL1.81、CMake(是使用CMake编译)(大版本对应就可按此方法进行VTK编译)
工具 : vtk8.0.1的链接在这https://https://gitlab.kitware.com/vtk/vtk/tree/v8.0.1
(因为PCL1.81中自带的VTK是8.0版本,故需下载vtk8.0开头版本)
1.将下载好的安装包VTK安装包复制到PCL安装目录3rdParty下解压(后期可删除),然后将原VTK文件夹备份为VTK_copy(若成功可删除,不成功可还原),并新建空文件夹VTK代替。
pcl的安装目录,在3rdParty下有自带的VTK,我们先备份VTK文件夹为VTK_copy,然后一个空VTK文件夹,把编译后的VTK就放到这个新建的VTK文件夹下,(QT自带编码不能识别window下中文或空格,注意这点,路径尽量不要含有中文)。
2.cmake编译VTK步骤
2.1 打开cmake-gui进行配置,首先在解压的vtk8.0.1文件夹中新建一个空文件夹build。
source code :VTK-8.1.1.zip解压后的目录
build the binaries :在VTK-8.1.1.zip解压后的目录下新建一个build目录
2.2 点击configure, 选择编译器
注意选择自己的配置。
2.3 configure完成之后一片红,但是不用担心,因为我们还没有开始配置
勾选Grouped和Advanced,进行以下设置:
BUILD下取消勾选BUILD_TESTING,只留BUILD_SHARED_LIBS就行了CMAKE下CMAKE_INSTALL_PREFIX设置为你新建的VTK文件夹INSTALL下目录也替换成你新建的VTK文件夹VTK下勾选VTK_Group_Qt,VTK_RENDERING_BACKEND设置为OpenGL(这里一定要注意,否则pcl显示框会出错)。
点击Add Entry,添加CMAKE_DEBUG_POSTFIX,Value设置为-gd(用来区别debug和release版本)
再次点击configure
编译vtk-8.0.1的时候,由于qt默认版本号是4,这里的5.10的qt会报错,修改为5即可
再次configure qt5已经自动识别出来了,目录正确,无需修改,点击configure
点击generate
点击open project 自动打开vs
首先Debug x64下,右键ALL_BUILD重新生成,再右键INSTALL设置为启动项目、重新生成;
然后Release x64下,右键ALL_BUILD重新生成,再右键INSTALL设置为启动项目、重新生成;
一般都会成功,不成功就是你之前的问题了。
然后将3rdParty\VTK\plugins\designer下的QVTKWidgetPlugin.dll拷贝到Qt5.9.2\5.9.2\msvc2017_64\plugins\designer下,这样Qt Designer里面就有了QVtk的控件了。
新建QT工程打开Qt Designer发现已经有了QVtk的控件了
示例:
#include "PCLViewer.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace pcl;
using namespace pcl::io;
using namespace std;
//vtk
#include
PCLViewer::PCLViewer(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//显示点云
//初始化点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
//pcl::io::loadPLYFile("Laurana50k.ply", *cloud); //使用点云文件 ply
pcl::io::loadPCDFile("rabbit.pcd", *cloud); //使用点云文件 pcb
//声明视窗
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
//设置视窗背景色
viewer->setBackgroundColor(0, 0, 0);
//预处理点云颜色
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> magenta(cloud, 255, 0, 255);
//把点云加载到视窗
viewer->addPointCloud(cloud, magenta, "cloud");
//设置点云大小
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cloud");
//连接qvtk
ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
ui.qvtkWidget->update();
///*显示曲面*/
//pcl::PolygonMesh mesh; 创建多变形网格,用于存储结果
//pcl::io::loadPolygonFilePLY("Laurana50k.ply", mesh); //将PLY文件读取并存为PolygonMesh类型
pcl::visualization::PCLVisualizer viewer("PCL PolygonMesh"); //显示名字
viewer.addPolygonMesh(mesh);
while (!viewer.wasStopped())
{
viewer.spinOnce();
}
//boost::shared_ptr viewer(new pcl::visualization::PCLVisualizer("3D viewer"));
//viewer->setBackgroundColor(0, 0, 0); //设置背景
//viewer->addPolygonMesh(mesh, "triangles"); //设置显示的网格
//viewer->addCoordinateSystem(0.1); //设置坐标系
//viewer->initCameraParameters();
连接qvtk
//ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
//ui.qvtkWidget->update();
}
运行结果:
显示点云 .pcb文件
显示表面 .ply文件
上图两个点云文件rabbit.pcd、Laurana50k.ply,上图代码直接将文件放在工程目录下就行。
下载链接: