2013-07-15 105 views
3

我有一個網格模型(.ply文件),我用VTK渲染了它,並改變了攝像機視點。從網格渲染RGB-D圖像

從新相機的角度來看,我該如何渲染RGB和深度圖像?我認爲這可能是光線追蹤,但不知道

編輯

我要生成一個真正的深度圖,而不是僅僅一個深度的可視化。可視化可以通過使用Z緩衝區中的值和0-255之間的縮放來實現,但這不能提供真實的深度信息。

回答

4

要從相機,我做了以下獲得真正的世界深度:

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是在現實世界中的攝像機位置座標。這似乎是竅門

+1

比我想象的要容易。謝謝回答。 – Marcassin

2

這裏是一個簡短的幾行,如果你已經在應用程序中設置和渲染,這有可能成爲網已使至少一次之後

// 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 Public Wiki

+0

這隻會渲染RGB圖像,深度呢? – Aly

1

要檢索RGB圖像,您可以使用vtkWindowToImageFilter類,從而允許從vtkWindow讀取數據。 對於深度圖像,我嘗試了一種解決方案,使用vtkDepthSortPolyData修改網格上的顏色,並再次從窗口讀取。

見上面的例子:

# 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。

+0

這隻會將深度形象化,而不是給出真實的深度值 – Aly