pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

先添加一个带有ui的QT应用程序。

一、在ui界面中添加QVTKOpenGLNativeWidget控件

先拖出来一个QOpenGLWidget控件

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

修改布局如下:

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

然后将QOpenGLWidget控件提升为QVTKOpenGLNativeWidget控件,步骤如下:

右击QOpenGLWidget窗口,选择【提示为…】

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

 输入提升的类名称为QVTKOpenGLNativeWidget

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

 此时需要把自动生成的qvtkopenglnativewidget.h修改为QVTKOpenGLNativeWidget.h,否则报错找不到qvtkopenglnativewidget.h头文件,因为下载下来的头文件名称为QVTKOpenGLNativeWidget.h。

点击【添加】按钮。

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

选中提升的类,点击【提升】按钮。

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

二、修改.pro文件,添加所需库

INCLUDEPATH += /usr/include/eigen3

INCLUDEPATH += /usr/local/include/vtk-8.2
LIBS += /usr/local/lib/libvtk*.so

INCLUDEPATH += /usr/local/include/pcl-1.13
LIBS += /usr/local/lib/libpcl_*.so

三、添加所需头文件

#include 
#include 
#include //各种格式的点的头文件
#include 
#include 

四、显示点云代码

先在头文件widget.h中添加

    boost::shared_ptr view;

在widget.cpp文件中的构造函数中添加初始化

    vtkSmartPointer renderer = vtkSmartPointer::New();
    vtkSmartPointer renderWindow = vtkSmartPointer::New();
    renderWindow->AddRenderer(renderer);
    view.reset(new pcl::visualization::PCLVisualizer(renderer,renderWindow,"viewer",false));
    view->setupInteractor(ui->guiwidget->GetInteractor(),ui->guiwidget->GetRenderWindow());
    ui->guiwidget->SetRenderWindow(view->getRenderWindow());

添加按钮的点击事件对应的槽函数,添加加载点云的代码

    //读取pcd文件并显示
    pcl::PointCloud::Ptr cloud(new pcl::PointCloud());//创建点云指针
    QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");
    if(fileName == "") return;
    pcl::io::loadPCDFile(fileName.toStdString(),*cloud);
    view->addPointCloud(cloud,"cloud");
    view->resetCamera();    //视角
    ui->guiwidget->update();

在main.cpp中引用下面头文件并在QApplication调用前添加下面代码,解决报opengl版本过低的问题。

#include 
#include "QVTKOpenGLNativeWidget.h"
QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());

全部整体代码见下图:

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

五、运行程序

运行界面如下:

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

点击【load_pcd】按钮加载点云的pcd文件。

pcd文件可直接在解压的pcl源文件中的test文件夹中查看。

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

六、问题

存在一个问题:加载完文件之后,需要点击一下视图或者对视图进行一下缩放操作才能出现点云数据图像,之前用VTKWidget时加载完文件可以直接显示出来。如果有知道此问题出现的原因以及解决办法的网友,希望评论告知,感谢!

解决啦!!!!!!只需要在最后加上下面这句就可以啦!!!!!!!!

ui->guiwidget->GetRenderWindow()->Render();

如下:

pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

七、点云转换

    //创建点云对象
    pcl::PointCloud cloud;
    //创建点云指针对象
    pcl::PointCloud::Ptr cloud_ptr(new pcl::PointCloud);
    //转换
    cloud = * cloud_ptr;
    cloud_ptr = cloud.makeShared();

八、关于下载pcd文件

也可以去下面链接去下载(网上找到的关于兔子的例子都是在下面链接中下载的),不过下载的是ply文件,需要转为pcd文件,转换方法在下一篇文章会说明。

The Stanford 3D Scanning Repository

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/a3ecd3e605.html