从网格渲染RGB-D图像


star
2025-03-10 01:29:55 (12天前)
  1. 我有一个网格


模型
</跨度>
(.ply文件)我用VTK渲染它并改变了摄像机视点。

从新的相机视角,我如何渲染RGB和深度图像?我认为这可能是光线追踪,但不确定

编辑

我想生成一个真正的深度图,而不是一个

可视化
</跨度>
深度。该

可视化
</跨度>
可以通过使用Z缓冲区中的值并在0-255之间缩放来实现,但这不提供真实的深度信息。
锟斤拷

4 条回复
  1. 0# v-star*위위 | 2019-08-31 10-32



    为了从相机获得真实世界的深度,我做了以下工作:




    1. double z = render_win->GetZbufferDataAtPoint(x,y);
      worldPicker->Pick(x, y, z, renderer);
      worldPicker->GetPickPosition(coords);
      double euclidean_distance = sqrt(pow((coords[0] - cam_pos[0]), 2) + pow(coords[1] - cam_pos[1], 2) + pow(coords[2] - cam_pos[2], 2));

    2. </code>


    哪里

    cam_pos

    是真实世界坐标中的摄像机位置。这似乎可以解决问题


  2. 1# 不见你 | 2019-08-31 10-32



    如果你已经有应用程序设置和渲染,这里有几行,这必须在网格渲染至少一次之后




    1. // Screenshot
      vtkSmartPointer windowToImageFilter =
      vtkSmartPointer::New();
      windowToImageFilter->SetInput(renderWindow);
      windowToImageFilter->SetMagnification(3); //set the resolution of the output image (3 times the current resolution of vtk render window)
      windowToImageFilter->SetInputBufferTypeToRGBA(); //also record the alpha (transparency) channel
      windowToImageFilter->Update();

    2. vtkSmartPointer writer =
      vtkSmartPointer::New();
      writer->SetFileName(“screenshot2.png”);
      writer->SetInputConnection(windowToImageFilter->GetOutputPort());
      writer->Write();

    3. </code>


    这是来自

    VTK公共维基


  3. 2# 一生浮华 | 2019-08-31 10-32



    要检索RGB图像,您可以使用

    vtkWindowToImageFilter

    class,允许从vtkWindow读取数据。
    对于深度图像,我尝试了一种解决方案,即使用修改网格上的颜色

    vtkDepthSortPolyData

    ,再次,从窗口阅读。



    见上面的例子:



    1.   # define VTK_CREATE(type, nom) vtkSmartPointer<type> nom = vtkSmartPointer<type>::New()
    2. int main ()
      {
      VTK_CREATE(vtkPLYReader, reader);
      reader->SetFileName (“mesh.ply”);
      reader->Update ();

    3.   // create depth sort algo
    4.   VTK_CREATE(vtkDepthSortPolyData, sort);
    5.   sort->SetInput(reader->GetOutput ());
    6.   // init stuff for rendering
    7.   VTK_CREATE(vtkPolyDataMapper, mapper);
    8.   VTK_CREATE(vtkActor, actor);
    9.   VTK_CREATE(vtkRenderer, rend);
    10.   VTK_CREATE(vtkRenderWindow, rw);
    11.   VTK_CREATE(vtkRenderWindowInteractor, inte);
    12.   VTK_CREATE(vtkCamera, cam);
    13.   sort->SetDirectionToBackToFront (); // camera direction
    14.   sort->SetCamera (cam); // set camera or runtime warning
    15.   sort->SortScalarsOn ();
    16.   sort->Update ();
    17.   mapper->SetScalarVisibility(true);
    18.   // limit max scalar (nb Color)
    19.   mapper->SetScalarRange (0, sort->GetOutput ()->GetNumberOfCells ());
    20.   mapper->SetInputConnection(sort->GetOutputPort ());
    21.   mapper->Update ();
    22.   actor->SetMapper(mapper);
    23.   actor->RotateY (59); // transform with a rotation to see depth
    24.   actor->GetProperty()->SetColor(1, 0, 0);
    25.   sort->SetProp3D (actor); // set the actor to the algo
    26.   rend->SetActiveCamera (cam);
    27.   rw->AddRenderer(rend);
    28.   rend->AddActor(actor);
    29.   inte->SetRenderWindow (rw);
    30.   inte->Initialize ();
    31.   // read depth image from vtk Window
    32.   VTK_CREATE (vtkWindowToImageFilter, screen);
    33.   screen->SetInput (rw);
    34.   screen->Update ();
    35.   // start rendering for visualization
    36.   rw->Render ();
    37.   // save the depth img as a png
    38.   VTK_CREATE(vtkPNGWriter, writer);
    39.   writer->SetFileName ("output.png");
    40.   writer->SetInputConnection (screen->GetOutputPort ());
    41.   writer->Write ();
    42.   inte->Start ();
    43.   return 0;
    44. }
    45. </code>


    在VTK 5.10上测试过。


登录 后才能参与评论