PCL点云之旅14 - 固定点采样

306 阅读1分钟

实现效果

image.png

image.png

image.png

首先 通过前面几篇文章的学习,我们已经知道了怎么通过用户输入特定的参数,然后对点云模型进行滤波操作。他的本质其实是对点云模型的均匀过滤采样。通过均匀的在点云模型的各个位置采集点信息来对离群点做过滤操作。最后保留点云基本形状

实现步骤

  1. 首先新建一个弹窗。弹窗向QT传递一个参数。我们将这个QString转换成int类型的变量。
  2. 通过导入pcl下面的random_sample来专门处理这个点云均匀过滤
  3. 比如我们传递2000为参数。那么他就会在保留我们点云形状的基础上过滤掉2000个点

代码实现

image.png

  • 固定采样弹窗
// .h文件
#ifndef FILTER_DOWN_DIALOG_H
#define FILTER_DOWN_DIALOG_H

#include <QDialog>

namespace Ui {
class filter_down_dialog;
}

class filter_down_dialog : public QDialog
{
    Q_OBJECT

signals:
    void sendData(QString data);

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

private slots:
    void on_buttonBox_accepted();

private:
    Ui::filter_down_dialog *ui;
};

#endif // FILTER_DOWN_DIALOG_H

//cpp文件
#include "filter_down_dialog.h"
#include "ui_filter_down_dialog.h"

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

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

void filter_down_dialog::on_buttonBox_accepted()
{
    emit sendData(ui->lineEdit->text());
    this->close();
}
  • MainWindow链接
// 固定点采样滤波
void MainWindow::down_filter_press(){
    dialog_filter_down=new filter_down_dialog();
    connect(dialog_filter_down,SIGNAL(sendData(QString)),this,SLOT(down_filter_clicked(QString)));
    if(dialog_filter_down->exec()==QDialog::Accepted){}
    delete dialog_filter_down;
}


//固定点采样
pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_filter_down_sample(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in,int num)
{
    pcl::RandomSample<pcl::PointXYZ> rs;
    rs.setInputCloud(cloud_in);
    rs.setSample(num);//下采样到固定点

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>);
    rs.filter(*cloud_out);

    return cloud_out;

}

void MainWindow::down_filter_clicked(QString data){
    if(cloud.empty()){
        QMessageBox::warning(this,"warning","无点云输入");
        return;
    }else{
        std::cout<<"滤波大小为:"+data.toStdString()<<std::endl;
        if(data.isEmpty()){
            QMessageBox::warning(this,"warning","参数格式错误");
            return ;
        }
        float size=data.toFloat();
        auto cloud_out=pcl_filter_down_sample(cloud.makeShared(),size);
        cloud = *cloud_out;
        int size1 = static_cast<int>(cloud.size());
        QString PointSize = QString("%1").arg(size1);
        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();
    }
}