廢話不多說,直接上乾貨。
各庫具體信息:
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