PCL1.8.1+Qt5.9.1+VS2015联合编译和显示三维图像

因项目需求,需要在Qt的UI中显示三维图像,PCL为开源库,包括算法、矩阵计算、VTK三维显示,但是未与Qt联用,使用不太方便,官网上未提供已经编译好的VTK与Qt,需要自己手动cmake

1)从Qt官网上下载qt-opensource-windows-x86-5.9.1.exe,并进行安装;

2)从VTK官网上下载VTK-8.0.1.zip,VTKData-8.0.1.zip,先解压VTK-8.0.1.zip,然后解压VTKData-8.0.1.zip,解压文件夹为VTK-8.0.1

3)下载并安装cmake-3.8.2-win64-x64,打开cmake-gui.exe

4)在cmake-gui.exe中where is the source code 为之前解压文件夹VTK-8.0.1,“where to build the binaries”为cmake编译后,编译结果路径,

点击“Configure”,弹出选择生成的平台,下拉列表一般不用选择,会默认搜索编译器,为“Visual Studio 14 2015”,这是win32编译平台,点击Finish

5)“BUILD_SHARED_LIBS”为需要创建的静态链接库lib,需要勾选;“CMAKE_INSTALL_PREFIX”为编译工程中,将头文件、lib文件、dll文件提取到对应路径下;“VTK_Group_Qt”为需要与Qt联用,需要勾选;再点击“Configure”

6)步骤5)中显示出“Found unsuitable Qt version "5.9.1" ”,需要将“VTK_QT_VERSION”从4改为5,再点击“Configure”

7)步骤6)中没有问题后,点击“Generate”生成sln工程,然后点击“Open Project”;

8)打开工程后,目前生成Debug的lib和dll,选择“ALL_BUILD”右键生成,等待工程全部编译完

9)在选择“INSTALL”,会将所有头文件、lib、dll文件拷到步骤5)“CMAKE_INSTALL_PREFIX”所对应路径下;

10)记得将原工程编译好的QVTKWidgetPlugin.lib和QVTKWidgetPlugin.dll文件拷贝到对应的“CMAKE_INSTALL_PREFIX”所对应路径下lib和bin中;

11)将自己编译好的VTK替换已经安装的VTK,即在PCL安装路径下的3rdParty的VTK进行替换,然后进行VS2015的静态链接库lib配置,bin下dll添加到环境变量path中

下面进行新建Qt ui工程,例如工程名为QtGuiApplication,打开QtGuiApplication.ui,选择Widget控件,控件名为qvtkWidget,控件提升为“QVTKWidget”

QtGuiApplication.h文件中

#pragma once

//这部分注意,需要添加
#ifndef INITIAL_OPENGL
#define INITIAL_OPENGL
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingContextOpenGL2)
VTK_MODULE_INIT(vtkRenderingFreeType)
#endif

#include <QtWidgets/QMainWindow>
#include "ui_QtGuiApplication1.h"
#include <pcl/visualization/cloud_viewer.h>
//#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <iostream>
class QtGuiApplication1 : public QMainWindow
{
Q_OBJECT


public:
QtGuiApplication1(QWidget *parent = Q_NULLPTR);
//初始化vtk部件
void initialVtkWidget();
void getRandom();
private:
Ui::QtGuiApplication1Class ui;
//点云数据存储
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
pcl::visualization::PCLVisualizer::Ptr viewer;
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>::Ptr cloud_color_handler;
std::string CloudId;
private slots:
void on_LoadBtn_clicked();
};


在QtGuiApplication.cpp中

#include "QtGuiApplication1.h"
#include <QFileDialog>
#include <vtkRenderWindow.h>
QtGuiApplication1::QtGuiApplication1(QWidget *parent): QMainWindow(parent)
{
ui.setupUi(this);
CloudId = "cloud";
initialVtkWidget();
}


void QtGuiApplication1::initialVtkWidget()
{
cloud.reset(new pcl::PointCloud<pcl::PointXYZ>);
viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));
cloud_color_handler.reset(new pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(cloud, 0, 255, 0));
viewer->addPointCloud(cloud, *cloud_color_handler, CloudId);


ui.qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
viewer->setupInteractor(ui.qvtkWidget->GetInteractor(), ui.qvtkWidget->GetRenderWindow());
ui.qvtkWidget->update();
}


//生成随机数
void QtGuiApplication1::getRandom()
{
cloud->width = 100;
cloud->height = 1;
cloud->points.resize(cloud->width*cloud->height);
//生成数据,采用随机数填充点云的X,Y坐标
for (int i=0;i<cloud->points.size();i++)
{
cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
}
}


void QtGuiApplication1::on_LoadBtn_clicked()
{
//只能打开PCD文件
QString fileName = QFileDialog::getOpenFileName(this, tr("Open PointCloud"), ".", tr("Open PCD files(*.pcd)"));
if (!fileName.isEmpty())
{
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 == 1)
{
pcl::PCDReader reader;
int ok = reader.read<pcl::PointXYZ>(fileName.toStdString(), *cloud);
}
else
{
return;
}


//设置视窗的背景色,可以任意设置RGB的颜色,这里是设置为黑色
viewer->setBackgroundColor(0, 0, 0);
//用于改变显示点云的尺寸,可以利用该方法控制点云在视窗中的显示方法,
bool res=  viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, CloudId);
//如果拥有点云数据,也就是CloudId,就应该去除这个点云ID
if(viewer->contains(CloudId)) viewer->removePointCloud(CloudId);
res = viewer->addPointCloud<pcl::PointXYZ>(cloud, *cloud_color_handler, CloudId);


//viewer->updatePointCloud<pcl::PointXYZ>(cloud,*cloud_color_handler, CloudId) 
//更新已有CloudId
//res = viewer->updatePointCloud<pcl::PointXYZ>(cloud,*cloud_color_handler, CloudId);


//addPointCloud 后面的CloudID应该不相同
//getRandom();
//res = viewer->addPointCloud<pcl::PointXYZ>(cloud, *cloud_color_handler, CloudId+'0');
viewer->addCoordinateSystem(1.0);
viewer->resetCamera();
ui.qvtkWidget->update();
}
}





  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值