VTK修炼之道51:图形基本操作进阶_连通区域分析
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道51:图形基本操作进阶_连通区域分析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.連通區(qū)域分析
許多圖形數(shù)據(jù)中,并非只包含一個對象(連通區(qū)域)。而在處理這些圖形數(shù)據(jù)時,有時需要對每一個對象單獨(dú)處理或者讓其單獨(dú)顯示。比如,利用MarchingCube方法提取三維圖像中的等值面,得到的結(jié)果往往是存在多個連通的對象區(qū)域,這是就需要對圖形數(shù)據(jù)做連通區(qū)域分析,提取每個連通區(qū)域并計算其屬性信息,以此來得到需要的連通區(qū)域。
下面一個例子來分析VTK中如何對圖形數(shù)據(jù)做連通區(qū)域分析:
#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; }輸出結(jié)果為:
2.VTKPolyDataConnectivityFilter類解析
vtk中的vtkPolyDataConnectivityFilter類可以用于實(shí)現(xiàn)連通區(qū)域分析,該類接受vtkPolyData數(shù)據(jù)作為輸入。集體使用如下: vtkSmartPointer<vtkPolyDataConnectivityFilter> connectivityFilter =vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();connectivityFilter->SetInputData(appendFilter->GetOutput());connectivityFilter->SetExtractionModeToCellSeededRegions();connectivityFilter->AddSeed(100);connectivityFilter->Update();SetExtractionModeToLargestRegion():用于提取具有最多點(diǎn)數(shù)的連通區(qū)域; SetExtractionModeToAllRegions():該模式主要用于連通區(qū)域標(biāo)記,配合函數(shù)ColorRegionsOn()使用,在連通區(qū)域像是的同時,生成一個名為RegionId的點(diǎn)屬性數(shù)據(jù)。
SetExtractionModeToSpecifiedRegions():該模式用于提取一個或多個連通區(qū)域,在該模式下,需要通過AddSpecifiedRegion()來添加西藥提取的區(qū)域號,區(qū)域號從零開始。 SetExtractionModeToClosestPointRegion():該模式需要使用SetClosestPoint()函數(shù)設(shè)置一個空間點(diǎn)坐標(biāo),執(zhí)行結(jié)果為離該點(diǎn)最近的連通區(qū)域。 SetExtractionModeToPointSeededRegions():該模式下需要使用AddSeed()函數(shù)添加種子點(diǎn),提取種子點(diǎn)所在的區(qū)域。 SetExtractionModeToCellSeededRegions():該模式下需要使用AddSeed()函數(shù)調(diào)價種子單元,提取種子單元所在的區(qū)域。
3.參看資料
1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3. ?張曉東, 羅火靈. VTK圖形圖像開發(fā)進(jìn)階[M]. 機(jī)械工業(yè)出版社, 2015.
總結(jié)
以上是生活随笔為你收集整理的VTK修炼之道51:图形基本操作进阶_连通区域分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VTK修炼之道50:图形基本操作进阶_网
- 下一篇: 飞鸽传书2012 的网络通信代码