全部VTK程序设计系列博客 见 VTK程序设计系列
mhd文件包含一个.mhd用来存放信息,和一个.raw文件来存放数据。
我们用记事本随便打开一个三维的Mhd文件:
ObjectType = Image
NDims = 3
BinaryData = True
BinaryDataByteOrderMSB = False
CompressedData = True
CompressedDataSize = 6193601
TransformMatrix = 1 0 0 0 1 0 0 0 1
Offset = -125 -858 -63
CenterOfRotation = 0 0 0
ElementSpacing = 0.976562 1.4 0.976562
DimSize = 256 230 256
AnatomicalOrientation = ???
ElementType = MET_SHORT
ElementDataFile = manix_small.raw
可以看到维数是3,二进制数据,并且是压缩过的数据。三维的每个数据在实际空间中的距离分别为: 0.976562 1.4 0.976562 。
数据的大小是256*230*256的。
我们记住这些数据,然后开始写程序:
注意因为我们使用的是VTK7.1,所以说老的VTK5的一些类中的GetOutput或者setInput需要进行更改,例如需要改为SetInputData,两种方法可以看我的其他博客:VTK7.1版本显示图像的两种方法
现在我们先敲入如下程序:
#include<vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
// first include the required header files for the vtk classes we are using
#include <vtkSmartPointer.h>
#include <vtkMetaImageReader.h>
#include <vtkImageViewer2.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include "vtkRenderWindowInteractor.h"
#include <vtkImageCast.h>
#include <vtkImageData.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
vtkSmartPointer<vtkMetaImageReader> reader =
vtkSmartPointer<vtkMetaImageReader>::New();
reader->SetFileName("C:\\Developer\\VTK_code\\mhdfile\\manix_small.mhd");
reader->Update();
vtkSmartPointer<vtkImageCast> ImageCast = vtkImageCast::New();
ImageCast->SetInputData((vtkImageData*)reader->GetOutput());
ImageCast->SetOutputScalarTypeToShort();
ImageCast->Update();
int * volumeData = ImageCast->GetOutput()->GetExtent();
ImageCast->GetOutput()->GetScalarPointer();
cout << "volumeData[1] = " << volumeData[1]+1 << endl;
cout << "volumeData[3] = " << volumeData[3]+1 << endl;
cout << "volumeData[5] = " << volumeData[5]+1 << endl;
system("pause");
return 0;
}
然后运行,得到:
volumeData[1] = 256
volumeData[3] = 230
volumeData[5] = 256
说明数据读取的是对的。
注意我们的数据的指针在 ImageCast->GetOutput()->GetScalarPointer();这里。
所以我们可以通过新建一个short形指针,然后分配内存,并用memcpy函数复制过去。