(33)VTK C++开发示例 ---图片转3D

文章目录

    • 1. 概述
    • 2. CMake链接VTK
    • 3. main.cpp文件
    • 4. 演示效果


更多精彩内容
👉内容导航 👈
👉VTK开发 👈

1. 概述

这是 VTK 测试 clipArt.tcl 的改编版本。

提供带有 2D 剪贴画的 jpg 文件,该示例将创建 3D 多边形数据模型。这些示例说明了许多 VTK 类,包括 vtkImageThreshold、vtkImageSeedConnectivity、vtkDecimatePro 和 vtkClipPolyData。

该示例假定图像具有白色背景。试试这个 .src/Testing/Data/stormy.jpg

程序流程如下:

  1. 准备数据

    • 读取图片:使用 vtkJPEGReader 读取指定路径的图片。
    • RGB转HSV:将读取的RGB图像转换为HSV格式。
    • 提取通道:从HSV图像中提取指定的通道(此处为亮度通道)。
    • 阈值处理:对提取的通道进行阈值处理,将亮度值高于指定阈值的像素设置为白色,低于阈值的像素设置为黑色。
    • 获取阈值范围:获取阈值处理后的图像范围。
    • 种子连接:基于种子点进行区域生长分割,连接相似的像素。
    • 高斯平滑:对图像进行高斯平滑处理,滤除高频噪声。
    • 3D缩小:对图像进行3D缩小处理,减少数据量。
  2. 转换为多边形数据

    • 几何过滤:将图像数据转换为多边形数据。
    • 纹理映射:将纹理映射到多边形数据上。
    • 裁剪多边形数据:根据指定的值裁剪多边形数据。
    • 三角形过滤:将多边形数据中的所有多边形单元分解为三角形单元。
    • 降采样:通过减少三角形数量来降低网格复杂度。
  3. 3D渲染

    • 线性挤压:将2D多边形数据沿指定方向拉伸为3D结构。
    • 设置映射器和演员:创建映射器和演员,将挤压后的3D数据映射给演员。
    • 设置纹理:为演员设置纹理。
    • 创建渲染器和渲染窗口:创建渲染器和渲染窗口,将演员添加到渲染器中,并设置渲染窗口的大小。
    • 设置交互器:创建渲染窗口交互器,并设置其与渲染窗口的关联。
    • 调整相机和渲染:重置相机,调整其方位、仰角和缩放比例,然后渲染场景。
  4. 开始交互

    • 启动渲染窗口交互器,允许用户与渲染场景进行交互。

    演示文件下载地址

环境说明
系统ubuntu22.04、windows11
cmake3.22、3.25
Qt5.14.2
编译器g++11.4、msvc2017
VTK9.4.1

2. CMake链接VTK

cmake_minimum_required(VERSION 3.20 FATAL_ERROR) # 设置CMake最低版本
project(vtk2) # 设置项目名称
# 查找VTK库
find_package(VTK COMPONENTS 
CommonCore
CommonExecutionModel
FiltersCore
FiltersGeometry
FiltersModeling
FiltersTexture
IOImage
ImagingColor
ImagingCore
ImagingGeneral
ImagingMorphological
InteractionStyle
RenderingContextOpenGL2
RenderingCore
RenderingFreeType
RenderingGL2PSOpenGL2
RenderingOpenGL2
)if(NOT VTK_FOUND)
message("VTK not found")
return()
endif()add_executable(vtk2 main.cpp) # 添加可执行文件target_link_libraries(vtk2 PRIVATE ${VTK_LIBRARIES}) # 链接VTK库
vtk_module_autoinit(TARGETS vtk2 MODULES ${VTK_LIBRARIES}) # 初始化VTK模块

3. main.cpp文件

/********************************************************************************
* 文件名:   main.cpp
* 创建时间: 2025-03-22 15:34:01
* 开发者:   MHF
* 邮箱:     1603291350@qq.com
* 功能:     
*********************************************************************************/
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkClipPolyData.h>
#include <vtkDecimatePro.h>
#include <vtkImageDataGeometryFilter.h>
#include <vtkImageExtractComponents.h>
#include <vtkImageGaussianSmooth.h>
#include <vtkImageRGBToHSV.h>
#include <vtkImageSeedConnectivity.h>
#include <vtkImageShrink3D.h>
#include <vtkImageThreshold.h>
#include <vtkJPEGReader.h>
#include <vtkLinearExtrusionFilter.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkTexture.h>
#include <vtkTextureMapToPlane.h>
#include <vtkTriangleFilter.h>#include <vtkInformation.h>
#include <vtkStreamingDemandDrivenPipeline.h>#include <iostream>
#include <string>using namespace std;int main()
{/********************准备数据************/vtkNew<vtkJPEGReader> reader; // 读取图片reader->SetFileName("e:/lib/VTK/vtk-data/Data/stormy.jpg");// 将图像转换为hsv,以便我们可以对值进行阈值。vtkNew<vtkImageRGBToHSV> rgbToHsv; // RGB转HSVrgbToHsv->SetInputConnection(reader->GetOutputPort());vtkNew<vtkImageExtractComponents> extractImage; extractImage->SetInputConnection(rgbToHsv->GetOutputPort());extractImage->SetComponents(2); // 通道索引从0开始(0=R通道,1=G通道,2=B通道,对于RGB图像)// 黑白图像的阈值。vtkNew<vtkImageThreshold> threshold; // 阈值threshold->SetInputConnection(extractImage->GetOutputPort());threshold->ThresholdByUpper(230);   // 设置阈值threshold->SetInValue(255);          // 设置阈值内的值threshold->SetOutValue(0);           // 设置阈值外的值threshold->Update();                // 更新threshold->UpdateInformation(); // 更新信息// 获取阈值的范围,extent[0]和extent[1]为x方向的范围,extent[2]和extent[3]为y方向的范围。int* extent = threshold->GetOutputInformation(0)->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT());// 基于种子点进行区域生长分割,从指定种子点扩展并连接相似像素/体素。vtkNew<vtkImageSeedConnectivity> seedConnectivity; // 种子连接seedConnectivity->SetInputConnection(threshold->GetOutputPort());seedConnectivity->SetOutputConnectedValue(255); // 设置连接值seedConnectivity->SetOutputUnconnectedValue(0); // 设置未连接值seedConnectivity->AddSeed(extent[0], extent[2]);   seedConnectivity->AddSeed(extent[1], extent[2]);   seedConnectivity->AddSeed(extent[1], extent[2]);   seedConnectivity->AddSeed(extent[0], extent[3]);   // 对图像进行高斯平滑(模糊)处理,通过高斯卷积核滤除高频噪声,常用于图像预处理。vtkNew<vtkImageGaussianSmooth> gaussianSmooth; // 高斯平滑gaussianSmooth->SetInputConnection(seedConnectivity->GetOutputPort());gaussianSmooth->SetStandardDeviations(1.0, 1.0, 1.0);gaussianSmooth->SetDimensionality(2); // 设置维度vtkNew<vtkImageShrink3D> shrink; // 3D缩小shrink->SetInputConnection(gaussianSmooth->GetOutputPort());shrink->SetShrinkFactors(1, 1, 1); // 设置缩小因子,参数为x,y,z方向上的缩小因子,默认为1,1,1。shrink->AveragingOn(); // 打开平均// 几何过滤器,将图像数据转换为多边形数据。vtkNew<vtkImageDataGeometryFilter> geometryFilter; // 几何过滤器geometryFilter->SetInputConnection(shrink->GetOutputPort());vtkNew<vtkTextureMapToPlane> textureMapToPlane; // 纹理映射到平面textureMapToPlane->SetInputConnection(geometryFilter->GetOutputPort());textureMapToPlane->SetOrigin(0, 0, 0); // 设置原点textureMapToPlane->SetPoint1(extent[1], 0, 0); // 设置点1,extent[1]为图像的宽度,参数为x,y,z方向上的点坐标,默认为0,0,0。textureMapToPlane->SetPoint2(0, extent[3], 0); // 设置点2vtkNew<vtkClipPolyData> clip; // 裁剪多边形数据clip->SetInputConnection(textureMapToPlane->GetOutputPort());clip->SetValue(5.5); // 裁剪多边形数据的值,参数范围为0-255,默认为0。clip->GenerateClipScalarsOff(); // 关闭生成裁剪标量clip->InsideOutOff(); // 关闭内部clip->InsideOutOn(); // 打开内部// 主要用于将输入的多边形数据(PolyData)中的所有多边形单元(如四边形、多边形等)分解为三角形单元vtkNew<vtkTriangleFilter> triangleFilter; // 三角形过滤器triangleFilter->SetInputConnection(clip->GetOutputPort());// 通过减少多边形数量(特别是三角形)来降低网格复杂度,同时尽可能保留原始模型的几何特征。适用于需要优化渲染性能或减小数据量的场景。vtkNew<vtkDecimatePro> decimate; // 降采样decimate->SetInputConnection(triangleFilter->GetOutputPort());decimate->BoundaryVertexDeletionOn(); // 开启边界顶点删除decimate->SetDegree(100); // 设置度数,参数为0-180,默认为15。decimate->PreserveTopologyOn(); // 保持拓扑结构decimate->SetTargetReduction(0.99); // 设置目标缩减,参数为0-1,默认为0.9。// 用于 线性拉伸 2D 几何图形生成 3D 体 的过滤器。它通过将输入的 2D 多边形(如线条、多边形、轮廓)沿指定方向拉伸,生成具有厚度的 3D 结构(如棱柱、管道等)。vtkNew<vtkLinearExtrusionFilter> extrusion; // 线性挤压extrusion->SetInputConnection(decimate->GetOutputPort());extrusion->SetExtrusionTypeToNormalExtrusion(); // 设置挤压类型为正常挤压extrusion->SetScaleFactor(50); // 用于将 2D 几何图形沿指定方向拉伸生成 3D 体。取值/********************* 开始绘制************************/vtkNew<vtkPolyDataMapper> mapper; // 映射器mapper->SetInputConnection(extrusion->GetOutputPort());mapper->ScalarVisibilityOff(); // 标量可见性关闭,让 vtkMapper 忽略输入数据中的标量值,转而使用 vtkProperty 中定义的颜色或材质属性进行渲染。vtkNew<vtkTexture> texture; // 纹理texture->InterpolateOn(); // 插值,设置为true时,将使用插值算法对纹理进行插值。texture->SetInputConnection(reader->GetOutputPort()); // 设置输入连接vtkNew<vtkActor> actor; // 演员actor->SetMapper(mapper);actor->SetTexture(texture); // 设置纹理vtkNew<vtkRenderer> renderer; // 渲染器renderer->AddActor(actor);renderer->SetBackground(0.1, 0.2, 0.4); // 设置背景颜色,参数为红、绿、蓝三个通道的颜色值,取值范围为0-1vtkNew<vtkRenderWindow> renderWindow; // 渲染窗口renderWindow->AddRenderer(renderer);renderWindow->SetSize(800, 800); // 设置窗口大小vtkNew<vtkRenderWindowInteractor> renderWindowInteractor; // 渲染窗口交互器renderWindowInteractor->SetRenderWindow(renderWindow);renderer->ResetCamera(); // 重置相机renderer->GetActiveCamera()->Azimuth(30);renderer->GetActiveCamera()->Elevation(30);renderer->GetActiveCamera()->Dolly(1.5);renderer->ResetCameraClippingRange(); // 重置相机裁剪范围renderWindow->Render(); // 渲染renderWindowInteractor->Start(); // 开始return 0;
}

4. 演示效果

在这里插入图片描述



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/78375.shtml

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

相关文章

2025东三省B题深圳杯B题数学建模挑战赛数模思路代码文章教学

完整内容请看文章最下面的推广群 已经完成全部问题的代码和建模 一、问题一的模型构建与优化&#xff08;RGB颜色空间转换模型&#xff09; 基础模型&#xff08;线性映射模型&#xff09;/高斯过程回归模型&#xff08;GPR&#xff09;&#xff1a; 针对高清视频源&#xff0…

linux netlink实现用户态和内核态数据交互

1&#xff0c;内核态代码 #include <linux/module.h> #include <linux/netlink.h> #include <net/sock.h> #define NETLINK_TEST 31 struct sock *nl_sk NULL; static void nl_recv_msg(struct sk_buff *skb) { struct nlmsghdr *nlh; int pid; …

LeetCode:DP-多状态问题

简单 面试题 17.16. 按摩师 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在每次预约服务之间要有休息时间&#xff0c;因此她不能接受相邻的预约。给定一个预约请求序列&#xff0c;替按摩师找到最优的预约集合&#xff08;总预约时间最…

Spring AOP---面向切面编程由认识到使用

1. AOP AOP(Aspect-Oriented Programming), 是一种思想, 面向切面编程。 在前文统一异常处理&#xff0c;统一结果返回就是使用了这一思想&#xff08;都是在集中处理某一类事情, 但又不影响原有代码的正常运行&#xff09;&#xff0c;但他们不是AOP&#xff0c;只是应用了这…

专题二十四:虚拟专用网络

一、VPN简介 VPN&#xff08;Virtual Personal Network&#xff09;即虚拟专用网&#xff0c;泛指通过VPN技术在公用网络上构建的虚拟专用网络。VPN用户在此虚拟网络中传输私网流量&#xff0c;在不改变网络现状的情况下实现安全、可靠的连接。其主要功能是在公用网络上建立专…

Milvus(12):分析器

1 分析器概述 在文本处理中&#xff0c;分析器是将原始文本转换为结构化可搜索格式的关键组件。每个分析器通常由两个核心部件组成&#xff1a;标记器和过滤器。它们共同将输入文本转换为标记&#xff0c;完善这些标记&#xff0c;并为高效索引和检索做好准备。 在 Milvus 中&a…

Power Query精通指南1:查询结构设计、数据类型、数据导入与迁移(平面文件、Excel、Web)

文章目录 零、Power Query简介0.1 Power Query 主要功能0.2 Power Query 的优势0.3 Power Query 组件 一、Power Query数据处理基本流程1.1 前期准备1.2 提取1.3 转换1.3.1 Power Query 编辑器界面1.3.2 默认转换1.3.3 自定义转换 1.4 加载1.4.1 自动检测数据类型1.4.2 重命名查…

WebRTC 服务器之Janus概述和环境搭建

1 概述 Janus 是由 Meetecho 开发的通用 WebRTC 服务器&#xff0c;它为构建 WebRTC 应用程序提供了一个模块化框架。服务器目标&#xff1a;Janus WebRTC 网关被设计为轻量级、通用的 WebRTC 服务器&#xff0c;除了实现以下方法外&#xff0c;它本身不提供任何功能&#xff1…

19:常见的Halcon数据格式

遍历文件夹与文件选择 1&#xff09;遍历文件夹&#xff1a; list_files( : : Directory, Options : Files) Directory&#xff1a;目录&#xff08;文件夹路径&#xff09; Options&#xff1a;选项 files 指定搜索的格式为文件 directories 指定搜索的格式为文件夹 re…

QML图像提供器 (Image Provider)

QML 中的图像提供器是一种自定义图像加载机制&#xff0c;允许你从非文件源&#xff08;如数据库、网络或程序生成的内容&#xff09;提供图像数据。 主要类型 QQuickImageProvider - 基础图像提供器 QPixmapImageProvider - 提供 QPixmap 图像 QImageImageProvider - 提供 …

计算机视觉与深度学习 | 双目立体匹配算法理论+Opencv实践+matlab实践

双目立体匹配 一、双目立体匹配算法理论与OpenCV、matlab实践一、双目立体匹配理论二、OpenCV实践三、优化建议四、算法对比与适用场景二、双目立体匹配算法理论及Matlab实践指南一、双目立体匹配理论二、Matlab实践步骤三、算法对比与优化建议四、完整流程示例五、常见问题与解…

AI国学智慧语录视频,条条视频10W+播放量

家人们&#xff01;图书类带货玩法真的非常多&#xff0c;之前也分享过蛮多&#xff0c;例如情感语录、育儿教育、爆款图书金句类、AI历史人物解说类等等。 本期继续来分享一个对于普通人来说&#xff0c;上手相当简单&#xff0c;容易起号&#xff0c;可作为长线深耕的AI带货…

echart图表使用

2、接口编写 该部分代码定义了UserController控制器类&#xff0c;用于处理与用户相关的请求。包含一个用于跳转页面的方法和一个返回用户详细数据&#xff08;以 JSON 格式呈现&#xff09;的接口。前者负责将用户导航至指定页面&#xff0c;后者通过构建ChartVO对象并填充数…

Android短信监控技术实现:合法合规的远程采集方案

一年经验的全栈程序员&#xff0c;目前头发健在&#xff0c;但不知道能撑多久。 该项目已成功部署并稳定运行于企业生产环境&#xff0c;如需个性化定制方案&#xff0c;欢迎联系作者进行深度合作。 文章目录 前言 一、页面设计 1.页面显示 2.代码实现 二、具体代码实现 1.添加…

前端跨域问题怎么在后端解决

目录 简单的解决方法&#xff1a; 添加配置类&#xff1a; 为什么会跨域 1. 什么是源 2. URL结构 3. 同源不同源举&#x1f330; 同源例子 不同源例子 4. 浏览器为什么需要同源策略 5. 常规前端请求跨域 简单的解决方法&#xff1a; 添加配置类&#xff1a; packag…

【中间件】brpc_基础_execution_queue

execution_queue 源码 1 简介 execution_queue.h 是 Apache BRPC 中实现 高性能异步任务执行队列 的核心组件&#xff0c;主要用于在用户态线程&#xff08;bthread&#xff09;中实现任务的 异步提交、有序执行和高效调度。 该模块通过解耦任务提交与执行过程&#xff0c;提…

java学习之数据结构:一、数组

主要是对数组所有的东西进行总结&#xff0c;整理 适合小白~ 目录 1.什么是数组 1.1数组定义 1.2数组创建 1&#xff09;静态创建 2&#xff09;动态创建 1.3数组遍历 1&#xff09;for和while遍历 2&#xff09;foreach遍历 2.数组越界问题及解决 2.1数组越界问题 2…

[Survey]SAM2 for Image and Video Segmentation: A Comprehensive Survey

BaseInfo TitleSAM2 for Image and Video Segmentation: A Comprehensive SurveyAdresshttps://arxiv.org/abs/2503.12781Journal/Time2503Author四川大学&#xff0c;北京大学 1. Introduction 图像分割专注于识别单个图像中的目标、边界或纹理&#xff0c;而视频分割则将这…

用Maven定位和解决依赖冲突

用Maven定位和解决依赖冲突 一、依赖冲突的常见表现二、定位冲突依赖的4种方法2.1 使用Maven命令分析依赖树2.2 使用IDE可视化工具2.3 使用Maven Enforcer插件2.4 运行时分析 三、解决依赖冲突的5种方案3.1 排除特定传递依赖3.2 统一指定版本&#xff08;推荐&#xff09;3.3 使…

穿越数据森林与网络迷宫:树与图上动态规划实战指南

在 C 算法的浩瀚宇宙中&#xff0c;树与图就像是神秘的迷宫和茂密的森林&#xff0c;充满了未知与挑战。而动态规划则是我们探索其中的神奇罗盘&#xff0c;帮助我们找到最优路径。今天&#xff0c;就让我们一起深入这片神秘领域&#xff0c;揭开树与图上动态规划的神秘面纱&am…