pcl+vtk(十)八叉树可视化显示

一、八叉树简单介绍

八叉树(Octree)是一种空间划分结构,是一种二叉树的扩展,每个节点可以最多有8个子节点。

二、八叉树在VTK中的使用

1.直接加载ply文件显示八叉树

    vtkSmartPointer<vtkPLYReader> PLYReader = vtkSmartPointer<vtkPLYReader>::New();
    QString fileName = QFileDialog::getOpenFileName(this, "Open PLY", ".", "Open PCD files(*.ply)");
    if(fileName == "") return;
    PLYReader->SetFileName(fileName.toStdString().c_str());
    PLYReader->Update();

    //八叉树
    vtkSmartPointer<vtkOctreePointLocator> octree = vtkSmartPointer<vtkOctreePointLocator>::New();
    octree->SetMaximumPointsPerRegion(5);
    octree->SetDataSet(PLYReader->GetOutput());
    octree->BuildLocator();

    //数据
    vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
    octree->GenerateRepresentation(0, polydata);

    //映射
    vtkSmartPointer<vtkPolyDataMapper> octreeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    octreeMapper->SetInputData(polydata);

    //演员
    vtkSmartPointer<vtkActor> octreeActor = vtkSmartPointer<vtkActor>::New();
    octreeActor->SetMapper(octreeMapper);
    octreeActor->GetProperty()->SetInterpolationToFlat();// 设置对象的着色插值方法。
    octreeActor->GetProperty()->SetRepresentationToWireframe();// 控制对象的曲面几何图形表达。
    octreeActor->GetProperty()->SetColor((float)233/255,(float)233/255,(float)233/255);

    octree->GenerateRepresentation(7, polydata);//创建八叉树区域边界的多数据表示。

    renderer->AddActor(octreeActor);

    renderer->ResetCamera();
    ui->vtk_widget->GetRenderWindow()->Render();

2.根据点云数据显示八叉树

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");
    if(fileName == "") return;
    pcl::io::loadPCDFile<pcl::PointXYZ>(fileName.toStdString(), *cloud);

    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    for (int i = 0; i<cloud->size(); i++)
    {
        points->InsertNextPoint(cloud->at(i).x, cloud->at(i).y, cloud->at(i).z);
    }
    //数据
    vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();;
    polyData->SetPoints(points);
    //八叉树
    vtkSmartPointer<vtkOctreePointLocator> octree = vtkSmartPointer<vtkOctreePointLocator>::New();
    octree->SetMaximumPointsPerRegion(5);
    octree->SetDataSet(polyData);
    octree->BuildLocator();
    //映射
    vtkSmartPointer<vtkPolyDataMapper> mapperpointCloud_points = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapperpointCloud_points->SetInputData(polyData);
    //演员
    vtkSmartPointer<vtkActor> octreeActor = vtkSmartPointer<vtkActor>::New();
    octreeActor->GetProperty()->SetInterpolationToFlat();// 设置对象的着色插值方法。
    octreeActor->GetProperty()->SetRepresentationToWireframe();// 控制对象的曲面几何图形表达。
    octreeActor->GetProperty()->SetColor((float)200/255,(float)200/255,(float)200/255);
    octreeActor->SetMapper(mapperpointCloud_points);
    octree->GenerateRepresentation(8, polyData);//创建八叉树区域边界的多数据表示。
    
    renderer->AddActor(octreeActor);
    
    renderer->ResetCamera();
    ui->vtk_widget->GetRenderWindow()->Render();

 三、运行结果

可以修改    octree->GenerateRepresentation(8, polyData);中的数值来改变八叉树网格大小。

猜你喜欢

转载自blog.csdn.net/m0_67254672/article/details/134396034