PCL1.8.0+QT5.5+vtk7.0+VS2013+win10 x64配置
廢話不多說,直接上乾貨。
各庫具體資訊:
Qt5.5-opensource。官網下載。注意下載列表一定要包含MSVC2013-x64
VTK7.0 官網下載
相信已經到了做這四個庫的整合,前三個庫的安裝應該已經沒問題了。注意一點:統一為64位。重點說下vtk的編譯問題。
1.vtk編譯生成QVtkwidget控制元件
1)自己編譯:
到了這一步就停止,這裡有改動:
應該是將64位編譯器release/debug下生成的QVTKWidgetPlugin.dll複製到C:\Qt\Qt5.5\5.5\msvc2013_64\plugins\designer目錄下。這樣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,直接拖動拉進主視窗,然後點選主視窗進行垂直佈局。
雙擊介面的選單欄,新建"File"選單項,雙擊其下拉框中的第一項,新增動作QAction,命名為"Open"。
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可執行檔案,然後點選執行即可。