JayNicht 2024-02-18 22:53 采纳率: 28.6%
浏览 866
已结题

VTK+PCLVisualizer显示大量点云时卡顿

我在项目中使用QT+VTK+PCLVisualizer进行点云可视化,实际使用时发现,这种方式在展示大量点云(百万级左右)时,就会有些卡顿,帧数明显降低,拖动视角时甚至会有延迟。但同样的点云在PCLVisualizer中直接展示则十分流畅,没有问题。
检查CPU、GPU占用均不到20%。
请问针对以上情况有什么优化VTK可视化点云的方法。
VTK+PCLVisualizer的代码内容:

    vtkSmartPointer<vtkRenderer> VTKRenderer = vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkGenericOpenGLRenderWindow> VTKRenderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
    pcl::visualization::PCLVisualizer::Ptr viewer;
    VTKRenderWindow->AddRenderer(VTKRenderer);
    viewer.reset(new pcl::visualization::PCLVisualizer(VTKRenderer, VTKRenderWindow, "viewer", false));
    this->setRenderWindow(VTKRenderWindow);
    viewer->setupInteractor(this->interactor(), VTKRenderWindow);
  • 写回答

19条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-02-18 22:53
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    针对在VTK+PCLVisualizer中显示大量点云时出现的卡顿问题,可以从以下几个方面进行优化:

    1. 减少点云渲染负载

      • 点抽稀:对原始点云数据进行降采样处理,例如使用PCL中的pcl::ApproximateVoxelGridpcl::UniformSampling滤波器来减少点的数量。
      pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_downsampled(new pcl::PointCloud<pcl::PointXYZ>);
      pcl::ApproximateVoxelGrid<pcl::PointXYZ> voxel_grid;
      voxel_grid.setLeafSize(0.01f, 0.01f, 0.01f); // 调整体素大小以适应需求
      voxel_grid.setInputCloud(cloud);
      voxel_grid.filter(*cloud_downsampled);
      viewer->addPointCloud<pcl::PointXYZ>(cloud_downsampled, "downsampled_cloud");
      
    2. LOD(Level of Detail)策略

      • 使用不同的细节级别根据相机视角和距离动态调整点云的绘制复杂度。虽然VTK本身不直接支持LOD,但可以通过自定义vtkMapper实现。
    3. 硬件加速

      • 确保VTK和系统正确地利用GPU资源进行图形渲染。检查OpenGL版本,并尝试启用深度缓存、模板测试等优化技术。
      • 在VTKRenderer上启用硬件加速特性(如果适用)。
    4. 渲染优化设置

      • 设置点大小适中,过大的点会消耗更多像素填充和混合时间。
      vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
      // ... 初始化颜色数组 ...
      vtkSmartPointer<vtkPointSource> pointSource = vtkSmartPointer<vtkPointSource>::New();
      pointSource->SetNumberOfPoints(cloud_downsampled->size());
      pointSource->Update();
      
      vtkSmartPointer<vtkPolyData> polydata = pointSource->GetOutput();
      polydata->GetPointData()->SetScalars(colors);
      
      vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New();
      mapper->SetInputData(polydata);
      mapper->SetScalarModeToUsePointData();
      mapper->SetInterpolateScalarsBeforeMapping(false); // 可能需要关闭插值
      mapper->SetPointSize(3); // 根据实际情况调整
      
      vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
      actor->SetMapper(mapper);
      
      VTKRenderer->AddActor(actor);
      
    5. 交互性能优化

      • 当拖动视角时,可以暂停点云更新,只在鼠标释放后或视角变化结束时再更新视图,避免不必要的渲染计算。
    6. 内存管理

      • 避免一次性加载所有点云,可采用流式加载或者分块加载的方式。
    7. 多线程处理

      • 如果CPU占用不高,可能是因为瓶颈在于单线程渲染,考虑将数据预处理、点云生成与渲染过程分离到多个线程中执行。
    8. VTK内部优化

      • 尝试升级到最新版VTK,新版本往往包含更多的性能优化。
    9. 定制化解决方案

      • 对于极端情况下的大数据集可视化,可能需要开发专门针对点云的大规模可视化的解决方案,如基于WebGL的云端渲染服务或其他高性能可视化库。

    以上提到的代码片段仅作为示例参考,实际应用中应结合具体项目需求进行修改和完善。对于百万级点云的流畅展示,上述方法并不能保证完全解决卡顿问题,但通常能够显著改善用户体验。在优化过程中,务必持续关注并分析性能瓶颈所在,针对性地实施改进措施。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月26日
  • 创建了问题 2月18日