首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从网格渲染RGB-D图像

从网格渲染RGB-D图像
EN

Stack Overflow用户
提问于 2013-07-15 12:43:21
回答 3查看 1.6K关注 0票数 3

我有一个网格模型(.ply文件),我用VTK渲染了它,并更改了摄像机的视角。

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

编辑

我想要生成一个真正的深度图,而不仅仅是对深度的可视化。可视化可以通过使用Z缓冲区中的值并在0-255之间进行缩放来实现,但这并不能提供真正的深度信息。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-22 17:16:26

为了从摄像机中获取真实世界的深度,我做了以下工作:

代码语言:javascript
复制
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));

其中cam_pos是相机在现实坐标中的位置。这似乎能起作用

票数 4
EN

Stack Overflow用户

发布于 2013-07-17 18:25:47

下面是几行代码,如果您已经设置并呈现了应用程序,这必须在网格至少呈现一次之后进行。

代码语言:javascript
复制
// Screenshot  
vtkSmartPointer<vtkWindowToImageFilter> windowToImageFilter = 
vtkSmartPointer<vtkWindowToImageFilter>::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();

vtkSmartPointer<vtkPNGWriter> writer = 
  vtkSmartPointer<vtkPNGWriter>::New();
writer->SetFileName("screenshot2.png");
writer->SetInputConnection(windowToImageFilter->GetOutputPort());
writer->Write();

这是来自VTK公共Wiki

票数 2
EN

Stack Overflow用户

发布于 2013-07-18 12:52:54

要检索RGB图像,可以使用vtkWindowToImageFilter类,允许从vtkWindow读取数据。对于深度图像,我尝试了一个解决方案,就是使用vtkDepthSortPolyData修改网格上的颜色,然后再从窗口读取。

参见上面的示例:

代码语言:javascript
复制
# define VTK_CREATE(type, nom) vtkSmartPointer<type> nom = vtkSmartPointer<type>::New()
int main ()
   {
      VTK_CREATE(vtkPLYReader, reader);
      reader->SetFileName ("mesh.ply");
      reader->Update ();

      // create depth sort algo
      VTK_CREATE(vtkDepthSortPolyData, sort);
      sort->SetInput(reader->GetOutput ());

      // init stuff for rendering
      VTK_CREATE(vtkPolyDataMapper, mapper);
      VTK_CREATE(vtkActor, actor);
      VTK_CREATE(vtkRenderer, rend);
      VTK_CREATE(vtkRenderWindow, rw);
      VTK_CREATE(vtkRenderWindowInteractor, inte);

      VTK_CREATE(vtkCamera, cam);
      sort->SetDirectionToBackToFront (); // camera direction
      sort->SetCamera (cam); // set camera or runtime warning
      sort->SortScalarsOn ();
      sort->Update ();

      mapper->SetScalarVisibility(true);

      // limit max scalar (nb Color)
      mapper->SetScalarRange (0, sort->GetOutput ()->GetNumberOfCells ());
      mapper->SetInputConnection(sort->GetOutputPort ());
      mapper->Update ();

      actor->SetMapper(mapper);
      actor->RotateY (59); // transform with a rotation to see depth
      actor->GetProperty()->SetColor(1, 0, 0);
      sort->SetProp3D (actor); // set the actor to the algo

      rend->SetActiveCamera (cam);
      rw->AddRenderer(rend);
      rend->AddActor(actor);
      inte->SetRenderWindow (rw);

      inte->Initialize ();

      // read depth image from vtk Window
      VTK_CREATE (vtkWindowToImageFilter, screen);
      screen->SetInput (rw);
      screen->Update ();
      // start rendering for visualization
      rw->Render ();

      // save the depth img as a png
      VTK_CREATE(vtkPNGWriter, writer);
      writer->SetFileName ("output.png");
      writer->SetInputConnection (screen->GetOutputPort ());
      writer->Write ();

      inte->Start ();
      return 0;
    }

在VTK 5.10上测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17654545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档