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

16 篇文章 3 订阅

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

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

先拖出来一个QOpenGLWidget控件

修改布局如下:

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

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

 输入提升的类名称为QVTKOpenGLNativeWidget

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

点击【添加】按钮。

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

二、修改.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 <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

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值