1. 程式人生 > >PCL1.8.0+QT5.5+vtk7.0+VS2013+win10 x64配置

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

  1. #ifndef PCLVISUALIZER_H  
  2. #define PCLVISUALIZER_H  
  3. #include <vtkAutoInit.h>   
  4. VTK_MODULE_INIT(vtkRenderingOpenGL2);  
  5. VTK_MODULE_INIT(vtkInteractionStyle);  
  6. #include <QtWidgets/QMainWindow>  
  7. #include <pcl/io/pcd_io.h>  
  8. #include <pcl/point_types.h>  
  9. #include <pcl/visualization/pcl_visualizer.h>  
  10. #include "ui_pclvisualizer.h"  
  11. class PCLVisualizer : public QMainWindow  
  12. {  
  13.     Q_OBJECT  
  14. public:  
  15.     PCLVisualizer(QWidget *parent = 0);  
  16.     ~PCLVisualizer();  
  17. private:  
  18.     Ui::PCLVisualizerClass ui;  
  19.     //點雲資料儲存  
  20.     pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;  
  21.     boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;  
  22.     //初始化vtk部件  
  23.     void initialVtkWidget();  
  24.     private slots:  
  25.     //建立開啟槽  
  26.     void onOpen();  
  27. };  
  28. #endif // PCLVISUALIZER_H 

 原始檔pclvisualizer.cpp

  main.cpp:

  1. #include <QFileDialog>  
  2. #include <iostream>  
  3. #include <vtkRenderWindow.h>  
  4. #include "pclvisualizer.h"  
  5. PCLVisualizer::PCLVisualizer(QWidget *parent)  
  6.     : QMainWindow(parent)  
  7. {  
  8.     ui.setupUi(this);  
  9.     //初始化  
  10.     initialVtkWidget();  
  11.     //連線訊號和槽  
  12.     connect(ui.actionOpen, SIGNAL(triggered()), this, SLOT(onOpen()));  
  13. }  
  14. PCLVisualizer::~PCLVisualizer()  
  15. {  
  16. }  
  17. void PCLVisualizer::initialVtkWidget()  
  18. {  
  19.     cloud.reset(new pcl::PointCloud<pcl::PointXYZ>);  
  20.     viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));  
  21.     viewer->addPointCloud(cloud, "cloud");  
  22.     ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow());  
  23.     viewer->setupInteractor(ui.qvtkWidget->GetInteractor(), ui.qvtkWidget->GetRenderWindow());  
  24.     ui.qvtkWidget->update();  
  25. }  
  26. //讀取文字型和二進位制型點雲資料  
  27. void PCLVisualizer::onOpen()  
  28. {  
  29.     //只能開啟PCD檔案  
  30.     QString fileName = QFileDialog::getOpenFileName(this,  
  31.         tr("Open PointCloud"), ".",  
  32.         tr("Open PCD files(*.pcd)"));  
  33.     if (!fileName.isEmpty())  
  34.     {  
  35.         std::string file_name = fileName.toStdString();  
  36.         //sensor_msgs::PointCloud2 cloud2;  
  37.         pcl::PCLPointCloud2 cloud2;  
  38.         //pcl::PointCloud<Eigen::MatrixXf> cloud2;  
  39.         Eigen::Vector4f origin;  
  40.         Eigen::Quaternionf orientation;  
  41.         int pcd_version;  
  42.         int data_type;  
  43.         unsigned int data_idx;  
  44.         int offset = 0;  
  45.         pcl::PCDReader rd;  
  46.         rd.readHeader(file_name, cloud2, origin, orientation, pcd_version, data_type, data_idx);  
  47.         if (data_type == 0)  
  48.         {  
  49.             pcl::io::loadPCDFile(fileName.toStdString(), *cloud);  
  50.         }  
  51.         else if (data_type == 2)  
  52.         {  
  53.             pcl::PCDReader reader;  
  54.             reader.read<pcl::PointXYZ>(fileName.toStdString(), *cloud);  
  55.         }  
  56.         viewer->updatePointCloud(cloud, "cloud");  
  57.         viewer->resetCamera();  
  58.         ui.qvtkWidget->update();  
  59.     }  
  60. }  
  61. #include "pclvisualizer.h"  
  62. #include <QtWidgets/QApplication>  
  63. int main(int argc, char *argv[])  
  64. {  
  65.     QApplication a(argc, argv);  
  66.     PCLVisualizer w;  
  67.     w.show();  
  68.     return a.exec();  

最後編譯,生成exe可執行檔案,然後點選執行即可。