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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 《QT+PCL 第三章》结合CGAL实现点云上采样 -> 正文阅读

[数据结构与算法]《QT+PCL 第三章》结合CGAL实现点云上采样

前言

本节主要将CGAL中上采用功能添加到QT软件中。
参考链接:CGAL实现点云上采样

一、效果展示

在这里插入图片描述

二、核心代码

1、点云增采用代码

std::vector<PointVectorPair>cgal_unsampling(std::vector<PointVectorPair> points,double sharpness_angle,double edge_sensitivity,
                                          double neighbor_radius, int number_of_output_points )
{
    //std::vector<PointVectorPair> out_points;
    CGAL::edge_aware_upsample_point_set<Concurrency_tag>(
        points,std::back_inserter(points),
        CGAL::parameters::point_map(CGAL::First_of_pair_property_map<PointVectorPair>()).
        normal_map(CGAL::Second_of_pair_property_map<PointVectorPair>()).
        sharpness_angle(sharpness_angle).
        edge_sensitivity(edge_sensitivity).
        neighbor_radius(neighbor_radius).
        number_of_output_points(number_of_output_points));
    return points;
}

参数设置:

在这里插入图片描述

2、pcl点云与CGAL点云相互转化

		//pcl->CGAL
        std::vector<PointVectorPair> cgal_cloud;
        for(int i=0;i<cloud_with_normals->size();i++)
        {
           double px=cloud_with_normals->points[i].x;
           double py=cloud_with_normals->points[i].y;
           double pz=cloud_with_normals->points[i].z;
           double nx=cloud_with_normals->points[i].normal_x;
           double ny=cloud_with_normals->points[i].normal_y;
           double nz=cloud_with_normals->points[i].normal_z;
           cgal_cloud.push_back(PointVectorPair(CGAL_Point(px,py,pz),Vector(nx,ny,nz)));
        }

		//CGAL-pcl
		for(int i=0;i<cgal_cloud.size();i++)
        {
            pcl::PointXYZ p;
           	CGAL_Point p_temp=cgal_cloud[i].first;
            p.x=p_temp.hx();
            p.y=p_temp.hy();
            p.z=p_temp.hz();
            cloud.push_back(p);
        }
		

三、QT设置

1、ui设置与相关文件设置
新建Filter_upsamping.ui,会自动生成filter_upsampling.h与filter_upsampling.cpp
1)ui设置
2).h文件设置
3).cpp文件设置

1)ui设置与布局
在这里插入图片描述
在这里插入图片描述

2).h文件

#ifndef FILTER_UNSAMPLING_H
#define FILTER_UNSAMPLING_H

#include <QDialog>

namespace Ui {
class Filter_unsampling;
}

class Filter_unsampling : public QDialog
{
    Q_OBJECT
signals:
    void sendData(QString data1,QString data2,QString data3,QString data4);

public:
    explicit Filter_unsampling(QWidget *parent = nullptr);
    ~Filter_unsampling();

private slots:
    void on_buttonBox_accepted();

private:
    Ui::Filter_unsampling *ui;
};

#endif // FILTER_UNSAMPLING_H

3).cpp文件

#include "filter_unsampling.h"
#include "ui_filter_unsampling.h"

Filter_unsampling::Filter_unsampling(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Filter_unsampling)
{
    ui->setupUi(this);
}

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

void Filter_unsampling::on_buttonBox_accepted()
{
    emit sendData(ui->lineEdit->text(),ui->lineEdit_2->text(),ui->lineEdit_3->text(),ui->lineEdit_4->text());

    this->close();
}

2、CGAL_function设置
类似于pcl_function,创建CGAL_function.h与.cpp文件,实现CGAL中相关算法。
1)cgal_function.h文件
2)cgal_function.cpp文件

1).h文件
#ifndef CGAL_FUNCTION_H
#define CGAL_FUNCTION_H


#include <CGAL/Simple_cartesian.h>
#include <CGAL/edge_aware_upsample_point_set.h>
#include <CGAL/IO/read_points.h>
#include <CGAL/IO/write_points.h>
#include <string>
#include <vector>
#include <fstream>

typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_3 CGAL_Point;
typedef Kernel::Vector_3 Vector;
typedef std::pair<CGAL_Point, Vector> PointVectorPair;
typedef CGAL::Parallel_if_available_tag Concurrency_tag;


std::vector<PointVectorPair>cgal_unsampling(std::vector<PointVectorPair> points,double sharpness_angle,double edge_sensitivity,
                                          double neighbor_radius, int number_of_output_points );

#endif // CGAL_FUNCTION_H

2).cpp文件

#include "cgal_function.h"

std::vector<PointVectorPair>cgal_unsampling(std::vector<PointVectorPair> points,double sharpness_angle,double edge_sensitivity,
                                          double neighbor_radius, int number_of_output_points )
{
    //std::vector<PointVectorPair> out_points;
    CGAL::edge_aware_upsample_point_set<Concurrency_tag>(
        points,std::back_inserter(points),
        CGAL::parameters::point_map(CGAL::First_of_pair_property_map<PointVectorPair>()).
        normal_map(CGAL::Second_of_pair_property_map<PointVectorPair>()).
        sharpness_angle(sharpness_angle).
        edge_sensitivity(edge_sensitivity).
        neighbor_radius(neighbor_radius).
        number_of_output_points(number_of_output_points));
    return points;
}

3、mainwindow设置
1).h文件:添加相关头文件,槽函数声明;
2).cpp文件:添加action、connect action到槽函数、槽函数实现

1).h文件

#include <cgal_function.h>//头文件

private slots://槽函数

    void pressBtn_unsampling();//上采样

    void Unsampling_clicked(QString data1,QString data2,QString data3,QString data4);
    
private:

	Filter_unsampling *dialog_unsampling;

2).cpp文件

//构造函数
{
//创建action,并添加到目录

//connect action to slot function
connect(UpSample_action,SIGNAL(triggered()),this,SLOT(pressBtn_unsampling()));
 
}
//槽函数实现
void MainWindow::pressBtn_unsampling()
{
    dialog_unsampling=new Filter_unsampling();

    connect(dialog_unsampling,SIGNAL(sendData(QString,QString,QString,QString)),this,
            SLOT(Unsampling_clicked(QString,QString,QString,QString)));

    if(dialog_unsampling->exec()==QDialog::Accepted){}

    delete dialog_unsampling;
}

//上采样
void MainWindow::Unsampling_clicked(QString data1,QString data2,QString data3,QString data4)
{

    if(cloud.empty())
    {
        QMessageBox::warning(this, "Warning","无点云输入!");

        return;
    }
    else
    {
        if(data1.isEmpty()||data2.isEmpty()||data3.isEmpty()||data4.isEmpty())
        {
            QMessageBox::warning(this, "Warning","参数格式输入错误!");

            return;
        }
        //up采样滤波
        double  sharpness_angle =data1.toDouble();
        double  edge_sensitivity =data2.toDouble();
        double  neighbor_radius =data3.toDouble();
        int  number_of_output_points  =data4.toInt();


        //计算法线
        auto normals=pcl_feature_normals_k(cloud.makeShared(),10);
        auto cloud_with_normals=pcl_base_cloudwithnormals(cloud.makeShared(),normals);


        //转换为cgal格式
        std::vector<PointVectorPair> cgal_cloud;
        for(int i=0;i<cloud_with_normals->size();i++)
        {

           double px=cloud_with_normals->points[i].x;
           double py=cloud_with_normals->points[i].y;
           double pz=cloud_with_normals->points[i].z;
           double nx=cloud_with_normals->points[i].normal_x;
           double ny=cloud_with_normals->points[i].normal_y;
           double nz=cloud_with_normals->points[i].normal_z;
           cgal_cloud.push_back(PointVectorPair(CGAL_Point(px,py,pz),Vector(nx,ny,nz)));
        }

        cgal_cloud=cgal_unsampling(cgal_cloud,sharpness_angle, edge_sensitivity,neighbor_radius,  number_of_output_points*cgal_cloud.size());

        cloud.clear();

        for(int i=0;i<cgal_cloud.size();i++)
        {
            pcl::PointXYZ p;
            CGAL_Point p_temp=cgal_cloud[i].first;

            p.x=p_temp.hx();
            p.y=p_temp.hy();
            p.z=p_temp.hz();

            cloud.push_back(p);
        }


        ui->textBrowser->clear();
        QString PointSize = QString("%1").arg(cloud.size());
        ui->textBrowser->insertPlainText("点云数量: "+PointSize);
        ui->textBrowser->setFont(QFont( "Arial" , 9 ,QFont::Normal ));

        viewer->removeAllPointClouds();
        viewer->removeAllShapes();
        viewer->addPointCloud(cloud.makeShared() ,cloud_name[0]);
        viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, point_size, cloud_name[0]);
        viewer->resetCamera();
        ui->qvtkWidget->update();
    }

}

四、结语

qmake、构建一下,至此,QT中添加CGAL的点云上采样功能至此结束。
CGAL中还有很多优秀的点云、网格的处理算法,以后会陆陆续续加入进来。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:42:57  更:2022-04-09 18:45:15 
 
开发: 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/26 9:39:54-

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