VTK修炼之道76:交互部件_标注类Widget的应用
来源:互联网 发布:php属于前端还是后端 编辑:程序博客网 时间:2024/05/22 00:50
1.标注类Widget
在可视化程序中,经常会对某个对象做一些标注说明,比如,在医学图像诊断中,常常会手动标注出被诊断为肿瘤的区域或者其他病变区域,并用文字进行标注。VTK中,与标注相关的Widget如下表所示:
- vtkTextWidget:在渲染场景中生成一串标识文本,可以随意调整该文本在渲染场景中的位置,缩放其大小等。
- vtkScalarBarWidget:根据输入的数据在渲染场景中生成一个标量条,通过设置颜色查找表,可以用标量条上的颜色来指示输入的数据。渲染场景中的标量条可以随意移动、改变大小、设置不同的方向等。
- vtkCaptionWidget:用一个带线框及箭头的文本信息来标注某一对象。
- vtkOrientationMarkerWidget:渲染场景中所渲染数据的方向指示标志。在医学图像领域有广泛的应用,比如,通过CT/MR等扫描的数据,当将其导入可视化应用程序时需要标识其上、下、左、右、前、后等方位。
- vtkBalloonWidget:当鼠标停留在渲染场景中的某个Actor一段时间后,会弹出提示信息。所提示的信息,除了可以用文本表示,也可以用图像表示。
2.标注类Widget应用程序
#include <vtkAutoInit.h>VTK_MODULE_INIT(vtkRenderingOpenGL)VTK_MODULE_INIT(vtkInteractionStyle)VTK_MODULE_INIT(vtkRenderingFreeType)#include <vtkSmartPointer.h>#include <vtkUnstructuredGridReader.h>#include <vtkUnstructuredGrid.h>#include <vtkLookupTable.h>#include <vtkDataSetMapper.h>#include <vtkActor.h>#include <vtkRenderer.h>#include <vtkRenderWindow.h>#include <vtkRenderWindowInteractor.h>#include <vtkScalarBarActor.h>#include <vtkScalarBarWidget.h>#include <vtkTextActor.h>#include <vtkTextWidget.h>#include <vtkTextProperty.h>#include <vtkTextRepresentation.h>#include <vtkAxesActor.h>#include <vtkOrientationMarkerWidget.h>#include <vtkCaptionWidget.h>#include <vtkCaptionActor2D.h>///////////////////#include <vtkCaptionRepresentation.h>#include <vtkBalloonWidget.h>#include <vtkBalloonRepresentation.h>int main(){vtkSmartPointer< vtkUnstructuredGridReader > reader = vtkSmartPointer< vtkUnstructuredGridReader >::New();reader->SetFileName("data.vtk");reader->Update();vtkSmartPointer< vtkLookupTable > lut = vtkSmartPointer< vtkLookupTable >::New();lut->Build();vtkSmartPointer< vtkDataSetMapper > mapper = vtkSmartPointer< vtkDataSetMapper >::New();mapper->SetInputData(reader->GetOutput());mapper->SetScalarRange(reader->GetOutput()->GetScalarRange());mapper->SetLookupTable(lut);vtkSmartPointer< vtkActor > actor = vtkSmartPointer< vtkActor >::New();actor->SetMapper(mapper);vtkSmartPointer< vtkRenderer > renderer = vtkSmartPointer< vtkRenderer >::New();renderer->AddActor(actor);renderer->SetBackground(1, 1, 1);vtkSmartPointer< vtkRenderWindow > renderWindow = vtkSmartPointer< vtkRenderWindow >::New();renderWindow->AddRenderer(renderer);renderWindow->Render();renderWindow->SetWindowName("AnnotationWidget");renderWindow->SetSize(400, 400);vtkSmartPointer< vtkRenderWindowInteractor > interactor = vtkSmartPointer< vtkRenderWindowInteractor >::New();interactor->SetRenderWindow(renderWindow);/********************************************************************************************///标注类测试//////////////////////////// vtkScalarBarWidgetvtkSmartPointer< vtkScalarBarActor > scalarBarActor = vtkSmartPointer< vtkScalarBarActor >::New();scalarBarActor->SetOrientationToHorizontal();scalarBarActor->SetLookupTable(lut);vtkSmartPointer< vtkScalarBarWidget > scalarBarWidget = vtkSmartPointer< vtkScalarBarWidget >::New();scalarBarWidget->SetInteractor(interactor);scalarBarWidget->SetScalarBarActor(scalarBarActor);scalarBarWidget->On();////////////////////////////vtkTextWidgetvtkSmartPointer<vtkTextActor> textActor = vtkSmartPointer<vtkTextActor>::New();textActor->SetInput("VTK Widgets");textActor->GetTextProperty()->SetColor(1, 0, 0);vtkSmartPointer<vtkTextWidget> textWidget = vtkSmartPointer<vtkTextWidget>::New();textWidget->SetInteractor(interactor);textWidget->SetTextActor(textActor);vtkSmartPointer<vtkTextRepresentation> textRepresentation =vtkSmartPointer<vtkTextRepresentation>::New();textRepresentation->GetPositionCoordinate()->SetValue(0.15, 0.15);textRepresentation->GetPosition2Coordinate()->SetValue(0.7, 0.2);textWidget->SetRepresentation(textRepresentation);textWidget->SelectableOff();textWidget->On();///////////////////////////// vtkOrientationMarkerWidgetvtkSmartPointer<vtkAxesActor> iconActor = vtkSmartPointer<vtkAxesActor>::New();vtkSmartPointer<vtkOrientationMarkerWidget> orientationWidget =vtkSmartPointer<vtkOrientationMarkerWidget>::New();orientationWidget->SetOutlineColor(0.9300, 0.5700, 0.1300);orientationWidget->SetInteractor(interactor);orientationWidget->SetOrientationMarker(iconActor);orientationWidget->SetViewport(0.0, 0.0, 0.2, 0.2);orientationWidget->SetEnabled(1);orientationWidget->InteractiveOn();//////////////////////////////// vtkCaptionWidget//vtkSmartPointer<vtkCaptionWidget> captionWidget = //vtkSmartPointer<vtkCaptionWidget>::New();//captionWidget->SetInteractor(interactor);//vtkSmartPointer<vtkCaptionRepresentation> captionRepresentation =//vtkSmartPointer<vtkCaptionRepresentation>::New();//captionRepresentation->GetCaptionActor2D()->SetCaption("Caption Widget");//captionRepresentation->GetCaptionActor2D()->GetTextActor()->GetTextProperty()->SetFontSize(20);////double pos[3] = { .5, 0, 0 };//captionRepresentation->SetAnchorPosition(pos);//captionWidget->SetRepresentation(captionRepresentation);//captionWidget->On();///////////////////////////////////////// vtkBalloonWidgetvtkSmartPointer<vtkBalloonWidget> balloonWidget =vtkSmartPointer<vtkBalloonWidget>::New();balloonWidget->SetInteractor(interactor);vtkSmartPointer<vtkBalloonRepresentation> balloonRep =vtkSmartPointer<vtkBalloonRepresentation>::New();balloonRep->SetBalloonLayoutToImageRight();balloonWidget->SetRepresentation(balloonRep);balloonWidget->AddBalloon(actor, "This is a widget example", NULL);balloonWidget->On();renderWindow->Render();interactor->Initialize();interactor->Start();return 0;}输出结果如下:使用标注类Widget需要注意的是,除了指定的Widget表达实体之外,某些Widget还需要与其他Actor协同使用;如上例中的vtkScalarBarWidget要与vtkScalarBarActor协同工作;vtkTextWidget要与vtkTextActor协同工作。
3.参看资料
1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3. 张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.
0 0
- VTK修炼之道76:交互部件_标注类Widget的应用
- VTK修炼之道75:交互部件_测量类Widget的应用
- VTK修炼之道77:交互部件_分割/配准类Widget与其他Widget
- VTK修炼之道73:交互部件_Widget应用综述
- VTK修炼之道73:交互部件_Widget应用综述
- VTK修炼之道74:交互部件_Widget的创建
- VTK交互之Widget
- VTK修炼之道78:交互与拾取_点拾取
- VTK修炼之道79:交互与拾取_单位拾取
- VTK修炼之道1_初识VTK
- VTK修炼之道82:VTK管线机制_信息对象类VTKInformation
- VTK修炼之道14:图像处理_创建
- VTK修炼之道31:图像二值化_阈值法
- VTK修炼之道32:边缘检测_梯度算子
- VTK修炼之道36:图像平滑_均值滤波器
- VTK修炼之道38:图像平滑_中值滤波器
- VTK修炼之道39:图像平滑_各向异性滤波
- VTK修炼之道13:数据读写_图像数据的读写
- 周期字串
- Guava学习笔记:Google Guava 类库简介
- [Android开发] RxJava2之路三 - 调度器Scheduler与线程控制
- MyEclipse编辑JSP卡死解决方案
- postman
- VTK修炼之道76:交互部件_标注类Widget的应用
- ROS Launch使用总结
- memset()函数解析及易错点
- 集合比较
- 深入理解DOM事件类型系列第六篇——加载事件
- DLNA_iOS_Platinum
- log4j详解
- spring-session 使用redis来存储session配置文件
- 【模板篇】树状数组们(一)