PCL1.8.0 QT5.5 vtk7.0 VS2013 win10 x64配置

廢話不多說,直接上乾貨。

各庫具體信息:

      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

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

 源文件pclvisualizer.cpp

 

  main.cpp:

 

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

最後編譯,生成exe可執行文件,然後點擊運行即可。 

可也參考鏈接https://blog.csdn.net/wokaowokaowokao12345/article/details/51314439

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章