0. begin
基於VTK的模型構建以后經常需要對模型進行保存,當然我不想保存為一個二維的圖像格式
因為那樣重新讀取太過復雜,如果能將之進行保存為模型類似的格式那么以后就只需要直接讀取即可。
三維模型格式應該較多,百度、谷歌都沒有找到較多的范例,不過還是有可使用的,這里只介紹.vtk 格式。
首先介紹一下本文中使用的方法所用到的主要的類:
vtkDataWriter
vtkPolyDataWriter is a source object that writes ASCII or binary polygonal data files in vtk format. See text for format details.
http://www.vtk.org/doc/nightly/html/classvtkPolyDataWriter.html#details
vtkDataReader
http://www.vtk.org/doc/nightly/html/classvtkDataReader.html
具體介紹請看上面鏈接。
1. detail
接下來具體介紹保存的方法:
vtkSmartPointer<vtkPolyDataWriter> vtkWriter = vtkSmartPointer<vtkPolyDataWriter>::New(); vtkWriter->SetInput(skinExtractor->GetOutput()); vtkWriter->SetFileName("test.vtk"); vtkWriter->Write();
很簡單吧!只需要設置一下輸入以及保存的文件名即可。
setinput的參數如何設置就依看官而定了。
讀取更是容易
vtkSmartPointer<vtkPolyDataReader> vtkReader = vtkSmartPointer<vtkPolyDataReader>::New(); vtkReader->SetFileName("test.vtk");
下面提供整個源代碼:
1. 讀入序列圖像提取輪廓構建模型並保存:
其中涉及到使用的圖像數據這部分就由看官使用自己的構建步驟說使用素材替代即可。
void build3DView() { vtkSmartPointer<vtkRenderer> aRenderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New(); renWin->AddRenderer(aRenderer); vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New(); iren->SetRenderWindow(renWin); vtkSmartPointer<vtkJPEGReader> dicomReader = vtkSmartPointer<vtkJPEGReader>::New(); dicomReader->SetFilePrefix("C:/Users/DawnWind/Desktop/000/"); dicomReader->SetFilePattern("%s%d.jpg"); dicomReader->SetDataByteOrderToLittleEndian(); //dicomReader->SetDataSpacing(1, 0.925, 1.2); dicomReader->SetDataSpacing(1, 1, 1.4); dicomReader->SetFileNameSliceSpacing(1); //dicomReader->SetDataExtent(0, 209, 0, 209, 0, 83); dicomReader->SetDataExtent(0, 209, 0, 209, 0, 29); dicomReader->Update(); vtkSmartPointer<vtkContourFilter> skinExtractor = vtkSmartPointer<vtkContourFilter>::New(); skinExtractor->SetInputConnection(dicomReader->GetOutputPort()); skinExtractor->SetValue(0, 100); //值越大,保留的部分越少。 // VTK 保存 vtkSmartPointer<vtkPolyDataWriter> vtkWriter = vtkSmartPointer<vtkPolyDataWriter>::New(); vtkWriter->SetInput(skinExtractor->GetOutput()); vtkWriter->SetFileName("test.vtk"); vtkWriter->Write(); // Render renWin->Render(); // Initialize the event loop and then start it. iren->Initialize(); iren->Start(); }
2. 讀取文件
讀入以后也需要做構建平面之類的基本工作,以便顯示
void readVTKFile() { vtkSmartPointer<vtkRenderer> aRenderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New(); renWin->AddRenderer(aRenderer); vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New(); iren->SetRenderWindow(renWin); vtkSmartPointer<vtkPolyDataReader> vtkReader = vtkSmartPointer<vtkPolyDataReader>::New(); vtkReader->SetFileName("test.vtk"); vtkSmartPointer<vtkPolyDataMapper> skinMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); skinMapper->SetInputConnection(vtkReader->GetOutputPort()); skinMapper->ScalarVisibilityOff(); //這樣不會帶顏色 vtkSmartPointer<vtkActor> skin = vtkSmartPointer<vtkActor>::New(); skin->SetMapper(skinMapper); vtkSmartPointer<vtkCamera> aCamera = vtkSmartPointer<vtkCamera>::New(); aCamera->SetViewUp (0, 0, -1); aCamera->SetPosition (0, 1, 0); aCamera->SetFocalPoint (0, 0, 0); aCamera->ComputeViewPlaneNormal(); aCamera->Azimuth(30.0); aCamera->Elevation(30.0); aCamera->Dolly(1.5); aRenderer->AddActor(skin); aRenderer->SetActiveCamera(aCamera); aRenderer->ResetCamera (); aRenderer->SetBackground(.2, .3, .4); aRenderer->ResetCameraClippingRange (); renWin->Render(); iren->Initialize(); iren->Start(); }
下面是調用readVTKFile函數進行讀取的結果:
PS: 由於本人是使用分開的獨立兩個函數因此需要先調用build函數構建模型待生成了vtk格式文件后再讀取。