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

猜你喜欢

转载自blog.csdn.net/aishuirenjia/article/details/82842843