jackyko1991 / Vessel-Centerline-Extraction

An interactive software to extract vessel centerline
GNU Lesser General Public License v2.1
62 stars 16 forks source link

Voronoi diagram 输出显示 #5

Closed junqiangchen closed 5 years ago

junqiangchen commented 5 years ago

作者你好,分享的项目非常棒,我下了你的代码也测试了一下,可以做中心线提取,因为中心线是根据每个位置的最小内接球来确定的,我想将最小内结球的Voronoi diagram显示出来,我尝试在Centerlin.cpp文件中的CalculateCenterline()函数里加了centerlinesFilter->SetGenerateVoronoiDiagram(m_appendEndPointsFlag);但是结果没有什么变化,不知道作者知道在哪里修改或添加函数功能可以实现呢? 非常感谢

jackyko1991 commented 5 years ago

如果你想直接在程序中顯示voronoi diagram,你需要在interactorStyleCenterline中增加voronoi的actor.同時需在main.cpp中新增vornoi diagram的actor,類似以下的:

vtkSmartPointer<vtkPolyDataMapper> centerlineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
centerlineMapper->SetInputData(centerline);
vtkSmartPointer<vtkActor> centerlineActor = vtkSmartPointer<vtkActor>::New();
centerlineActor->SetMapper(centerlineMapper);

我沒有直接處理過voronoi diagram,建議先利用paraview看使用了SetGenerateVoronoiDiagram(m_appendEndPointsFlag) 的輸出有沒有正確生成後才開始修改代碼

jackyko1991 commented 5 years ago

具體生成voronoi diagram可以參考source code的使用方法

if (self.VoronoiDiagram is not None) and (self.PoleIds is not None):
            centerlineFilter.GenerateVoronoiDiagramOff()
            centerlineFilter.SetVoronoiDiagram(self.VoronoiDiagram)
            centerlineFilter.SetPoleIds(self.PoleIds)
self.VoronoiDiagram = centerlineFilter.GetVoronoiDiagram()
junqiangchen commented 5 years ago

非常感谢作者你的回答,按照你提供的参考资料,我在你的代码基础上进行了修改: vtkSmartPointer centerlinesFilter = vtkSmartPointer::New(); centerlinesFilter->SetInputData(m_cappedSurface); centerlinesFilter->SetSourceSeedIds(m_sourceIds); centerlinesFilter->SetTargetSeedIds(m_targetIds); centerlinesFilter->SetAppendEndPointsToCenterlines(m_appendEndPointsFlag); centerlinesFilter->SetSimplifyVoronoi(0); centerlinesFilter->GenerateVoronoiDiagramOn(); centerlinesFilter->SetRadiusArrayName("Radius"); centerlinesFilter->SetEdgeArrayName("Edge"); centerlinesFilter->SetEdgePCoordArrayName("PCoord"); centerlinesFilter->Update();

m_centerline->DeepCopy(centerlinesFilter->GetOutput());
m_voronoidiagram = centerlinesFilter->GetVoronoiDiagram();

我测试输出m_voronoidiagram是非空的。在ExtractCenterline函数中添加代码如下: vtkSmartPointer voronoidiagramMapper = vtkSmartPointer::New(); voronoidiagramMapper->SetInputData(VoronoiDiagram); vtkSmartPointer voronoidiagramActor = vtkSmartPointer::New(); voronoidiagramActor->SetMapper(voronoidiagramMapper);

        // put the actor into render window
        vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();
        ren->AddActor(surfaceActor);
        ren->AddActor(centerlineActor);
        ren->AddActor(voronoidiagramActor);

最后将结果写成vtp形式,用paraview来看的时候,没有任何结果。