vs2015+PCL1.8.1+VTK8.0.0+QT5.9.6
提示:首先感谢以下博主的经验,主要参考:
https://blog.csdn.net/qq_33676772/article/details/83478255
一、VS2015和PCL1.8.1的安装
参考:
https://blog.csdn.net/G_1205809706/article/details/115480161
或者联系我进行PCl属性表的添加
二、QT5.9.6的安装
http://download.qt.io/archive/qt/5.9/
附件附加项尽量加上
三、VTK8.0的安装
官网上已经更新到9.0.1 我找了半天没找到 最后找一个师兄要到的
链接:https://pan.baidu.com/s/1myqwoqieLhTi0C5cCkGYpg
提取码:xi82
复制这段内容后打开百度网盘手机App,操作更方便哦
安装cmake软件这里不加赘述 因为这个软件安装没啥技巧
- ,在D盘下创建一个VTK文件夹,在该文件夹下创建vtk_src和vtk_bin; 在vtk_src下解压VTK8.0,备用
- 启动CMake,将路径写好,如下图,点击Configure
选 Visual Studio 14 2015 Win32(本人是在pcl1.8.1 32位下实现的),点击finish,等待配置完成。
选择BUILD_SHADRED_LIBS,如图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210407132032432.png
安装目录:这里安装目录通常在c/program files/VTK 本人不想放C盘 放在D盘自己创建的地方
如果有改动位置 那么还需要改动下面这些项目
接下来:
如图勾选
完成上述三个设置后,点击Configure,会出现VTK_Qt_Group错误,如下
再次点击Configure继续,中间可能出现红色文字的警告,不用管。
配置成功后,出现Configure done提示。
点击Generate生成工程
再点击运行
打开工程后,选择Release和x86(win32)(我做重建界面使用的事release32位),默认启动项为ALL_BUILD,鼠标右键直接选择生成即可
一般不会有错误 如果有错误就是你瞎用了版本,PCL1.8.1环境中指定的是使用VTK8.0.0 ,发生错误 自己去找对应环境的VTK版本 选INSTALL,右键点生成,很快就生成了
然后就是为Qt Designer安装QVTKWidget插件:
在
和
复制这三文件到自己QT路径下msvc2015_64\plugins\designer\目录中
这时你就能启动Qt Designer,这里有两个版本,一般上面是32位,下面是64位。根据编译对应的32位版本会出现上面的含有VTK控件
3. 配置VTK和PCLRelease32属性表:如下
然后就会在当前目录下生成
VTK配置如下:
1 电脑环境变量中添加
2. 包含目录
D:\VTK\VTK-source\include\vtk-8.0
D:\VTK\VTK-source\bin
3.库目录
D:\VTK\VTK-source\lib
4.附加依赖项
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
vtkDomainsChemistryOpenGL2-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
vtkglew-8.0.lib
vtkGUISupportQt-8.0.lib
vtkGUISupportQtSQL-8.0.lib
vtkhdf5-8.0.lib
vtkhdf5_hl-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
vtkIOExportOpenGL2-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-8.0.lib
vtknetcdf_c++.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
vtkRenderingContextOpenGL2-8.0.lib
vtkRenderingCore-8.0.lib
vtkRenderingFreeType-8.0.lib
vtkRenderingGL2PSOpenGL2-8.0.lib
vtkRenderingImage-8.0.lib
vtkRenderingLabel-8.0.lib
vtkRenderingLOD-8.0.lib
vtkRenderingOpenGL2-8.0.lib
vtkRenderingQt-8.0.lib
vtkRenderingVolume-8.0.lib
vtkRenderingVolumeOpenGL2-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
配置好后,有属性表文件如上。
四、QT+VS2015的拓展工具安装这里不加赘述
五、点云可视化的实现(重点)
打开VS2015,新建一个工程Qt GUI Application,命名x86sh,建好后对应文件如图:
三文件如下
.h
#pragma once
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <QtWidgets/QMainWindow>
#include "ui_x86show.h"
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/PolygonMesh.h>
#include <pcl/io/ply_io.h>
#include <vtkRenderWindow.h>
class x86show : public QMainWindow
{
Q_OBJECT
public:
x86show(QWidget *parent = Q_NULLPTR);
private:
Ui::x86showClass ui;
//点云数据存储
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
//初始化vtk部件
void initialVtkWidget();
private slots:
//创建打开槽
void onOpen();
};
.cpp文件
#include "x86show.h"
#include <QFileDialog>
#include <iostream>
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
x86show::x86show(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//初始化
initialVtkWidget();
//pcl::io::loadPCDFile("bunny.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();
// https://blog.csdn.net/KLNSDFHUASF/article/details/102506056?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242
//pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPLYFile<pcl::PointXYZ>("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("object_mesh.ply", mesh); //将PLY文件读取并存为PolygonMesh类型
//pcl::visualization::PCLVisualizer viewer("PCL PolygonMesh"); //显示名字
//viewer.addPolygonMesh(mesh);
//while (!viewer.wasStopped())
//{
// viewer.spinOnce();
//}
//boost::shared_ptr<pcl::visualization::PCLVisualizer> 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();
}
//
void x86show::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 x86show::onOpen()
{
QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");
if (!fileName.isEmpty())
{
std::string file_name = fileName.toStdString();
//sensor_msgs::PointCloud2 cloud2;
pcl::PCLPointCloud2 cloud2;
//pcl::PointCloud<Eigen::MatrixXf> 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->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cloud");
viewer->resetCamera();
ui.qvtkWidget->update();
}
}
ui界面如上:
运行界面:
其次这个工程不能放的目录阶数太多,就放桌面就能运行,因为是读取目录路径文件
最后会出现
0x779E41AD (vtkGUISupportQt-8.0.dll)处(位于 Qtpointcshow.exe 中)引发的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。
这时需要参考链接
https://blog.csdn.net/zy2317878/article/details/80374541?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.baidujs&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.baidujs
还有一些错误 我忘记了 大概是内存指针溢出,还有需要进行点云的定义