文章目錄
- 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
;程序流程如下:
準備數據
- 讀取圖片:使用
vtkJPEGReader
讀取指定路徑的圖片。- RGB轉HSV:將讀取的RGB圖像轉換為HSV格式。
- 提取通道:從HSV圖像中提取指定的通道(此處為亮度通道)。
- 閾值處理:對提取的通道進行閾值處理,將亮度值高于指定閾值的像素設置為白色,低于閾值的像素設置為黑色。
- 獲取閾值范圍:獲取閾值處理后的圖像范圍。
- 種子連接:基于種子點進行區域生長分割,連接相似的像素。
- 高斯平滑:對圖像進行高斯平滑處理,濾除高頻噪聲。
- 3D縮小:對圖像進行3D縮小處理,減少數據量。
轉換為多邊形數據
- 幾何過濾:將圖像數據轉換為多邊形數據。
- 紋理映射:將紋理映射到多邊形數據上。
- 裁剪多邊形數據:根據指定的值裁剪多邊形數據。
- 三角形過濾:將多邊形數據中的所有多邊形單元分解為三角形單元。
- 降采樣:通過減少三角形數量來降低網格復雜度。
3D渲染
- 線性擠壓:將2D多邊形數據沿指定方向拉伸為3D結構。
- 設置映射器和演員:創建映射器和演員,將擠壓后的3D數據映射給演員。
- 設置紋理:為演員設置紋理。
- 創建渲染器和渲染窗口:創建渲染器和渲染窗口,將演員添加到渲染器中,并設置渲染窗口的大小。
- 設置交互器:創建渲染窗口交互器,并設置其與渲染窗口的關聯。
- 調整相機和渲染:重置相機,調整其方位、仰角和縮放比例,然后渲染場景。
開始交互
- 啟動渲染窗口交互器,允許用戶與渲染場景進行交互。
演示文件下載地址
環境 | 說明 |
---|---|
系統 | ubuntu22.04、windows11 |
cmake | 3.22、3.25 |
Qt | 5.14.2 |
編譯器 | g++11.4、msvc2017 |
VTK | 9.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;
}