点云可视化的实现
学习了一段时间点云可视化实现前段时间已经完成,今天将其整理一下,写在博客上记录一下学习历程。
前面已经提及到怎么配置Qt5.7.0+pcl1.8.0+vs2013,下面是点云可视化的实现步骤:
在VS2013新建一个Qt工程,默认继续即可。
在vs2013解决方案资源管理器中打开Ui界面如下 :
依次输入File,按下回车确定Open、exit,保存退出Qt Design。
点云可视化的实现主要代码如下:
main.cpp
#include "pclvisualizer.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
PCLVisualizer w;
w.show();
return a.exec();
}
pclvisualizer.cpp
#include <QFileDialog>
#include <iostream>
#include <vtkRenderWindow.h>
#include "pclvisualizer.h"
#include <QColorDialog>
#pragma execution_character_set("utf-8")
PCLVisualizer::PCLVisualizer(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//初始化
initialVtkWidget();
//连接信号和槽
connect(ui.actionOpen, &QAction::triggered, this, &PCLVisualizer::onOpen);
connect(ui.actionExit, &QAction::triggered, this, &PCLVisualizer::exit);
}
PCLVisualizer::~PCLVisualizer()
{
}
void PCLVisualizer::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();
}
//读取文本型和二进制型点云数据
void PCLVisualizer::onOpen()
{
//只能打开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 == 2)
{
pcl::PCDReader reader;
reader.read<pcl::PointXYZ>(fileName.toStdString(), *cloud);
}
viewer->updatePointCloud(cloud, "cloud");
viewer->resetCamera();
ui.qvtkWidget->update();
}
}
void PCLVisualizer::exit()
{
this->close();
}
pclvisualizer.h
#ifndef PCLVISUALIZER_H
#define PCLVISUALIZER_H
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
#include <QtWidgets/QMainWindow>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include "ui_pclvisualizer.h"
class PCLVisualizer : public QMainWindow
{
Q_OBJECT
public:
PCLVisualizer(QWidget *parent = 0);
~PCLVisualizer();
private:
Ui::pclvisualizerClass ui;
//Ui::PCLVisualizerClass ui;
//点云数据存储
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
//初始化vtk部件
void initialVtkWidget();
private slots:
//创建打开槽
void onOpen();
void exit();
void setcolor();
};
#endif // PCLVISUALIZER_H
最终编译出来的效果
所有源代码均在GitHub:https://github.com/BooInfiniti/pclstudy/tree/master
本文资源收集自网上,写此博客只为记录学习历程。