(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.pswp.cn/web/78375.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78375.shtml
英文地址,請注明出處:http://en.pswp.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…