VTK-对Filter的理解

VTK可视化管道流程如下所示:

在这里插入图片描述Source是指用于创建数据(如vtkCylinderSource、vtkConeSource)或者读取数据(如vtkBMPReader、vtkStructuredPointsReader等)的类的统称,即VTK的数据源

Source输出的数据作为Filter的输入,经Filter处理以后(可以经多个Filter处理),生成新的数据。Filter的输出可以直接写入文件,或者经Mapper变换后送入渲染引擎进行渲染、显示,结束可视化管线
  
Filter的译文为过滤,本质上是算法
  
可视化管线里各个模块的连接是通过接口xxxInputxxx()和xxxOutputxxx()来完成的
  
可能你现在无法理解这上面到底讲的是什么
直接上代码来讲
  
  

代码

代码1

#include <vtkAutoInit.h>
#include <vtkSmartPointer.h>
#include <vtkJPEGReader.h>
#include <vtkImageViewer2.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPNGWriter.h>
#include <vtkRenderer.h> 
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkImageActor.h>
#include <vtkImageData.h>
#include <vtkImageThreshold.h>

VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);

int main()
{
    
    vtkSmartPointer<vtkJPEGReader> reader =
        vtkSmartPointer<vtkJPEGReader>::New();
	//读取JPG文件
    reader->SetFileName("/home/jack/projects/VTK/7demo/test.jpeg");
	reader->Update();

   

    vtkSmartPointer<vtkImageThreshold> threshould =
    vtkSmartPointer<vtkImageThreshold>::New();
    //Filter 实现图像的阈值化 一种算法来的
    //这里就有SetInputConnection和GetOutputPort
    threshould->SetInputConnection(reader->GetOutputPort());
    threshould->ThresholdByUpper(90);
    threshould->SetInValue(255);
    threshould->SetOutValue(0);
    threshould->Update(); //算法执行后必须添加更新消息!!!

    
    vtkSmartPointer<vtkImageActor> binaryActor =
    vtkSmartPointer<vtkImageActor>::New();
    binaryActor->SetInputData(threshould->GetOutput());
    
    //可以看到 如果是图像数据 是没有mapper的
    vtkSmartPointer<vtkRenderer> Render =
    vtkSmartPointer<vtkRenderer>::New();
    Render->AddActor(binaryActor);
    Render->SetBackground(1, 1, 1);

    vtkSmartPointer<vtkRenderWindow> rw =
   vtkSmartPointer<vtkRenderWindow>::New();
 
    rw->AddRenderer(Render);
    rw->SetSize(1000, 1000);
    rw->SetWindowName("Binary Image");

    //加入交互机制
	//实例化一个交互器对象interactor
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInter =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInter->SetRenderWindow(rw);
	renderWindowInter->Initialize();
    renderWindowInter->Start();  
}

  
代码2

#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();
    //input和output
    appendFilter->AddInputData(sphereSource->GetOutput());
    //input和output
    appendFilter->AddInputData(coneSource->GetOutput());
    appendFilter->Update();

    vtkSmartPointer<vtkPolyDataConnectivityFilter> connectivityFilter =
        vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();
    //input和output
    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();
    //几何数据是有Mapper的
    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;
}

  
  

总结

Filter就是算法
  
Filter的输入方式是->xxInputxxx(上一个Filter->xxxoutputxxx())

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值