您现在的位置是:首页 > 名人名句

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

作者:焦糖时间:2024-05-10 16:00:21分类:名人名句

简介  文章浏览阅读4.8k次,点赞5次,收藏35次。先添加一个带有ui的QT应用程序。然后将QOpenGLWidget控件提升为QVTKOpenGLNativeWidget控件,步骤如下:_qvtkopenglnativewidget

点击全文阅读

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

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

先拖出来一个QOpenGLWidget控件

修改布局如下:

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

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

 输入提升的类名称为QVTKOpenGLNativeWidget

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

点击【添加】按钮。

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

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

INCLUDEPATH += /usr/include/eigen3INCLUDEPATH += /usr/local/include/vtk-8.2LIBS += /usr/local/lib/libvtk*.soINCLUDEPATH += /usr/local/include/pcl-1.13LIBS += /usr/local/lib/libpcl_*.so

三、添加所需头文件

#include <vtkRenderWindow.h>#include <pcl/visualization/pcl_visualizer.h>#include <pcl/point_types.h>//各种格式的点的头文件#include <pcl/io/pcd_io.h>#include <vtkGenericOpenGLRenderWindow.h>

四、显示点云代码

先在头文件widget.h中添加

    boost::shared_ptr< pcl::visualization::PCLVisualizer > view;

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

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();    vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::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<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());//创建点云指针    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 <QSurfaceFormat>#include "QVTKOpenGLNativeWidget.h"
QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());

全部整体代码见下图:

五、运行程序

运行界面如下:

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

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

六、问题

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

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

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

如下:

七、点云转换

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

八、关于下载pcd文件

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

The Stanford 3D Scanning Repository

资源见https://download.csdn.net/download/m0_67254672/88955839?spm=1001.2014.3001.5501

点击全文阅读

郑重声明:

本站所有活动均为互联网所得,如有侵权请联系本站删除处理

我来说两句