废话不多说,直接上干货。
各库具体信息:
PCL1.8.0-allinone-MSVC2013-x64 + 属性表。(https://pan.baidu.com/s/1c1sqoQO#list/path=%2F)
Qt5.5-opensource。官网下载。注意下载列表一定要包含MSVC2013-x64
VS2013 update3及以上。不然据说有问题 + qt-vs-addin-1.2.5(http://download.qt.io/official_releases/vsaddin/)
VTK7.0 官网下载
相信已经到了做这四个库的整合,前三个库的安装应该已经没问题了。注意一点:统一为64位。重点说下vtk的编译问题。
1.vtk编译生成QVtkwidget控件
1)自己编译:
参考链接https://wenku.baidu.com/view/ef13a7c94a7302768f9939ad.html
到了这一步就停止,这里有改动:
应该是将64位编译器release/debug下生成的QVTKWidgetPlugin.dll复制到C:\Qt\Qt5.5\5.5\msvc2013_64\plugins\designer目录下,同时将QVTKWidgetPlugin.lib也复制过来。这样vs打开才回出现QVTKWidget控件。之后就可以不按照链接继续进行了。
2)pcl1.8.0_allinone已经提供。
事实上pcl1.8.0的安装路径下已经提供了64位release/debug的QVTKWidgetPlugin.dll。比如C:\Program Files\PCL1.8.0\3rdParty\VTK\plugins\designer
2. 在主窗口中添加QVtkwidget控件
vs新建Qt Application工程,默认完成。设置类名为pclvisualizer。要求编译器版本与QVTKWidgetPlugin.dll的版本一致,不然报错。比如都为Release + x64.
打开界面文件***.ui,我们就会发现在左侧多出了QVTKWidget,直接拖动拉进主窗口,然后点击主窗口进行垂直布局。
如果不能打开.ui,那么就是你的Qt安装有问题,重新卸掉Qt和vsaddIn,然后按照Qt和vsaddIn的顺序重装。
双击界面的菜单栏,新建"File"菜单项,双击其下拉框中的第一项,添加动作QAction,命名为"Open"。
这时如果你运行,会报错。但是如果你进行了3中的代码编辑,这不会出现这个问题。
3.代码编辑
头文件:pclvisualizer.h
- #ifndef PCLVISUALIZER_H
- #define PCLVISUALIZER_H
- #include <vtkAutoInit.h>
- VTK_MODULE_INIT(vtkRenderingOpenGL2);
- VTK_MODULE_INIT(vtkInteractionStyle);
- #include <QtWidgets/QMainWindow>
- #include <pcl/io/pcd_io.h>
- #include <pcl/point_types.h>
- #include <pcl/visualization/pcl_visualizer.h>
- #include "ui_pclvisualizer.h"
- class PCLVisualizer : public QMainWindow
- {
- Q_OBJECT
- public:
- PCLVisualizer(QWidget *parent = 0);
- ~PCLVisualizer();
- private:
- Ui::PCLVisualizerClass ui;
- //点云数据存储
- pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
- boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
- //初始化vtk部件
- void initialVtkWidget();
- private slots:
- //创建打开槽
- void onOpen();
- };
- #endif // PCLVISUALIZER_H
源文件pclvisualizer.cpp
main.cpp:
- #include <QFileDialog>
- #include <iostream>
- #include <vtkRenderWindow.h>
- #include "pclvisualizer.h"
- PCLVisualizer::PCLVisualizer(QWidget *parent)
- : QMainWindow(parent)
- {
- ui.setupUi(this);
- //初始化
- initialVtkWidget();
- //连接信号和槽
- connect(ui.actionOpen, SIGNAL(triggered()), this, SLOT(onOpen()));
- }
- PCLVisualizer::~PCLVisualizer()
- {
- }
- void PCLVisualizer::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 PCLVisualizer::onOpen()
- {
- //只能打开PCD文件
- QString fileName = QFileDialog::getOpenFileName(this,
- tr("Open PointCloud"), ".",
- tr("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->resetCamera();
- ui.qvtkWidget->update();
- }
- }
- #include "pclvisualizer.h"
- #include <QtWidgets/QApplication>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- PCLVisualizer w;
- w.show();
- return a.exec();
- }
最后编译,生成exe可执行文件,然后点击运行即可。
可也参考链接https://blog.csdn.net/wokaowokaowokao12345/article/details/51314439