先添加一个带有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文件,转换方法在下一篇文章会说明。文章来源:https://www.toymoban.com/news/detail-822338.html
The Stanford 3D Scanning Repository文章来源地址https://www.toymoban.com/news/detail-822338.html
到了这里,关于pcl+vtk(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!