这是PCL文档中的例程实现,原文地址:http://pointclouds.org/documentation/tutorials/qt_visualizer.php#more-on-qt-and-pcl
介绍一下环境:Ubuntu16.04 + Qt5.8 + PCL1.8.1 + VTK7.1.1
配置环境见另一篇文章。
UI部分:
只允许在QtDesigner中修改
图片左上角第一个图标:Edit Wdigets模式
组件名:
HorizontalSlider
LCD Number
Push Button
QVTKWidget
点击slider,右下角属性修改最大最小值。
左上角第二个图标:Edit Signals/Slots模式
点击slider 拖动到LCD Number弹出函数选择窗口,选择sliderMoved(int)->display(int)
代码部分
头文件pclviewer.h
#ifndef PCLVIEWER_H
#define PCLVIEWER_H
#include <QMainWindow>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
//qvtk
#include<vtkRenderWindow.h>
namespace Ui {
class PCLViewer;
}
class PCLViewer : public QMainWindow
{
Q_OBJECT
public:
explicit PCLViewer(QWidget *parent = 0);
~PCLViewer();
/**
*信号/槽 函数声明
*/
public Q_SLOTS:
//随机颜色按钮点击响应方法
void randomButtonPressed ();
//RGB颜色条值变更响应
void RGBsliderReleased ();
//点云大小滑动条值变更响应
void pSliderValueChanged (int value);
//Red值滑动响应
void redSliderValueChanged (int value);
//Green值滑动响应
void greenSliderValueChanged (int value);
//Blue值滑动响应
void blueSliderValueChanged (int value);
protected:
//声明视窗
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
//声明点云指针
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud;
//RGB三色值变量
unsigned int red;
unsigned int green;
unsigned int blue;
private:
Ui::PCLViewer *ui;
};
#endif // PCLVIEWER_H
pclviewer.cpp
#include "pclviewer.h"
#include "ui_pclviewer.h"
PCLViewer::PCLViewer(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::PCLViewer)
{
ui->setupUi(this);
this->setWindowTitle("PCL Viewer");
//初始化点云
cloud.reset(new pcl::PointCloud<pcl::PointXYZRGBA>);
//设置点云大小
cloud->points.resize(200);
//默认颜色
red = 128;
green = 128;
blue = 128;
//填充点云
for (size_t 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);
cloud->points[i].r = red;
cloud->points[i].g = green;
cloud->points[i].b = blue;
}
//设置QVTK窗口
viewer.reset(new pcl::visualization::PCLVisualizer("view", false));
ui->qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
viewer->setupInteractor (ui->qvtkWidget->GetInteractor (), ui->qvtkWidget->GetRenderWindow ());
//关联点云到viewer
viewer->addPointCloud(cloud, "cloud");
ui->qvtkWidget->update ();
// Connect "random" button and the function
connect (ui->pushButton_random, SIGNAL (clicked ()), this, SLOT (randomButtonPressed ()));
// Connect R,G,B sliders and their functions
connect (ui->horizontalSlider_R, SIGNAL (valueChanged (int)), this, SLOT (redSliderValueChanged (int)));
connect (ui->horizontalSlider_G, SIGNAL (valueChanged (int)), this, SLOT (greenSliderValueChanged (int)));
connect (ui->horizontalSlider_B, SIGNAL (valueChanged (int)), this, SLOT (blueSliderValueChanged(int)));
connect (ui->horizontalSlider_R, SIGNAL (sliderReleased ()), this, SLOT (RGBsliderReleased ()));
connect (ui->horizontalSlider_G, SIGNAL (sliderReleased ()), this, SLOT (RGBsliderReleased ()));
connect (ui->horizontalSlider_B, SIGNAL (sliderReleased ()), this, SLOT (RGBsliderReleased ()));
// Connect point size slider
connect (ui->horizontalSlider_P, SIGNAL (valueChanged (int)), this, SLOT (pSliderValueChanged (int)));
pSliderValueChanged (2);
viewer->resetCamera ();
ui->qvtkWidget->update ();
}
void
PCLViewer::randomButtonPressed ()
{
printf ("Random button was pressed\n");
// Set the new color
for (size_t i = 0; i < cloud->size(); i++)
{
cloud->points[i].r = 255 *(1024 * rand () / (RAND_MAX + 1.0f));
cloud->points[i].g = 255 *(1024 * rand () / (RAND_MAX + 1.0f));
cloud->points[i].b = 255 *(1024 * rand () / (RAND_MAX + 1.0f));
}
//点云颜色改变,在viewer中更新
viewer->updatePointCloud (cloud, "cloud");
//更新qvtk
ui->qvtkWidget->update ();
}
void
PCLViewer::RGBsliderReleased ()
{
// Set the new color
for (size_t i = 0; i < cloud->size (); i++)
{
cloud->points[i].r = red;
cloud->points[i].g = green;
cloud->points[i].b = blue;
}
viewer->updatePointCloud (cloud, "cloud");
ui->qvtkWidget->update ();
}
void
PCLViewer::redSliderValueChanged (int value)
{
red = value;
printf ("redSliderValueChanged: [%d|%d|%d]\n", red, green, blue);
}
void
PCLViewer::greenSliderValueChanged (int value)
{
green = value;
printf ("greenSliderValueChanged: [%d|%d|%d]\n", red, green, blue);
}
void
PCLViewer::blueSliderValueChanged (int value)
{
blue = value;
printf("blueSliderValueChanged: [%d|%d|%d]\n", red, green, blue);
}
void
PCLViewer::pSliderValueChanged (int value)
{
//改变点云大小
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, value, "cloud");
viewer->updatePointCloud (cloud, "cloud");
ui->qvtkWidget->update ();
printf("pSliderValueChanged: [%d]\n", value);
}
PCLViewer::~PCLViewer()
{
delete ui;
}
效果图:随机颜色