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

弄这个东西搞了快3个月的时间,真的是这样流汗 。写这篇算是对自己三个月经历的总结,亲测多次均可使用。
 
一、下载的东西有:
1、配置PCL1.8的属性列表、64位的all-in-one安装包、pdb数据下载链接
安装包:https://pan.baidu.com/s/1qYYt1so 密码:jjcg
 属性表:http://download.csdn.net/download/qq_32867925/10230011

pdb:链接:https://pan.baidu.com/s/1i6HmYR7 密码:kebr

2、qt5.7  visual studio add-in XX for Qt 需要说明的是,qt有对应的vs版本,此次实验成功使用的是不带opengl版本的Qt。其实一直也不是很清楚带opengl与不带opengl的区别。只是在编译QVTKWidgetPlugin.dll、QVTKWidgetPlugin.lib的时候用到的版本,是带opengl的Qt,不带opengl版本的则编译不成功,不知道什么原因。(测试过qt5.8版本与Qt5.7版本,均可正常使用,其他的不行,会报类似于找不到qvtkwidget.h这样的错误,目测是版本不同引起的)
下面为qt下载链接 

https://mirrors.tuna.tsinghua.edu.cn/qt/archive/vsaddin/2.3.2/icon-default.png?t=N4P3https://mirrors.tuna.tsinghua.edu.cn/qt/archive/vsaddin/2.3.2/(下载不同版本的visual studio add-in XX

qt-opensource-windows-x86-msvc2013_64-5.8.0

https://www1.qt.io/download-open-source-access/#section-2
3、 QVTKWidgetPlugin.dll、QVTKWidgetPlugin.lib下载
现在发现真的只要将该两个文件拷贝到
Qt\Qt5.7.1\5.7\msvc2013_64\plugins\designer下面即可在Qt界面下显示出qvtkwidget插件。不需要单独编译(PS:我的电脑是已经编译过了vtk)
下载链接:http://download.csdn.net/download/qq_32867925/10229981
考虑到今后可能自己进行编译 QVTKWidgetPlugin.dll、QVTKWidgetPlugin.lib,下面附上编译的教程,过程还是挺详细的。
(使用的带opengl版本进行编译,不知道不带opengl的会不会成功,至少我是失败了n次快哭了 ) 

http://blog.csdn.net/luoru/article/details/49048353 ;

4、pcl1.8配置vs2013的过程可以参考下面博主的博文,很简便:

安装完成之后将下载好的PCL-1.8.0-AllInOne-msvc2013-win64-pdb,pdb文件拷贝到PCL ROOT下的bin文件夹中,下图是拷贝后的样子


采用最简单的一种配置方法,在解决方案管理器下,右击项目-->属性(Properties)-->配置管理器( Configuration Properties)-->预处理(Preprocessor)-->预处理定义(Preprocessor Definitions)中添加如下两项:

_SCL_SECURE_NO_WARNINGS  

_CRT_SECURE_NO_WARNINGS
截图如下:



再在属性管理器下,分别在以Debug或Release开头的文件夹下,添加现有属性表(Add Existing Property Sheet),然后选择相应的props文件添加进入即可。
截图如下所示:
 

 二、安装Qt与插件QVTKWidget
安装qt、pcl过程很简单,参照网上教程很多,如下安装Qt5.8版本,在vs中选项中添加Qt5.8相应的位置即可。

 
讲QVTKWidgetPlugin.lib、QVTKWidgetPlugin.dll放入到Qtdesigner目录下。如下所示

三 、代码测试
在配置好环境后,进行点云显示
附上代码:
其中头文件的代码: 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::PointCloudClass ui;

//点云数据存储

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;

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

//初始化vtk部件

void initialVTKWidget();

private slots:

void visualization();

};

#endif // POINTCLOUD_H
 

 pointcloud.cpp代码:

#include "pointcloud.h"

#include<QMenu>

#include<QMenuBar>

#include<QAction>

#include<string>

#include <QTextCodec>

#include <vtkRenderWindow.h>

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

#pragma execution_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文件

QString fileName = QFileDialog::getOpenFileName(this,

tr("打开文件(Open PointCloud)"), "../",

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

if (fileName.isEmpty()==false)

{

std::string file_name = fileName.toStdString();

//sensor_msgs::PointCloud2 cloud2;

pcl::PCLPointCloud2 cloud2;

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

Eigen::Vector4f origin;

Eigen::Quaternionf orientation;

int pcd_version;

int data_type;

unsigned int data_idx;

int offset = 0;

pcl::PCDReader rd;

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

if (data_type == 0)

{

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

}

else if (data_type == 2)

{

pcl::PCDReader reader;

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

}

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

viewer->resetCamera();

ui.qvtkWidget->update();

}

}

void PointCloud::initialVTKWidget()

{

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

viewer.reset(new pcl::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>

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

#pragma execution_character_set("utf-8") 

3、在使用pcl1.8版本,出现no override found for"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>


最后感谢CSDN上诸多大牛及各个群里面的好友们,讲真的,虽然最后没有解决问题,但是提出的看法确实收获很多。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云实验室lab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值