qt,使用vtk完成点云数量显示,点云高程渲染

在ui界面添加一个textbrowser

在上一篇打开点云文件open_clicked的槽函数中添加一段代码

       //...其余代码

       // 从文件读取点云数据
       pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
       if (pcl::io::loadPCDFile<pcl::PointXYZ>(filename.toStdString(), *cloud) == -1) {
           PCL_ERROR("Could not read .pcd file\n");
           return;
       }


       // 获取点云中点的数量并将其转换为字符串
       int point_num = cloud->size();
       QString point_num_str = QString::number(point_num);
       // 在textbrowser中显示点云中点的数量
       ui->textBrowser->append("点云中点的数量为:" + point_num_str);


       // 将点云数据转换为VTK的点数据
       vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
       for (size_t i = 0; i < cloud->size(); ++i) {
           pcl::PointXYZ p = cloud->at(i);
           points->InsertNextPoint(p.x, p.y, p.z);
       }

      //...其余代码

点云高程渲染
在ui界面添加3个pushbutton,名字更改为X,Y,Z,分别右键转到槽...
修改成如下

void MainWindow::on_pushButton_2_clicked()
{
    QString axis="x";
        Rendering_setting(axis);
}
void MainWindow::on_pushButton_3_clicked()
{
    QString axis="y";
        Rendering_setting(axis);
}
void MainWindow::on_pushButton_4_clicked()
{
    QString axis="z";
        Rendering_setting(axis);
}

在mainwindow.h下添加定义高程渲染的函数,可以在private slots:上面新输入个public slots:,将下面一行代码放其下面

void MainWindow::Rendering_setting(QString data)

转到mainwindow.cpp下,添加高程渲染

//高程渲染
void MainWindow::Rendering_setting(QString data)
{
    // 从QVTKOpenGLWidget中获取vtkRenderWindow
    vtkRenderWindow* renderWindow = ui->qvtkWidget->GetRenderWindow();
    // 获取renderer和actor
    vtkRenderer* renderer = renderWindow->GetRenderers()->GetFirstRenderer();
    vtkActor* actor = renderer->GetActors()->GetLastActor();

    // 创建VTK的高程渲染对象
    vtkSmartPointer<vtkElevationFilter> elevationFilter = vtkSmartPointer<vtkElevationFilter>::New();
    elevationFilter->SetInputConnection(actor->GetMapper()->GetInputConnection(0, 0));

    // 根据传入的轴参数设置高程渲染参数
    if (data == "x") {
        elevationFilter->SetLowPoint(actor->GetBounds()[0], 0, 0);
        elevationFilter->SetHighPoint(actor->GetBounds()[1], 0, 0);
    }
    else if (data == "y") {
        elevationFilter->SetLowPoint(0, actor->GetBounds()[2], 0);
        elevationFilter->SetHighPoint(0, actor->GetBounds()[3], 0);
    }
    else if (data == "z") {
        elevationFilter->SetLowPoint(0, 0, actor->GetBounds()[4]);
        elevationFilter->SetHighPoint(0, 0, actor->GetBounds()[5]);
    }
    else {
        // 如果传入的参数不是x、y或z,则返回
        return;
    }

    // 创建VTK的mapper和actor
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(elevationFilter->GetOutputPort());
    actor->SetMapper(mapper);

    // 更新渲染窗口
    renderWindow->Render();
}

其中,根据传入的轴参数设置高程渲染参数中,actor->GetBounds()[0]actor->GetBounds()[1] 分别获取了点云数据的最小和最大x坐标,这里将这两个值作为高程渲染的最低点和最高点的x坐标。由于这里只需要在x轴上进行高程渲染,所以y和z坐标都设置为0。这样就可以将整个点云的x轴范围作为高程渲染的范围,从而使得高度信息在x轴方向上呈现。另外两轴同理。

运行

x轴渲染 

 y轴渲染

 z轴渲染

 完成

在Ubuntu上配置Qt应用使用VTK( Visualization Toolkit)显示点云,你需要几个步骤: 1. **安装依赖**: - 首先,更新包列表并安装必要的软件包,如`qt5-default`, `libqt5svg5-dev`, 和 `libvtk7-dev`: ``` sudo apt-get update && sudo apt-get install qt5-default libqt5svg5-dev libvtk7-dev ``` 2. **下载和构建VTK**: - 如果需要最新版本的VTK,你可以从官网下载源码,并按照官方文档进行编译。通常在`src`目录下运行`./configure`,然后`make`和`sudo make install`。 3. **集成VTKQt项目**: - 使用Qt Creator创建新项目时,选择QMake作为工程类型,然后在.pro文件中添加VTK库引用: ```pro QT += opengl vtkwidgets includePATH += /usr/include/vtk-7.0 LIBS += -L/usr/lib/x86_64-linux-gnu/vtk-7.0 -lvtkCommonWidgets -lvtkFiltersPoints -lvtkRenderingFreeType -lvtkRenderingContextOpenGL2 -lvtkImagingCore -lvtkFiltersSources ``` 或者如果你使用CMake,会在CMakeLists.txt中类似设置。 4. **编写代码**: - 在你的Qt源代码中,导入所需的VTK头文件,例如`#include <vtkSmartPointer.h>`, 然后创建和渲染点云数据: ```cpp vtkSmartPointer<vtkPolyDataMapper> mapper; mapper->SetInputConnection(pointCloudReader->GetOutputPort()); actor->SetMapper(mapper); scene->AddActor(actor); ``` 其中`pointCloudReader`是一个代表VTK读取点云的类,比如`vtkXMLPolyDataReader`。 5. **显示**: - 最后,在窗口中设置并显示VTK场景: ```cpp renderer->ResetCamera(); renderWindow->Render(); ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值