Create a PCL visualizer in Qt with QtDesigner

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GreenHandCGL/article/details/81772054

这是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;
}

效果图:随机颜色

猜你喜欢

转载自blog.csdn.net/GreenHandCGL/article/details/81772054
pcl