VTK 读取本地rawdata数据
最近项目中要求将设备采集的数据以三维的形式显示出来,经过检索发现VTK的体渲染能够满足项目需求。
现在先对设备采集的数据做一些描述:设备每帧采集320根线,每根线由1024个点组成,每个点保存为无符号字符型(unsigned char),每次采集320帧。也即每次采集320 x 1024 x 320 x sizeof(unsigned char)数据量的rawdata。
体渲染rawdata读取
VTK 提供了很多的图像读取类以读取相应的图像格式(如 vtkPNGReader),经过检索,要读取项目中的这种数据我用到了vtkImageReader,下面代码展示了读取方式(C#):
vtkImageReader reader = vtkImageReader.New();
reader.SetFileName("rawdata_path.bin");
reader.SetNumberOfScalarComponents(1);
reader.SetDataScalarTypeToUnsignedChar();//将数据设定为unsigned char型
reader.SetFileDimensionality(3);//设置显示图像的维数
reader.SetDataExtent(0, 319, 0, 1023, 0, 319);
//图片属性图片像素320*1024,最后两参数表示有320张图
//故x方向索引为0~319,y:0~1023,z:0~319
reader.SetDataSpacing(1, 0.5, 1);
//设置x,y,z像素间间距,为了不让生成的模型太长,把y方向做了压缩
reader.update();
之后就可以将reader.GetOutputPort()加入到后续处理管线当中。但此种方法在尝试后发现即便调用reader.Dispose();释放,程序仍然占有rawdata_path.bin文件,在后续程序其他位置继续读取该文件时就会导致读取失败。不知道是什么原因。。。
IntPtr传入rawData数据
为了解决上面提到的文件占用问题,我决定不直接调用VTK的vtkImageReader,改为先将数据读到内存中,再将数据传给VTK,以下为相应C#代码( 其中:rawDataIntPtr 为上面rawdata_path.bin文件读取到内存的句柄,具体读取方法略):
vtkImageImport imageImport = vtkImageImport.New();
imageImport.SetImportVoidPointer(rawDataIntPtr);
imageImport.SetDataScalarTypeToUnsignedChar();
imageImport.SetWholeExtent(0, 319, 0, 1023, 0, 319);
imageImport.SetDataSpacing(1, 0.5, 1);
imageImport.SetDataExtentToWholeExtent();
imageImport.Update();
之后就可以将 imageImport.GetOutputPort() 加入到后续处理管线当中。