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

news2025/7/27 23:53:29

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);
    
    // 创建文本actor
    auto 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和actor
    auto 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 <vtkAutoInit.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>
#include <vtkImageReader2Factory.h>
#include <vtkImageReader2.h>
#include <vtkImageActor.h>
#include <vtkImageMapper3D.h>

VTK_MODULE_INIT(vtkRenderingOpenGL2);       // OpenGL 渲染
VTK_MODULE_INIT(vtkInteractionStyle);       // 交互

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();

    // 创建图片actor
    auto imageActor = vtkSmartPointer<vtkImageActor>::New();
    imageActor->GetMapper()->SetInputConnection(reader->GetOutputPort());

    renderer->AddActor(imageActor);
    renderer->ResetCamera();

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

    reader->Delete();
}

vtk头文件和库文件: 

INCLUDEPATH += "C:/Program Files/VTK/include/vtk-8.2"
LIBS+= -L"C:/Program Files/VTK/lib"


# 必需的核心 VTK 库
LIBS += -lvtksys-8.2
LIBS += -lvtkCommonColor-8.2
LIBS += -lvtkCommonCore-8.2
LIBS += -lvtkCommonDataModel-8.2
LIBS += -lvtkFiltersCore-8.2
LIBS += -lvtkInteractionStyle-8.2
LIBS += -lvtkRenderingCore-8.2
LIBS += -lvtkRenderingOpenGL2-8.2
LIBS += -lvtkViewsQt-8.2
LIBS += -lvtkGUISupportQt-8.2
LIBS += -lvtkRenderingAnnotation-8.2
LIBS += -lvtkCommonExecutionModel-8.2
LIBS += -lvtkIOImage-8.2

4. 显示2D图形

#include <vtkAutoInit.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper2D.h>
#include <vtkActor2D.h>
#include <vtkProperty2D.h>

VTK_MODULE_INIT(vtkRenderingOpenGL2);       // OpenGL 渲染
VTK_MODULE_INIT(vtkInteractionStyle);       // 交互

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);

    // 创建PolyData
    auto polygonPolyData = vtkSmartPointer<vtkPolyData>::New();
    polygonPolyData->SetPoints(points);
    polygonPolyData->SetLines(polygon);

    // 创建mapper和actor
    auto 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();
}

vtk头文件和库文件: 

INCLUDEPATH += "C:/Program Files/VTK/include/vtk-8.2"
LIBS+= -L"C:/Program Files/VTK/lib"


# 必需的核心 VTK 库
LIBS += -lvtksys-8.2
LIBS += -lvtkCommonColor-8.2
LIBS += -lvtkCommonCore-8.2
LIBS += -lvtkCommonDataModel-8.2
LIBS += -lvtkFiltersCore-8.2
LIBS += -lvtkInteractionStyle-8.2
LIBS += -lvtkRenderingCore-8.2
LIBS += -lvtkRenderingOpenGL2-8.2
LIBS += -lvtkViewsQt-8.2
LIBS += -lvtkGUISupportQt-8.2
LIBS += -lvtkRenderingAnnotation-8.2
LIBS += -lvtkRenderingFreeType-8.2
LIBS += -lvtkCommonExecutionModel-8.2

5. 显示3D图形

#include <vtkAutoInit.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>

VTK_MODULE_INIT(vtkRenderingOpenGL2);       // OpenGL 渲染
VTK_MODULE_INIT(vtkInteractionStyle);       // 交互

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和actor
    auto 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();
}

 vtk头文件和库文件: 

INCLUDEPATH += "C:/Program Files/VTK/include/vtk-8.2"
LIBS+= -L"C:/Program Files/VTK/lib"


# 必需的核心 VTK 库
LIBS += -lvtksys-8.2
LIBS += -lvtkCommonColor-8.2
LIBS += -lvtkCommonCore-8.2
LIBS += -lvtkCommonDataModel-8.2
LIBS += -lvtkFiltersCore-8.2
LIBS += -lvtkInteractionStyle-8.2
LIBS += -lvtkRenderingCore-8.2
LIBS += -lvtkRenderingOpenGL2-8.2
LIBS += -lvtkViewsQt-8.2
LIBS += -lvtkGUISupportQt-8.2
LIBS += -lvtkRenderingAnnotation-8.2
LIBS += -lvtkCommonExecutionModel-8.2
LIBS += -lvtkFiltersSources-8.2

使用体绘制: 

#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>
#include <vtkDataSetMapper.h>
#include <vtkDoubleArray.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkScalarBarActor.h>
#include <vtkTriangle.h>
#include <vtkUnstructuredGrid.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkRendererCollection.h>
#include <vtkVectorText.h>
#include <vtkPolyDataMapper.h>
#include <vtkTextActor.h>
#include <vtkTextProperty.h>
#include <vtkRenderWindowInteractor.h>

VTK_MODULE_INIT(vtkRenderingOpenGL2);       // OpenGL 渲染
VTK_MODULE_INIT(vtkInteractionStyle);       // 交互
VTK_MODULE_INIT(vtkRenderingFreeType);      // 关键:启用文字渲染

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();
}

vtk头文件和库文件:

INCLUDEPATH += "C:/Program Files/VTK/include/vtk-8.2"
LIBS+= -L"C:/Program Files/VTK/lib"


# 必需的核心 VTK 库
LIBS += -lvtksys-8.2
LIBS += -lvtkCommonColor-8.2
LIBS += -lvtkCommonCore-8.2
LIBS += -lvtkCommonDataModel-8.2
LIBS += -lvtkFiltersCore-8.2
LIBS += -lvtkInteractionStyle-8.2
LIBS += -lvtkRenderingCore-8.2
LIBS += -lvtkRenderingOpenGL2-8.2
LIBS += -lvtkViewsQt-8.2
LIBS += -lvtkGUISupportQt-8.2
LIBS += -lvtkRenderingAnnotation-8.2
LIBS += -lvtkRenderingFreeType-8.2
LIBS += -lvtkCommonExecutionModel-8.2

 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.coloradmin.cn/o/2403382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小白如何在cursor中使用mcp服务——以使用notion的api为例

1. 首先安装node.js,在这一步的时候不要勾选不要勾选 2. 安装完之后,前往notion页面 我的创作者个人资料 | Notion 前往集成页面&#xff0c;添加新集成&#xff0c;自己输入名字&#xff0c;选择内部 新建完之后&#xff0c;进入选择只读 复制密匙 然后前往cursor页面 新建…

引领AI安全新时代 Accelerate 2025北亚巡展·北京站成功举办

6月5日&#xff0c;网络安全行业年度盛会——"Accelerate 2025北亚巡展北京站"圆满落幕&#xff01;来自智库、产业界、Fortinet管理层及技术团队的权威专家&#xff0c;与来自各行业的企业客户代表齐聚一堂&#xff0c;围绕"AI智御全球引领安全新时代"主题…

为什么说数列是特殊的函数

文章目录 前情概要函数特性特殊之处典例剖析前情概要 高三的学生几乎都听老师说过,数列是特殊的函数,那么如何理解这句话呢,无外乎需要关注两点:①函数性,②特殊性,以下举例说明,帮助各位学子理解。 函数特性 既然是按照一定的次序排列而成的一列数字,那么这些数字(…

解决uniapp开发app map组件最高层级 遮挡自定义解决底部tabbar方法

subNvue&#xff0c;是 vue 页面的原生子窗体&#xff0c;把weex渲染的原生界面当做 vue 页面的子窗体覆盖在页面上。它不是全屏页面&#xff0c;它给App平台vue页面中的层级覆盖和原生界面自定义提供了更强大和灵活的解决方案。它也不是组件&#xff0c;就是一个原生子窗体。 …

96. 2017年蓝桥杯省赛 - Excel地址(困难)- 进制转换

96. Excel地址&#xff08;进制转换&#xff09; 1. 2017年蓝桥杯省赛 - Excel地址&#xff08;困难&#xff09; 标签&#xff1a;2017 省赛 1.1 题目描述 Excel 单元格的地址表示很有趣&#xff0c;它使用字母来表示列号。 比如&#xff0c; A 表示第 1 列&#xff0c;…

PPT转图片拼贴工具 v1.0

软件介绍 这个软件的作用就是将单个PPT的每一页转换为单独的图片&#xff0c;然后将图片进行拼接起来。 但是我没有还没有解决一次性处理多个文件。 效果展示如下&#xff1a; 软件安装 软件源码 import os import re import win32com.client from PIL import Imagedef con…

【行驶证识别成表格】批量OCR行驶证识别与Excel自动化处理系统,行驶证扫描件和照片图片识别后保存为Excel表格,基于QT和华为ocr识别的实现教程

在车辆管理、物流运输、保险理赔等领域&#xff0c;经常需要处理大量的行驶证信息。传统的人工录入方式效率低、易出错&#xff0c;而使用 OCR 技术可以自动识别行驶证图片中的文字信息&#xff0c;极大提高数据处理效率。该系统可以应用于以下场景&#xff1a; 保险公司快速…

Linux--进程的状态

1.进程状态在所有系统中宏观的大致模型 1.1、进程状态与变迁 基础状态&#xff1a;涵盖创建、就绪、运行、阻塞、结束等核心状态&#xff0c;描述进程从诞生到消亡的生命周期流转&#xff0c;如创建后进入就绪&#xff0c;争抢 CPU 进入运行&#xff0c;遇 I/O 或资源等待则转…

(nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)

题目&#xff1a;2434. 使用机器人打印字典序最小的字符串 思路&#xff1a;贪心栈&#xff0c;时间复杂度0(n)。 字符串t其实就是栈&#xff0c;后进先出。要让p的字典序最小&#xff0c;那当然是t每次弹出的字符&#xff0c;都小于或等于“剩下未入t里的字符串的字符”&#…

008-libb64 你有多理解base64?-C++开源库108杰

正确认识二进制数据和文本数据的关系;深刻理解 base64 编码核心等式&#xff1a;256256256 64646464 经常听到——以至 AI 也会这么回答的&#xff1a;base64 编码用于将二进制数据&#xff0c;转换为文本数据。但是&#xff0c;众所周知&#xff0c;在数字电子计算机中&#…

电子电路基础2(杂乱)

电容器 容抗 滤波电路&#xff08;半波&#xff09; 全波整流 因为A点的电压比D点的电压高&#xff0c;所以D点会走向C点 电感基础 什么是电感器&#xff1f; 一种把电能转换成磁能&#xff0c;并可以将磁能存储起来的元器件。 在嵌入式开发中&#xff0c;电感主要用于动态能量…

LazyOwn RedTeam/APT 框架是第一个具有人工智能驱动的 CC 的 RedTeam 框架

一、软件介绍 文末提供程序和源码下载 LazyOwn RedTeam/APT 框架是第一个具有人工智能驱动的 C&C 的 RedTeam 框架&#xff0c;具有隐藏活动的 rootkit、与 Windows/Linux/Mac OSX 兼容的不可检测的可塑植入物&#xff0c;以及自配置后门。凭借其 Web 界面和强大的…

电脑的ip地址会自动变怎么办?原因解析和解决方法

在当今互联网时代&#xff0c;IP地址是每台联网设备的"身份证"&#xff0c;但很多用户都遇到过IP地址自动变化的情况。这种现象既可能发生在内网&#xff08;局域网&#xff09;环境中&#xff0c;也可能出现在外网&#xff08;公网&#xff09;连接中。要理解IP地址…

PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第一部分)

在填充 PDF 中的图形时&#xff08;以及许多其他技术中&#xff09;&#xff0c;你可以选择使用 Even-Odd&#xff08;奇偶&#xff09; 或 Non-Zero&#xff08;非零&#xff09; 填充规则。 对于那些已经在想“你在说啥&#xff1f;”的朋友&#xff0c;别担心&#xff0c;我…

【八股消消乐】MySQL参数优化大汇总

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本专栏《八股消消乐》旨在记录个人所背的八股文&#xff0c;包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点&#xff…

CSS 平铺+自动换行效果

先上效果图 样式 <template><div class"activity-questions"><h1>活动题库</h1><div v-if"loading" class"loading">加载中...</div><div v-else><div v-if"questions.length 0" clas…

微服务网关SpringCloudGateway+SaToken鉴权

目录 概念 前置知识回顾 拿到UserInfo 用于自定义权限和角色的获取逻辑 最后进行要进行 satoken 过滤器全局配置 概念 做权限认证的时候 我们首先要明确两点 我们需要的角色有几种 我们需要的权限有几种 角色 分两种 ADMIN 管理员 &#xff1a;可管理商品 CUSTIOMER 普通…

永磁同步电机控制算法--模糊PI转速控制器

一、原理介绍 在常规的PID控制系统的基础上提出了一种模糊PID以及矢量变换方法相结合的控制系统&#xff0c;经过仿真分析对比证明&#xff1a; 模糊PID控制系统能够有效的提高永磁同步电机的转速响应速度&#xff0c;降低转矩脉动&#xff0c;增强了整体控制系统的抗干扰能力…

Elasticsearch集群最大分片数设置详解:从问题到解决方案

目录 前言 1 问题背景&#xff1a;重启后设置失效 2 核心概念解析 2.1 什么是分片(Shard)&#xff1f; 2.2 cluster.max_shards_per_node的作用 2.3 默认值是多少&#xff1f; 3 参数设置的两种方式 3.2 持久性设置(persistent) 3.2 临时设置(transient) 4 问题解决方…

DVWA全靶场

目录 暴破 Low - 万能密码 Medium - 转义 High - Token Impossible 命令注入 CSRF跨站请求伪造 - 抓包 Low Medium - 域名限制 High - 域名限制xss 文件包含 - 页面点点点 Low Medium - 过滤http:// High - file Impossible - 写死 文件上传 Low Medium - 文件…