在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轴渲染
完成