VMTK 最新最简单编译(VTK9.3.1+ITK5.4.0)

之前网络上都是使用VTK8编译的 ,网上关于VMTK 编译几乎没有任何资料 ,本文是全网最方便最快捷编译VMTK的方法:
默认配置好了 QT5.15.2, ITK5.4.0,VTK9.3.1
注意:VMTK 只能编译静态库,不能编译动态库;VTMK的动态库使用debug版本是有问题的,但是Release模式是正常的;

编译debug静态库

(1)在这里下载VMTK-VTK9的代码https://github.com/vmtk/vmtk,下载完后 解压,解压后把文件名改成src,新建build和lib文件夹,然后打开cmake-gui,把src和build 文件夹填入,然后configure;

(2)勾选Grouped 和advanced, 然后点开 add Entry ,新建三个路径

​ 新建Qt5_DIR 增加D:\soft\Qt5.15.2\5.15.2\msvc2019_64\lib\cmake\Qt5

​ 然后把 ITK_DIR 填入:E:\Workspace\Project\third\ITK-5.4.0\debug\lib\cmake\ITK-5.4

​ VTK_DIR 填入:E:\Workspace\Project\third\VTK-9.3.1\debug\lib\cmake\vtk-9.3

​ Python_EXECUTABLE填入:C:/Users/ydy00567/AppData/Local/Programs/Python/Python39/python.exe

​ Python_LIBRARY填入:C:/Users/ydy00567/AppData/Local/Programs/Python/Python39/libs/python39.lib

​ Python_INCLUDE_DIR填入:C:/Users/ydy00567/AppData/Local/Programs/Python/Python39/include

(3)然后点击configure, 点击之后,把BUILD_SHARED_LIBS 勾选取消,这是构建静态库,把CMAKE_BUILD_TYPE改成Debug

(4) 然后点击configure, 点击之后,会出现python,PythonLibsConfig.cmakepythonlibs-config.cmake警告,以及SuperBuild错误,在搜索框中搜索 SuperBuild,取消对应的按钮,则错误和 警告消失

(5)在搜索框中,搜索CMAKE_INSTALL_PREFIX选项,这个是表示 VMTK 的安装路径,选择lib文件夹;

(6)然后按configure和 Generate可以顺利生成,随后打开open Project,打开工程;VS切换为Debug,在cMakePredefinedTargets下,找到 INSTALL,然后生成

(7) 随后会出现报错: Threshol缺少ThresholdByLower的错误;

在 E:\Workspace\Project\third\VMTK-VTK9\src\vtkVmtk\Contrib\vtkvmtkCellDimensionFilter.cxx把 这三个函数修改为:

void vtkvmtkCellDimensionFilter::ThresholdByLower(int lower)
{
  Threshold->SetLowerThreshold(lower);
}

void vtkvmtkCellDimensionFilter::ThresholdByUpper(int upper)
{
  Threshold->SetUpperThreshold(upper);
}

void vtkvmtkCellDimensionFilter::ThresholdBetween(int lower, int upper)
{
  Threshold->SetThresholdFunction(vtkThreshold::THRESHOLD_BETWEEN);
}

随后便可以编译成功

(8)编译结束后把lib文件夹改成debug,调用所需要的include和lib文件都在里面,bin文件夹直接删除

编译Release静态库

(1)在这里下载VMTK-VTK9的代码https://github.com/vmtk/vmtk,下载完后 解压,解压后把文件名改成src,新建build和lib文件夹,然后打开cmake-gui,把src和build 文件夹填入,然后configure;

(2)勾选Grouped 和advanced, 然后点开 add Entry ,新建三个路径

​ 新建Qt5_DIR 增加D:\soft\Qt5.15.2\5.15.2\msvc2019_64\lib\cmake\Qt5

​ 然后把 ITK_DIR 填入:E:\Workspace\Project\third\ITK-5.4.0\release\lib\cmake\ITK-5.4

​ VTK_DIR 填入:E:\Workspace\Project\third\VTK-9.3.1\release\lib\cmake\vtk-9.3

​ Python_EXECUTABLE填入:C:/Users/ydy00567/AppData/Local/Programs/Python/Python39/python.exe

​ Python_LIBRARY填入:C:/Users/ydy00567/AppData/Local/Programs/Python/Python39/libs/python39.lib

​ Python_INCLUDE_DIR填入:C:/Users/ydy00567/AppData/Local/Programs/Python/Python39/include

(3)然后点击configure, 点击之后,把BUILD_SHARED_LIBS 勾选取消,这是构建静态库,把CMAKE_BUILD_TYPE改成Release

(4) 然后点击configure, 点击之后,会出现python,PythonLibsConfig.cmakepythonlibs-config.cmake警告,以及SuperBuild错误,在搜索框中搜索 SuperBuild,取消对应的按钮,则错误和 警告消失

(5)在搜索框中,搜索CMAKE_INSTALL_PREFIX选项,这个是表示 VMTK 的安装路径,选择lib文件夹;

(6)然后按configure和 Generate可以顺利生成,随后打开open Project,打开工程;VS切换为Release,在cMakePredefinedTargets下,找到 INSTALL,然后生成

(7) 随后会出现报错: Threshol缺少ThresholdByLower的错误;

在 E:\Workspace\Project\third\VMTK-VTK9\src\vtkVmtk\Contrib\vtkvmtkCellDimensionFilter.cxx把 这三个函数修改为:

void vtkvmtkCellDimensionFilter::ThresholdByLower(int lower)
{
  Threshold->SetLowerThreshold(lower);
}

void vtkvmtkCellDimensionFilter::ThresholdByUpper(int upper)
{
  Threshold->SetUpperThreshold(upper);
}

void vtkvmtkCellDimensionFilter::ThresholdBetween(int lower, int upper)
{
  Threshold->SetThresholdFunction(vtkThreshold::THRESHOLD_BETWEEN);
}

随后便可以编译成功

(8)编译结束后把lib文件夹改成release,调用所需要的include和lib文件都在里面,bin文件夹直接删除

VMTK提取中心线测试代码:

#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>

#include <vtkJPEGReader.h>
#include <vtkCamera.h>
#include <vtkProperty.h>
#include <vtkAxesActor.h>
#include <vtkSTLReader.h>

#include <vtkDiscreteMarchingCubes.h>
#include <vtkWindowedSincPolyDataFilter.h>
#include <vtkCleanPolyData.h>
#include <vtkTriangleFilter.h>
#include <vtkPolyData.h>
#include <vtkPointData.h>
#include <vtkDataArray.h>
#include <vtkIdList.h>
#include <vtkDecimatePro.h>
#include <vtkDoubleArray.h>
#include <vtkParametricSpline.h>
#include <vtkParametricFunctionSource.h>
#include <vtkLODActor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkRenderWindowInteractor.h>

#include <vtkvmtkCapPolyData.h>
#include <vtkvmtkPolyDataCenterlines.h>


vtkSmartPointer<vtkPolyData> ExtractCenterline(vtkSmartPointer<vtkPolyData> inputSurface) {

    //1.清理 并 三角化
    vtkSmartPointer<vtkPolyData> cappedSurface = vtkSmartPointer<vtkPolyData>::New();

    vtkSmartPointer<vtkCleanPolyData>surfaceCleaner = vtkSmartPointer<vtkCleanPolyData>::New();
    surfaceCleaner->SetInputData(inputSurface);
    surfaceCleaner->Update();

    vtkSmartPointer < vtkTriangleFilter> surfaceTriangulator = vtkSmartPointer<vtkTriangleFilter>::New();
    surfaceTriangulator->SetInputConnection(surfaceCleaner->GetOutputPort());
    surfaceTriangulator->PassLinesOff();
    surfaceTriangulator->PassVertsOff();
    surfaceTriangulator->Update();

    cappedSurface->DeepCopy(surfaceTriangulator->GetOutput());

    //2.填补管腔 cappedsurface
    vtkSmartPointer<vtkvmtkCapPolyData> capper = vtkSmartPointer<vtkvmtkCapPolyData>::New();
    if (!capper)
    {
        std::cerr << "工厂注册失败,可能 DLL 没有加载或模块没链接" << std::endl;
    }
    else
    {
        std::cout << " capper 创建成功!" << std::endl;
    }
    capper->SetInputData(cappedSurface);
    capper->Update();
    vtkSmartPointer<vtkIdList> CapCenterIds = vtkSmartPointer<vtkIdList>::New();

    cappedSurface->DeepCopy(capper->GetOutput());
    CapCenterIds->DeepCopy(capper->GetCapCenterIds());

    cout << "The number of the lumen is:" << capper->GetCapCenterIds()->GetNumberOfIds() << endl;

    //3.设置起始位置
        //起点
    vtkSmartPointer<vtkIdList> sourceIds = vtkSmartPointer<vtkIdList>::New();
    sourceIds->SetNumberOfIds(1);
    sourceIds->SetId(0, CapCenterIds->GetId(0));

    vtkSmartPointer<vtkIdList> targetIds = vtkSmartPointer<vtkIdList>::New();

    //多个目标
//        targetIds->SetNumberOfIds(CapCenterIds->GetNumberOfIds() - 1);
//        for (int i = 1; i < CapCenterIds->GetNumberOfIds(); i++)
//        {
//            targetIds->SetId(i - 1, CapCenterIds->GetId(i));
//        }
        //单个目标
    targetIds->SetNumberOfIds(1);
    targetIds->SetId(0, CapCenterIds->GetId(2));

    //4.中心线计算 calculate
    vtkSmartPointer<vtkvmtkPolyDataCenterlines> centerlinesFilter = vtkSmartPointer<vtkvmtkPolyDataCenterlines>::New();
    centerlinesFilter->SetInputData(cappedSurface);
    centerlinesFilter->SetSourceSeedIds(sourceIds);
    centerlinesFilter->SetTargetSeedIds(targetIds);
    centerlinesFilter->SetAppendEndPointsToCenterlines(true);
    centerlinesFilter->SetCenterlineResampling(true);
    centerlinesFilter->SetResamplingStepLength(1);
    centerlinesFilter->SetRadiusArrayName("Radius");
    centerlinesFilter->SetEdgeArrayName("Edge");
    centerlinesFilter->SetEdgePCoordArrayName("PCoord");
    centerlinesFilter->Update();

    //获取结果
    vtkSmartPointer<vtkPolyData> output = centerlinesFilter->GetOutput();
    vtkDoubleArray* centerlinesRadiusArray = static_cast<vtkDoubleArray*>(output->GetPointData()->GetArray("Radius"));

    //半径
    for (int i = 0; i < output->GetNumberOfPoints(); i++) {
        double radius = centerlinesRadiusArray->GetValue(i);
    }

    return output;
}


void VascularModelTest(std::string inputFilename)
{
    std::string stl = inputFilename;

    vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
    reader->SetFileName(stl.c_str());
    reader->Update();

    // STL 文件
    vtkSmartPointer<vtkPolyData> data = vtkSmartPointer<vtkPolyData>::New();
    data->DeepCopy(reader->GetOutput());
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(reader->GetOutputPort());
    mapper->Update();
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    vtkSmartPointer<vtkProperty> property = vtkSmartPointer<vtkProperty>::New();
    property->SetDiffuseColor(1, 0.49, 0.25);
    property->SetDiffuse(0.7);
    property->SetSpecular(0.3);
    property->SetSpecularPower(20);
    property->SetOpacity(0.3);
    actor->SetProperty(property); //设置透明度

    //获取中心线 B样条曲线拟合
    vtkSmartPointer<vtkPoints> pathpoints = vtkSmartPointer<vtkPoints>::New();//ExtractCenterline(data);
    pathpoints->DeepCopy(ExtractCenterline(data)->GetPoints());
    //-------------------------------------
    cout << "The number of points:" << pathpoints->GetNumberOfPoints() << endl;
    vtkSmartPointer<vtkParametricSpline> spline = vtkSmartPointer<vtkParametricSpline>::New();
    spline->SetPoints(pathpoints);
    spline->ClosedOff();

    vtkSmartPointer<vtkParametricFunctionSource> splineSource = vtkSmartPointer<vtkParametricFunctionSource>::New();
    splineSource->SetParametricFunction(spline);

    vtkSmartPointer<vtkPolyDataMapper> pointMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    pointMapper->SetInputConnection(splineSource->GetOutputPort());

    vtkSmartPointer<vtkLODActor> actorPoints = vtkSmartPointer<vtkLODActor>::New();
    actorPoints->SetMapper(pointMapper);
    actorPoints->GetProperty()->SetColor(0, 1, 0);
    actorPoints->GetProperty()->SetLineWidth(2);
    //-------------------------------------

    //---交互----
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->AddActor(actorPoints);
    renderer->SetBackground(0.1, 0.2, 0.4);; // Background color green

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetSize(1920, 1080);
    vtkSmartPointer<vtkCamera> aCamera = vtkSmartPointer<vtkCamera>::New();
    aCamera->SetPosition(0, 0, -300);
    aCamera->SetFocalPoint(0, 0, 0);
    aCamera->SetViewUp(0, -1, 0);
    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
    interactor->SetInteractorStyle(style);

    renderWindow->Render();
    interactor->Start();
}

运行结果:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值