最近在做VTK体绘制的学习,中途花费了大量的时间,进展十分缓慢,最终成功,将个中细节公布出来,以飨后人
来源:互联网 发布:sql重庆培训 编辑:程序博客网 时间:2024/04/29 22:59
不知道什么原因,国内有关VTK,体绘制的博客少之又少,大部分内容也多互相借鉴,有价值的信息少之又少,大部分代码也存在着各种各样的问题
也可能因为我才疏学浅,配置上有一定的问题,但是99%的代码都不能成功运行,十分不利于初学者学习,因此想到在成功以后将自己的代码Po上,
方便大家学习交流
关键词:VTK7.0 CMAKE 体绘制 VolumeRender 高斯滤波 各向异性扩散滤波 .RAW文件读取 VolumeMapper
代码:
#include <vtkSmartPointer.h>
#include <vtkSmartVolumeMapper.h>
#include <vtkColorTransferFunction.h>
#include <vtkPiecewiseFunction.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkVolumeProperty.h>
#include <vtkCamera.h>
#include <vtkImageData.h>
#include <vtkImageReader.h>
#include <vtkVolumeRayCastMapper.h>
#include <vtkImageGaussianSmooth.h>
#include <vtkImageAnisotropicDiffusion2D.h>
static void CreateImageData(vtkImageData* im);
int main(int argc, char *argv[])
{
vtkSmartPointer<vtkImageData> imageData =
vtkSmartPointer<vtkImageData>::New();
CreateImageData(imageData);
//*********************************************************调用函数 创建图像
vtkSmartPointer<vtkRenderWindow> renWin =
vtkSmartPointer<vtkRenderWindow>::New();
vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();
ren1->SetBackground(0.1,0.4,0.2);
renWin->AddRenderer(ren1);
renWin->SetSize(500,500);
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
renWin->Render();
//********************************************************创建窗口
vtkSmartPointer<vtkSmartVolumeMapper> volumeMapper =
vtkSmartPointer<vtkSmartVolumeMapper>::New();
volumeMapper->SetBlendModeToComposite();
volumeMapper->SetInputData(imageData);
vtkSmartPointer<vtkVolumeProperty> volumeProperty =
vtkSmartPointer<vtkVolumeProperty>::New();
volumeProperty->ShadeOff();
volumeProperty->SetInterpolationType(VTK_LINEAR_INTERPOLATION);
//*********************************************************Mapper
vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity =
vtkSmartPointer<vtkPiecewiseFunction>::New();
compositeOpacity->AddPoint(10, 0.0);//灰度值及不透明度值
compositeOpacity->AddPoint(50, 0.1);
compositeOpacity->AddPoint(200, 0.1);
compositeOpacity->AddPoint(2900, 0.1);
compositeOpacity->AddPoint(2950, 0.8);
compositeOpacity->AddPoint(3050, 1);//不透明度值为1则为完全不透明
compositeOpacity->ClampingOff();
volumeProperty->SetScalarOpacity(compositeOpacity); // composite first.
vtkSmartPointer<vtkColorTransferFunction> color =
vtkSmartPointer<vtkColorTransferFunction>::New();
color->AddRGBPoint(0.0 ,0.0,1.0,1.0);
color->AddRGBPoint(40.0 ,0.69,0.06,0.09);
color->AddRGBPoint(200.0,0.8,0.9,0.9);
color->AddRGBPoint(1200.0, 0.43, 0.43, 0.43);
color->AddRGBPoint(1800.0, 0.43, 0.43, 0.43);
volumeProperty->SetColor(color);
vtkPiecewiseFunction *gradient = vtkPiecewiseFunction::New();
gradient->AddPoint(0, .25);//灰度值变化梯度与不透明度的关系
gradient->AddPoint(40, .7);
gradient->AddPoint(200, .5);
volumeProperty->SetGradientOpacity(gradient);
//*********************************************************设置绘制参数:颜色,透明度
volumeProperty->SetInterpolationTypeToLinear();//采用线性插值
vtkSmartPointer<vtkVolume> volume =
vtkSmartPointer<vtkVolume>::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
ren1->AddViewProp(volume);
//*********************************************************参数传递
ren1->ResetCamera();
renWin->Render();
// volumeMapper->SetRequestedRenderModeToRayCast();
volumeMapper->SetRequestedRenderModeToGPU();
renWin->Render();
iren->Start();
return EXIT_SUCCESS;
}
void CreateImageData(vtkImageData* imageData)
{
vtkImageReader *reader = vtkImageReader::New();
reader->SetFileName("F:\\bone.raw");
reader->SetFileDimensionality(3);//设置显示图像的维数
reader->SetDataScalarType(VTK_UNSIGNED_CHAR);//VTK_UNSIGNED_short将数据转换为unsigned char型
reader->SetDataExtent(0, 255, 0, 255, 1, 106);//图片属性图片像素256x256 NOTICE(0,255)表示从0到255
reader->SetDataSpacing(0.87, 0.87, 2.0); //设置像素间间距
reader->SetDataOrigin(0, 0, 0);
reader->Update();
vtkImageReader *reader2 = vtkImageReader::New();
reader2->SetFileName("F:\\walnut-shell-mask.raw");
reader2->SetFileDimensionality(3);//设置显示图像的维数
reader2->SetDataScalarType(VTK_UNSIGNED_CHAR);//VTK_UNSIGNED_short将数据转换为unsigned char型
reader2->SetDataExtent(0, 399, 0, 295, 1, 352);//图片属性图片像素400X296 最后两个参数设置图像个数
reader2->SetDataSpacing(1.0, 1.0, 1.0); //设置像素间间距
reader2->SetDataOrigin(0.0, 0.0, 0.0);
vtkImageReader *reader4 = vtkImageReader::New();
reader4->SetFileName("F:\\walnut-core-mask.raw");
reader4->SetFileDimensionality(3);//设置显示图像的维数
reader4->SetDataScalarType(VTK_UNSIGNED_CHAR);//VTK_UNSIGNED_short将数据转换为unsigned char型
reader4->SetDataExtent(0, 399, 0, 295, 1, 352);//图片属性图片像素256x256,最后两参数表示有124张图
reader4->SetDataSpacing(1.0, 1.0, 1.0); //设置像素间间距
reader4->SetDataOrigin(0.0, 0.0, 0.0);
vtkImageReader *reader3 = vtkImageReader::New();
reader3->SetFileName("F:\\mouse0.raw");
reader3->SetFileDimensionality(3);//设置显示图像的维数
reader3->SetDataScalarType(VTK_UNSIGNED_SHORT);//VTK_UNSIGNED_short将数据转换为unsigned char型
reader3->SetDataExtent(0, 149, 0, 149, 1, 276);//图片属性图片像素256x256,最后两参数表示有124张图
reader3->SetDataSpacing(1.0, 1.0, 1.0); //设置像素间间距
reader3->SetDataOrigin(0.0, 0.0, 0.0);
/* vtkSmartPointer<vtkImageGaussianSmooth> gaussianSmoothFilter =
vtkSmartPointer<vtkImageGaussianSmooth>::New();
gaussianSmoothFilter->SetInputConnection(reader->GetOutputPort());
gaussianSmoothFilter->SetDimensionality(3);
gaussianSmoothFilter->SetRadiusFactor(5);
gaussianSmoothFilter->SetStandardDeviation(3);
gaussianSmoothFilter->Update();
imageData->ShallowCopy(gaussianSmoothFilter->GetOutput());*/
//************************************************************高斯滤波,效果不错 但是会丢失部分细节
vtkSmartPointer<vtkImageAnisotropicDiffusion2D> diffusion = vtkSmartPointer<vtkImageAnisotropicDiffusion2D>::New();
diffusion->SetInputConnection(reader4->GetOutputPort());
diffusion->SetNumberOfIterations(10);
diffusion->SetDiffusionThreshold(20);
diffusion->Update();
imageData->ShallowCopy(diffusion->GetOutput());
//***********************************************************各向异性扩散滤波,效果不错,不会丢失细节,
//***********************************************************但是由于采用多次迭代方式,需要大量绘制时间并且在
//***********************************************************绘制时会占用大量cpu资源,本例采用了效果更好的各向异性扩散滤波
}
CMAKELIST:
cmake_minimum_required(VERSION 2.8)
PROJECT(SmartVolumeMapper)
find_package(VTK REQUIRED)
include(${VTK_USE_FILE})
add_executable(SmartVolumeMapper MACOSX_BUNDLE SmartVolumeMapper)
if(VTK_LIBRARIES)
target_link_libraries(SmartVolumeMapper ${VTK_LIBRARIES})
else()
target_link_libraries(SmartVolumeMapper vtkHybrid vtkWidgets)
endif()
说明:
1 本例实现了对.RAW文件的读取,使用SmartVolumeMapper进行体绘制 得出图像,并使用各向异性滤波方式对图像进行了优化
2 本例使用CMAKELIST方式生成项目编译运行,同样,十分推荐新手学习使用CMAKELIST方式,不推荐新建工程再导入依赖文
件的方式,太过复杂,成功率也很低
3 本例不提供VTK安装的方法,请移步
4 版本:VTK7.0 cmake3.7
- 最近在做VTK体绘制的学习,中途花费了大量的时间,进展十分缓慢,最终成功,将个中细节公布出来,以飨后人
- 毕业设计的进展以及最近生病了
- 最近在做ShareSDK的微信分享的时候遇到了点问题,就是分享的时候选择微信好友或者微信朋友圈会打开一下微信然后界面都还没加载出来就闪退。这个问题我在网上找了好多种的可能的情况以及处理办法,最终找到了
- 最近在排查一个core问题,对dmesg的时间戳,做了一个转化工具
- MyOS最近的进展
- 最近的一些进展
- 最近的论文进展
- 最近的工作进展
- lcd中动画十分缓慢的原因
- Tomcat启动缓慢 Creation of SecureRandom instance for ... 花费时间过长的解决方法
- Linux环境下段错误的产生原因及调试方法小结 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是
- 最近在利用DSP做一个项目,好久没来自己的空间了,后续有时间会发一些自己的学习经验,呵呵!
- rac insert速度十分缓慢,索引维护浪费大量时间,如何优化?
- 苹果公布了一些最新无人车进展,但,研发依然缓慢
- 时间透露出来的成功秘诀
- Science杂志公布的大量的机器学习资源
- 最近抽空在学习VIM,找到了一个介绍快捷方式的,留下做个备注
- 经过最近的努力,终于将ucLinux2008R1.5-RC3运行了在新做的板子上。
- 学习笔记 - React Native
- 主机规划与磁盘分区
- Java地位无可动摇的12个原因
- 简述JavaScript对象、数组对象与类数组对象
- rxJava&rxAndroid-进阶篇
- 最近在做VTK体绘制的学习,中途花费了大量的时间,进展十分缓慢,最终成功,将个中细节公布出来,以飨后人
- 名人如何谈技术:关于技术的20个名言
- k-means聚类算法
- redis 原理
- 微信模块介绍
- c++递归创建二叉树
- 全方位比较PHP的Node.js的优缺点
- leetCode练习(101)
- 洛谷P14341 滑雪