[VTK]VTK的三維模型保存、讀取之保存為vtk格式


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格式文件后再讀取。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM