VTK修炼之道51:图形基本操作进阶_连通区域分析
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道51:图形基本操作进阶_连通区域分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.連通區域分析
許多圖形數據中,并非只包含一個對象(連通區域)。而在處理這些圖形數據時,有時需要對每一個對象單獨處理或者讓其單獨顯示。比如,利用MarchingCube方法提取三維圖像中的等值面,得到的結果往往是存在多個連通的對象區域,這是就需要對圖形數據做連通區域分析,提取每個連通區域并計算其屬性信息,以此來得到需要的連通區域。
下面一個例子來分析VTK中如何對圖形數據做連通區域分析:
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h> #include <vtkSphereSource.h> #include <vtkConeSource.h> #include <vtkAppendPolyData.h> #include <vtkPolyDataConnectivityFilter.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkProperty.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> int main() {vtkSmartPointer<vtkSphereSource> sphereSource =vtkSmartPointer<vtkSphereSource>::New();sphereSource->SetRadius(10);sphereSource->SetThetaResolution(10);sphereSource->SetPhiResolution(10);sphereSource->Update();vtkSmartPointer<vtkConeSource> coneSource =vtkSmartPointer<vtkConeSource>::New();coneSource->SetRadius(5);coneSource->SetHeight(10);coneSource->SetCenter(25, 0, 0);coneSource->Update();vtkSmartPointer<vtkAppendPolyData> appendFilter =vtkSmartPointer<vtkAppendPolyData>::New();appendFilter->AddInputData(sphereSource->GetOutput());appendFilter->AddInputData(coneSource->GetOutput());appendFilter->Update();vtkSmartPointer<vtkPolyDataConnectivityFilter> connectivityFilter =vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();connectivityFilter->SetInputData(appendFilter->GetOutput());connectivityFilter->SetExtractionModeToCellSeededRegions();connectivityFilter->AddSeed(100);connectivityFilter->Update();vtkSmartPointer<vtkPolyDataMapper> originalMapper =vtkSmartPointer<vtkPolyDataMapper>::New();originalMapper->SetInputConnection(appendFilter->GetOutputPort());originalMapper->Update();vtkSmartPointer<vtkActor> originalActor =vtkSmartPointer<vtkActor>::New();originalActor->SetMapper(originalMapper);vtkSmartPointer<vtkPolyDataMapper> extractedMapper =vtkSmartPointer<vtkPolyDataMapper>::New();extractedMapper->SetInputConnection(connectivityFilter->GetOutputPort());extractedMapper->Update();vtkSmartPointer<vtkActor> extractedActor =vtkSmartPointer<vtkActor>::New();extractedActor->SetMapper(extractedMapper);/double leftViewport[4] = { 0.0, 0.0, 0.5, 1.0 };double rightViewport[4] = { 0.5, 0.0, 1.0, 1.0 };vtkSmartPointer<vtkRenderer> leftRenderer =vtkSmartPointer<vtkRenderer>::New();leftRenderer->SetViewport(leftViewport);leftRenderer->AddActor(originalActor);leftRenderer->SetBackground(1, 0, 0);vtkSmartPointer<vtkRenderer> rightRenderer =vtkSmartPointer<vtkRenderer>::New();rightRenderer->SetViewport(rightViewport);rightRenderer->AddActor(extractedActor);rightRenderer->SetBackground(0, 0, 0);vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(leftRenderer);renderWindow->AddRenderer(rightRenderer);renderWindow->SetSize(640, 320);renderWindow->Render();renderWindow->SetWindowName("PolyDataConnectedCompExtract");leftRenderer->ResetCamera();rightRenderer->SetActiveCamera(leftRenderer->GetActiveCamera());vtkSmartPointer<vtkRenderWindowInteractor> interactor =vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);interactor->Initialize();interactor->Start();return 0; }輸出結果為:
2.VTKPolyDataConnectivityFilter類解析
vtk中的vtkPolyDataConnectivityFilter類可以用于實現連通區域分析,該類接受vtkPolyData數據作為輸入。集體使用如下: vtkSmartPointer<vtkPolyDataConnectivityFilter> connectivityFilter =vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();connectivityFilter->SetInputData(appendFilter->GetOutput());connectivityFilter->SetExtractionModeToCellSeededRegions();connectivityFilter->AddSeed(100);connectivityFilter->Update();SetExtractionModeToLargestRegion():用于提取具有最多點數的連通區域; SetExtractionModeToAllRegions():該模式主要用于連通區域標記,配合函數ColorRegionsOn()使用,在連通區域像是的同時,生成一個名為RegionId的點屬性數據。
SetExtractionModeToSpecifiedRegions():該模式用于提取一個或多個連通區域,在該模式下,需要通過AddSpecifiedRegion()來添加西藥提取的區域號,區域號從零開始。 SetExtractionModeToClosestPointRegion():該模式需要使用SetClosestPoint()函數設置一個空間點坐標,執行結果為離該點最近的連通區域。 SetExtractionModeToPointSeededRegions():該模式下需要使用AddSeed()函數添加種子點,提取種子點所在的區域。 SetExtractionModeToCellSeededRegions():該模式下需要使用AddSeed()函數調價種子單元,提取種子單元所在的區域。
3.參看資料
1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3. ?張曉東, 羅火靈. VTK圖形圖像開發進階[M]. 機械工業出版社, 2015.
總結
以上是生活随笔為你收集整理的VTK修炼之道51:图形基本操作进阶_连通区域分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VTK修炼之道50:图形基本操作进阶_网
- 下一篇: 飞鸽传书2012 的网络通信代码