当前位置: 首页 > news >正文

VTK 显示文字、图片及2D/3D图

1. 基本环境设置

首先确保你已经安装了VTK库,并配置好了C++开发环境。

#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>

2. 显示文字

2D文字

#include <vtkTextActor.h>
#include <vtkTextProperty.h>void Show2DText() {// 创建渲染器和渲染窗口auto renderer = vtkSmartPointer<vtkRenderer>::New();auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);// 创建交互器auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);// 创建文本actorauto textActor = vtkSmartPointer<vtkTextActor>::New();textActor->SetInput("Hello VTK!");// 设置文本属性auto textProperty = textActor->GetTextProperty();textProperty->SetFontSize(24);textProperty->SetColor(1.0, 0.0, 0.0); // 红色textProperty->SetJustificationToCentered();// 添加文本到渲染器renderer->AddActor2D(textActor);// 开始渲染renderWindow->Render();interactor->Start();
}

3D文字

#include <vtkVectorText.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>void Show3DText() {auto renderer = vtkSmartPointer<vtkRenderer>::New();auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);// 创建3D文字auto textSource = vtkSmartPointer<vtkVectorText>::New();textSource->SetText("3D Text");// 创建mapper和actorauto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(textSource->GetOutputPort());auto actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);actor->GetProperty()->SetColor(0.0, 1.0, 0.0); // 绿色renderer->AddActor(actor);renderer->SetBackground(0.1, 0.2, 0.4); // 深蓝色背景renderWindow->Render();interactor->Start();
}

 中文支持‌:需转换UTF-8编码并使用中文字体文件(如simsun.ttf

3. 显示图片

2D图片

#include <vtkImageReader2Factory.h>
#include <vtkImageReader2.h>
#include <vtkImageActor.h>
#include <vtkImageMapper3D.h>void Show2DImage(const char* filename) {auto renderer = vtkSmartPointer<vtkRenderer>::New();auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);// 读取图片auto readerFactory = vtkSmartPointer<vtkImageReader2Factory>::New();auto reader = readerFactory->CreateImageReader2(filename);reader->SetFileName(filename);reader->Update();// 创建图片actorauto imageActor = vtkSmartPointer<vtkImageActor>::New();imageActor->GetMapper()->SetInputConnection(reader->GetOutputPort());renderer->AddActor(imageActor);renderer->ResetCamera();renderWindow->Render();interactor->Start();reader->Delete();
}

4. 显示2D图形

#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper2D.h>
#include <vtkActor2D.h>void Show2DShape() {auto renderer = vtkSmartPointer<vtkRenderer>::New();auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);// 创建点auto points = vtkSmartPointer<vtkPoints>::New();points->InsertNextPoint(100, 100, 0);points->InsertNextPoint(200, 100, 0);points->InsertNextPoint(200, 200, 0);points->InsertNextPoint(100, 200, 0);// 创建多边形auto polygon = vtkSmartPointer<vtkCellArray>::New();polygon->InsertNextCell(5);polygon->InsertCellPoint(0);polygon->InsertCellPoint(1);polygon->InsertCellPoint(2);polygon->InsertCellPoint(3);polygon->InsertCellPoint(0);// 创建PolyDataauto polygonPolyData = vtkSmartPointer<vtkPolyData>::New();polygonPolyData->SetPoints(points);polygonPolyData->SetLines(polygon);// 创建mapper和actorauto mapper = vtkSmartPointer<vtkPolyDataMapper2D>::New();mapper->SetInputData(polygonPolyData);auto actor = vtkSmartPointer<vtkActor2D>::New();actor->SetMapper(mapper);actor->GetProperty()->SetColor(1.0, 0.0, 0.0); // 红色renderer->AddActor(actor);renderWindow->Render();interactor->Start();
}

5. 显示3D图形

#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>void Show3DShape() {auto renderer = vtkSmartPointer<vtkRenderer>::New();auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);// 创建圆锥体auto cone = vtkSmartPointer<vtkConeSource>::New();cone->SetHeight(3.0);cone->SetRadius(1.0);cone->SetResolution(10);// 创建mapper和actorauto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(cone->GetOutputPort());auto actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);actor->GetProperty()->SetColor(0.2, 0.63, 0.79); // 蓝色renderer->AddActor(actor);renderer->SetBackground(0.1, 0.2, 0.4);renderer->ResetCamera();renderWindow->Render();interactor->Start();
}

使用体绘制: 

#include <vtkSmartPointer.h>
#include <vtkMetaImageReader.h>
#include <vtkGPUVolumeRayCastMapper.h>
#include <vtkVolumeProperty.h>
#include <vtkColorTransferFunction.h>
#include <vtkPiecewiseFunction.h>
#include <vtkVolume.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>void Show3DVolume(const char* filename) {// 创建渲染器和渲染窗口auto renderer = vtkSmartPointer<vtkRenderer>::New();auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);// 读取3D图像数据(如.mhd/.mha格式)auto reader = vtkSmartPointer<vtkMetaImageReader>::New();reader->SetFileName(filename);reader->Update();// 创建体积映射器auto volumeMapper = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();volumeMapper->SetInputConnection(reader->GetOutputPort());// 创建体积属性auto volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();volumeProperty->ShadeOn();volumeProperty->SetInterpolationTypeToLinear();// 设置颜色传输函数auto colorTransferFunction = vtkSmartPointer<vtkColorTransferFunction>::New();colorTransferFunction->AddRGBPoint(0, 0.0, 0.0, 0.0);colorTransferFunction->AddRGBPoint(500, 1.0, 0.5, 0.3);colorTransferFunction->AddRGBPoint(1000, 1.0, 1.0, 0.9);volumeProperty->SetColor(colorTransferFunction);// 设置不透明度传输函数auto opacityTransferFunction = vtkSmartPointer<vtkPiecewiseFunction>::New();opacityTransferFunction->AddPoint(0, 0.0);opacityTransferFunction->AddPoint(500, 0.1);opacityTransferFunction->AddPoint(1000, 0.3);volumeProperty->SetScalarOpacity(opacityTransferFunction);// 创建体积对象auto volume = vtkSmartPointer<vtkVolume>::New();volume->SetMapper(volumeMapper);volume->SetProperty(volumeProperty);// 添加到渲染器renderer->AddVolume(volume);renderer->SetBackground(0.1, 0.2, 0.4);renderer->ResetCamera();renderWindow->Render();interactor->Start();
}

 使用固定平面切片显示:

 

#include <vtkImagePlaneWidget.h>void Show3DVolumeWithSlices(const char* filename) {auto renderer = vtkSmartPointer<vtkRenderer>::New();auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);// 读取3D图像数据auto reader = vtkSmartPointer<vtkMetaImageReader>::New();reader->SetFileName(filename);reader->Update();// 创建三个切片平面(横断面、冠状面、矢状面)double* center = reader->GetOutput()->GetCenter();// 横断面auto planeWidgetX = vtkSmartPointer<vtkImagePlaneWidget>::New();planeWidgetX->SetInteractor(interactor);planeWidgetX->SetInputConnection(reader->GetOutputPort());planeWidgetX->SetPlaneOrientationToXAxes();planeWidgetX->SetSliceIndex(static_cast<int>(center[0]));planeWidgetX->DisplayTextOn();planeWidgetX->SetDefaultRenderer(renderer);planeWidgetX->On();// 冠状面auto planeWidgetY = vtkSmartPointer<vtkImagePlaneWidget>::New();planeWidgetY->SetInteractor(interactor);planeWidgetY->SetInputConnection(reader->GetOutputPort());planeWidgetY->SetPlaneOrientationToYAxes();planeWidgetY->SetSliceIndex(static_cast<int>(center[1]));planeWidgetY->DisplayTextOn();planeWidgetY->SetDefaultRenderer(renderer);planeWidgetY->On();// 矢状面auto planeWidgetZ = vtkSmartPointer<vtkImagePlaneWidget>::New();planeWidgetZ->SetInteractor(interactor);planeWidgetZ->SetInputConnection(reader->GetOutputPort());planeWidgetZ->SetPlaneOrientationToZAxes();planeWidgetZ->SetSliceIndex(static_cast<int>(center[2]));planeWidgetZ->DisplayTextOn();planeWidgetZ->SetDefaultRenderer(renderer);planeWidgetZ->On();renderer->SetBackground(0.1, 0.1, 0.1);renderWindow->SetSize(800, 600);renderWindow->Render();interactor->Start();
}

 

6. 在3D场景中添加文字标注

void Show3DSceneWithText() {auto renderer = vtkSmartPointer<vtkRenderer>::New();auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);// 创建3D对象(球体)auto sphereSource = vtkSmartPointer<vtkSphereSource>::New();sphereSource->SetRadius(1.0);auto sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();sphereMapper->SetInputConnection(sphereSource->GetOutputPort());auto sphereActor = vtkSmartPointer<vtkActor>::New();sphereActor->SetMapper(sphereMapper);sphereActor->GetProperty()->SetColor(1.0, 0.0, 0.0);// 创建3D文字标注auto textSource = vtkSmartPointer<vtkVectorText>::New();textSource->SetText("Sphere");auto textMapper = vtkSmartPointer<vtkPolyDataMapper>::New();textMapper->SetInputConnection(textSource->GetOutputPort());auto textActor = vtkSmartPointer<vtkActor>::New();textActor->SetMapper(textMapper);textActor->SetPosition(1.5, 0, 0);textActor->GetProperty()->SetColor(1.0, 1.0, 1.0);// 添加所有对象到渲染器renderer->AddActor(sphereActor);renderer->AddActor(textActor);renderer->SetBackground(0.1, 0.1, 0.1);renderer->ResetCamera();renderWindow->SetSize(800, 600);renderWindow->Render();interactor->Start();
}

7. 完整流程示例

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);int main() {// 初始化渲染器、窗口vtkNew<vtkRenderer> renderer;vtkNew<vtkRenderWindow> window;window->AddRenderer(renderer);// 1. 添加3D文字vtkNew<vtkVectorText> text3D;text3D->SetText("3D Text");vtkNew<vtkPolyDataMapper> mapper;mapper->SetInputConnection(text3D->GetOutputPort());vtkNew<vtkActor> actor;actor->SetMapper(mapper);actor->SetPosition(0, 0, 0);renderer->AddActor(actor);// 2. 添加2D文字vtkNew<vtkTextActor> text2D;text2D->SetInput("2D Overlay");text2D->GetTextProperty()->SetFontSize(20);text2D->SetPosition(50, 50);  // 屏幕坐标renderer->AddActor2D(text2D);// 3. 启动交互vtkNew<vtkRenderWindowInteractor> interactor;interactor->SetRenderWindow(window);window->Render();interactor->Start();
}

 8. 混合2D/3D场景的关键技巧

  1. 坐标系区分‌:
    • 2D元素(文字/图片)用AddActor2D
    • 3D元素(模型/文本)用AddActor
  2. 位置控制‌:
    • 2D元素:通过SetPosition设置屏幕坐标(范围0~1)
    • 3D元素:通过SetPosition设置世界坐标
  3. 交互优化‌:
    vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
    interactor->SetInteractorStyle(style);  // 启用3D交互模式

9. 支持的3D图像格式

VTK支持多种3D图像格式,常用的包括:

  1. MetaImage格式 (.mhd/.mha)

    • 使用vtkMetaImageReader

  2. DICOM序列

    • 使用vtkDICOMImageReader

  3. NIfTI格式 (.nii)

    • 使用vtkNIFTIImageReader

  4. Analyze格式 (.hdr/.img)

    • 使用vtkAnalyzeReader

  5. 原始数据

    • 使用vtkImageReader2并设置适当参数

10. 性能优化技巧

  1. 对于大型数据集,使用vtkGPUVolumeRayCastMapper替代CPU渲染器

  2. 适当降低采样率以提高交互性能

  3. 使用多分辨率技术,在交互时显示低分辨率版本

  4. 考虑使用vtkImageResample预先降低数据分辨率

  5. 对于静态视图,可以预先计算并缓存渲染结果

http://www.lqws.cn/news/190855.html

相关文章:

  • 基于STM32语音识别柔光台灯
  • logstash拉取redisStream的流数据,并存储ES
  • Python读取阿里法拍网的html+解决登录cookie
  • 宁乡地-气-碳-水相互作用综合观测数据集
  • 概念理解篇:线程同步之【互斥】
  • 《0/1背包》题集
  • 飞马LiDAR500雷达数据预处理
  • AOSP (Android11) 集成Google GMS三件套
  • 大模型时代的“思考“与“行动“:人工智能的认知革命
  • STM32标准库-TIM输出比较
  • iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
  • 《深度体验 Egg.js:打造企业级 Node.js 应用的全景指南》
  • ardupilot 开发环境eclipse 中import 缺少C++
  • Splash动态渲染技术全解析:从基础到企业级应用(2025最新版)
  • 麒麟v10系统的docker重大问题解决-不支持容器名称解析
  • 【机械视觉】Halcon—【八、形态学调整和生成棋盘格】
  • MDP的 Commands模块
  • MS31912TEA 多通道半桥驱动器 氛围灯 照明灯 示宽灯 转向灯驱动 后视镜方向调节 可替代DRV8912
  • 在 Caliper 中执行不同合约的方法
  • 应用分享 | 精准生成和时序控制!AWG在确定性三量子比特纠缠光子源中的应用
  • Java学习——正则表达式
  • 09.三数之和
  • vm虚拟机添加虚拟机无反应,获取所有权
  • 在WPF项目中集成Python:Python.NET深度实战指南
  • 无人机定位系统技术设计与难点突破!
  • 接口限频算法:漏桶算法、令牌桶算法、滑动窗口算法
  • 智能生成完整 Java 后端架构,告别手动编写 ControllerServiceDao
  • 如何实现安卓端与苹果端互通的多种方案
  • 好子集的数目概念及表达形式
  • 每次clone都会有:Enter passphrase for key ‘/Users/xxx/.ssh/id_rsa‘: