前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pcl1.8 vs2.13 qt5.7实现点云显示

pcl1.8 vs2.13 qt5.7实现点云显示

作者头像
点云PCL博主
发布2019-07-31 14:22:08
2.5K0
发布2019-07-31 14:22:08
举报
文章被收录于专栏:点云PCL

好吧,虽然转载了别人的博客,那个步骤确实是我想要的,还挺详细,但是考虑到别人可能会将其删除等原因,还是自己写篇日志,记录下。(PS:弄这个东西搞了快3个月的时间,真的是这样。写这篇算是对自己三个月经历的总结,说多了都是泪)

一、下载的东西有: 1、配置PCL1.8的属性列表、64位的all-in-one安装包、pdb数据下载链接 http://pan.baidu.com/s/1nvzByYl http://pan.baidu.com/s/1slpZPz3 http://pan.baidu.com/s/1c2jEIJY 2、qt5.7 visual studio add-in XX for Qt 需要说明的是,qt有对应的vs版本,此次实验成功使用的是不带opengl版本的Qt。其实一直也不是很清楚带opengl与不带opengl的区别。只是在编译QVTKWidgetPlugin.dll、QVTKWidgetPlugin.lib的时候用到的版本,是带opengl的Qt,不带opengl版本的则编译不成功,不知道什么原因。 下面为下载链接 https://www.qt.io/download-open-source/?hsCtaTracking=f977210e-de67-475f-a32b-65cec207fd03%7Cd62710cd-e1db-46aa-8d4d-2f1c1ffdacea&__hstc=152220518.58551e4f205d62afadf1edeba7beff5c.1484725473664.1486738518263.1486782735641.4&__hssc=152220518.1.1486782735641#section-2 3、QVTKWidgetPlugin.dll、QVTKWidgetPlugin.lib下载 现在发现真的只要将该两个文件拷贝到Qt\Qt5.7.1\5.7\msvc2013_64\plugins\designer下面即可在Qt界面下显示出qvtkwidget插件。不需要单独编译(PS:我的电脑是已经编译过了vtk) http://pan.baidu.com/s/1eSgmUp8 考虑到今后可能自己进行编译 QVTKWidgetPlugin.dll、QVTKWidgetPlugin.lib,下面附上编译的教程,过程还是挺详细的。 (使用的带opengl版本进行编译,不知道不带opengl的会不会成功,至少我是失败了n次) http://blog.csdn.net/luoru/article/details/49048353 4、pcl1.8配置vs2013的过程可以参考下面博主的博文,很简便 http://www.zhangzscn.com/2016/03/02/pcl1-8-0%EF%BC%8Cvs2013%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B%E3%80%82/ 二、安装教程 此处省略,但是不是说此块不重要,参考第一块中给的链接,基本可以完成。途中遇到问题,慢慢摸索 三 、代码测试 在配置好环境后,进行点云显示 附上代码: 其中头文件的代码:pointcloud.h

#ifndef POINTCLOUD_H

#define POINTCLOUD_H

#include <vtkAutoInit.h>

VTK_MODULE_INIT(vtkRenderingOpenGL2);

VTK_MODULE_INIT(vtkInteractionStyle);

#include <QtWidgets/QMainWindow>

#include "ui_pointcloud.h"

#include<QFile>

#include<QFileDialog>

#include<QTextEdit>

#include<QString>

#include<pcl/point_cloud.h>

#include<pcl/point_types.h>

#include<pcl/io/pcd_io.h>

#include<pcl/visualization/pcl_visualizer.h>

class PointCloud : public QMainWindow

{

Q_OBJECT

public:

PointCloud(QWidget*parent = 0);

~PointCloud();

private:

Ui::PointCloudClassui;

//点云数据存储

pcl::PointCloud<pcl::PointXYZ>::Ptrcloud;

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

//初始化vtk部件

voidinitialVTKWidget();

private slots:

voidvisualization();

};

#endif // POINTCLOUD_H

pointcloud.cpp代码:

#include "pointcloud.h"

#include<QMenu>

#include<QMenuBar>

#include<QAction>

#include<string>

#include <QTextCodec>

#include <vtkRenderWindow.h>

//将汉字不乱码进行显示

#pragmaexecution_character_set("utf-8")

PointCloud::PointCloud(QWidget *parent)

:QMainWindow(parent)

{

ui.setupUi(this);

//初始化

initialVTKWidget();

this->setWindowIcon(QIcon(":/new/prefix1/PointCloud"));

this->setStyleSheet("background:pink");//设置背景颜色

this->setWindowIcon(QIcon(":/new/prefix1/ico"));//设置软件图标

this->setWindowTitle("point_cloud 点云数据处理软件 版本1.0 ");//设置软件主题标题

this->resize(1500,800);

//菜单栏

QMenuBar*mBar = menuBar();

QMenuBar*mHelp = menuBar();

//添加菜单

QMenu*pFile = mBar->addMenu("文件(File)");

//添加分割线

pFile->addSeparator();

//添加菜单栏,添加事件 打开文件,并进行显示

QAction*pOpen = pFile->addAction("打开(Open)");

connect(pOpen,&QAction::triggered, this, &PointCloud::visualization);

}

void PointCloud::visualization()

{

//只能打开PCD文件

QStringfileName = QFileDialog::getOpenFileName(this,

tr("打开文件(OpenPointCloud)"), "../",

tr("文件(*.pcd)"));

if(fileName.isEmpty()==false)

{

std::stringfile_name = fileName.toStdString();

//sensor_msgs::PointCloud2cloud2;

pcl::PCLPointCloud2cloud2;

//pcl::PointCloud<Eigen::MatrixXf>cloud2;

Eigen::Vector4forigin;

Eigen::Quaternionforientation;

intpcd_version;

intdata_type;

unsignedint data_idx;

intoffset = 0;

pcl::PCDReaderrd;

rd.readHeader(file_name,cloud2, origin, orientation, pcd_version, data_type, data_idx);

if(data_type == 0)

{

pcl::io::loadPCDFile(fileName.toStdString(),*cloud);

}

elseif (data_type == 2)

{

pcl::PCDReaderreader;

reader.read<pcl::PointXYZ>(fileName.toStdString(),*cloud);

}

viewer->updatePointCloud(cloud,"cloud");

viewer->resetCamera();

ui.qvtkWidget->update();

}

}

void PointCloud::initialVTKWidget()

{

cloud.reset(newpcl::PointCloud<pcl::PointXYZ>);

viewer.reset(newpcl::visualization::PCLVisualizer("viewer", false));

viewer->addPointCloud(cloud,"cloud");

ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow());

viewer->setupInteractor(ui.qvtkWidget->GetInteractor(),ui.qvtkWidget->GetRenderWindow());

ui.qvtkWidget->update();

}

PointCloud::~PointCloud()

{

} 运行效果图:

四、错误总结 目前常见错误如下: 1、让软件运行时是个特殊的图标

其中mark.ico在resource文件夹下,最后添加上显示图片代码即可 this->setWindowIcon(QIcon(":/new/prefix1/ico"));//设置软件图标 2、 汉字乱码情况 在qt中汉字乱码情况很普遍,但是搜索很多方法没什么效果,现给出一种简便方法,使汉字正常显示 #include <QTextCodec>

//将汉字不乱码进行显示

#pragmaexecution_character_set("utf-8") 3、在使用pcl1.8版本,出现no override foundfor"vtkrenderwindow" 可以在程序前加三行代码 #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle);

4、error C2653: “sensor_msgs”: 不是类或命名空间名称

解决办法是将sensor_msgs换成pcl 5、error C2440: “static_cast”: 无法从“vtkObjectBase *const ”转换为“vtkRenderWindow *” 在*.cpp中添加#include<vtkRenderWindow> 最后附上一篇比较好的博文 http://blog.csdn.net/qq_15332903/article/details/53966872?locationNum=2&fps=1 最后感谢CSDN上诸多大牛及各个群里面的好友们,讲真的,虽然最后没有解决问题,但是提出的看法确实收获很多。

以上就是武汉大学刘同学的分享,有相关需求者可供参考学习。

这半个月,本人由于回家休息的原因,有很多同学在后台或者QQ提问题都没有回复,非常抱歉,如今我满血归来了,大家可以相互讨论了,同时之前有很多同学说会分享的,可以写成word形式发送给我,乐于分享

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 点云PCL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档