IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Qt调用PCL库,在QWidget中显示点云 -> 正文阅读

[C++知识库]Qt调用PCL库,在QWidget中显示点云

最终效果展示

在Qt界面中显示点云

本人环境:Ubuntu18.04 / Qt 5.14.2 / PCL 1.8

下面介绍具体原理和实现步骤。


原理

其实核心就是这一行代码
在这里插入图片描述
将数据从pclviewer 传输到 QVTKWidget。

具体实现

1、.ui 设计

插入一个QWidget,然后右键QWidget => 提升为 => QVTKWidget (注意QVTKWidget.h区分大小写!!)
在这里插入图片描述
在这里插入图片描述再新建四个horizontalSlider,分别命名为horizontalSlider_Red,horizontalSlider_Green,horizontalSlider_Blue,horizontalSlider_Size。用于控制点云的颜色和大小。

2、代码

.pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# 主要需要修改的部分在下方,注意库的地址!
# -------------------------------------------------------
INCLUDEPATH += /usr/include/eigen3								#注意路径可能不一样

INCLUDEPATH += /usr/include/vtk-6.3
LIBS += /usr/lib/x86_64-linux-gnu/libvtk*.so					#注意路径可能不一样

INCLUDEPATH += /usr/include/boost								#注意路径可能不一样
LIBS += /usr/lib/x86_64-linux-gnu/libboost_*.so		

INCLUDEPATH += /usr/include/pcl-1.8								#注意路径可能不一样
LIBS += /usr/lib/x86_64-linux-gnu/libpcl_*.so
# -------------------------------------------------------

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
    main.cpp \
    qtpclviewer.cpp

HEADERS += \
    qtpclviewer.h

FORMS += \
    qtpclviewer.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

qtpclviewer.h

#ifndef QTPCLVIEWER_H
#define QTPCLVIEWER_H

#include <QMainWindow>
#include "ui_qtpclviewer.h"

#ifndef INITIAL_OPENGL
#define INITIAL_OPENGL
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL)
VTK_MODULE_INIT(vtkInteractionStyle)
#endif

#include <QFileDialog>
#include <vtkRenderWindow.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>

//QT_BEGIN_NAMESPACE
//namespace Ui { class QtPclViewer; }
//QT_END_NAMESPACE

class QtPclViewer : public QMainWindow
{
    Q_OBJECT

public:
    QtPclViewer(QWidget *parent = nullptr);
    ~QtPclViewer();

private:
    Ui::QtPclViewer *ui;
    // Ui::QtPclViewerClass ui;

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
    void initialVtkWidget();

protected:
    unsigned red;
    unsigned green;
    unsigned blue;
    double size;

    private slots :

       void onOpen();
       void rgbSliderReleased( );
       void pSliderValueChangeed(int value);
       void redSliderValueChangeed(int value);
       void greenSliderValueChangeed(int value);
       void blueSliderValueChangeed(int value);
};
#endif // QTPCLVIEWER_H

main.cpp

#include "qtpclviewer.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtPclViewer w;
    w.show();
    return a.exec();
}

qtpclviewer.cpp

#include "qtpclviewer.h"
#include "ui_qtpclviewer.h"

QtPclViewer::QtPclViewer(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::QtPclViewer)
{
    ui->setupUi(this);

    initialVtkWidget();
    onOpen();

//    connect(ui.actionOpen, SIGNAL(triggered()), this, SLOT(onOpen()));
    connect(ui->horizontalSlider_Size, SIGNAL(valueChanged(int)), this, SLOT(pSliderValueChangeed(int)));//改变大小
    connect(ui->horizontalSlider_Red, SIGNAL(valueChanged(int)), this, SLOT(redSliderValueChangeed(int)));//颜色改变
    connect(ui->horizontalSlider_Green, SIGNAL(valueChanged(int)), this, SLOT(greenSliderValueChangeed(int)));
    connect(ui->horizontalSlider_Blue, SIGNAL(valueChanged(int)), this, SLOT(blueSliderValueChangeed(int)));
    connect(ui->horizontalSlider_Red, SIGNAL(sliderReleased( )), this, SLOT(rgbSliderReleased( )));//slider滑动
    connect(ui->horizontalSlider_Green, SIGNAL(sliderReleased( )), this, SLOT(rgbSliderReleased( )));
    connect(ui->horizontalSlider_Blue, SIGNAL(sliderReleased( )), this, SLOT(rgbSliderReleased( )));
}

QtPclViewer::~QtPclViewer()
{
    delete ui;
}

void QtPclViewer::initialVtkWidget()
{
    //初始化颜色及大小信息
    red = 255;
    green = 255;
    blue = 255;
    size = 1.0;
    //点云加载
    cloud.reset(new pcl::PointCloud<pcl::PointXYZ>);
    viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));
    //viewer->addPointCloud(cloud, "cloud");
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, red, green, blue);//自定义点云颜色
    viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "cloud");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, size, "cloud");//设置点云单个点的大小
    ui->qvtkWidget->SetRenderWindow(viewer->getRenderWindow());
    viewer->setupInteractor(ui->qvtkWidget->GetInteractor(), ui->qvtkWidget->GetRenderWindow());
    ui->qvtkWidget->update();
}
void QtPclViewer::onOpen()
{
    QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "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);
        }

        // pcl::io::loadPCDFile("1_over.pcd",*cloud);
        qDebug("cloud->points.size: %ld", cloud->points.size());
        //重新加载点云
        //viewer->updatePointCloud(cloud, "cloud");
        pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, red, green, blue);//自定义点云颜色
        viewer->updatePointCloud<pcl::PointXYZ>(cloud, single_color, "cloud");
        viewer->resetCamera();
        ui->qvtkWidget->update();
    }
}
void QtPclViewer::rgbSliderReleased()
{
    //更新点云颜色
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, red, green, blue);
    viewer->updatePointCloud<pcl::PointXYZ>(cloud, single_color, "cloud");
    ui->qvtkWidget->update();
}

void QtPclViewer::redSliderValueChangeed(int value)
{
    red= value;
}
void QtPclViewer::greenSliderValueChangeed(int value)
{
    green= value;
}
void QtPclViewer::blueSliderValueChangeed(int value)
{
    blue= value;
}

void QtPclViewer::pSliderValueChangeed(int value)
{
    size=double(10+value)/10;
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, size, "cloud");//设置点云单个点的大小
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>single_color(cloud, red, green, blue);
    viewer->updatePointCloud<pcl::PointXYZ>(cloud,single_color, "cloud");
    ui->qvtkWidget->update();
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:04:24  更:2022-03-16 22:06:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:25:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码