我有一個網格模型(.ply文件),我用VTK渲染了它,並改變了攝像機視點。從網格渲染RGB-D圖像
從新相機的角度來看,我該如何渲染RGB和深度圖像?我認爲這可能是光線追蹤,但不知道
編輯
我要生成一個真正的深度圖,而不是僅僅一個深度的可視化。可視化可以通過使用Z緩衝區中的值和0-255之間的縮放來實現,但這不能提供真實的深度信息。
我有一個網格模型(.ply文件),我用VTK渲染了它,並改變了攝像機視點。從網格渲染RGB-D圖像
從新相機的角度來看,我該如何渲染RGB和深度圖像?我認爲這可能是光線追蹤,但不知道
編輯
我要生成一個真正的深度圖,而不是僅僅一個深度的可視化。可視化可以通過使用Z緩衝區中的值和0-255之間的縮放來實現,但這不能提供真實的深度信息。
要從相機,我做了以下獲得真正的世界深度:
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
是在現實世界中的攝像機位置座標。這似乎是竅門
這裏是一個簡短的幾行,如果你已經在應用程序中設置和渲染,這有可能成爲網已使至少一次之後
// 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();
這隻會渲染RGB圖像,深度呢? – Aly
要檢索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。
這隻會將深度形象化,而不是給出真實的深度值 – Aly
比我想象的要容易。謝謝回答。 – Marcassin