#include "ui_mainwindow.h"#include "itkImage.h"#include "itkImageFileReader.h"#include "itkImageToVTKImageFilter.h"#include <itkGDCMImageIO.h> //此处使用尖括号更好#include "itkMetaDataDictionary.h"#include "itkMetaDataObject.h"#include "vtkImageViewer2.h"#include "vtkImageFlip.h"#include <vtkAutoInit.h>VTK_MODULE_INIT(vtkRenderingOpenGL2);VTK_MODULE_INIT(vtkInteractionStyle);using namespace std;MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);}MainWindow::~MainWindow(){delete ui;}void MainWindow::on_OpenFile_triggered(){typedef signed short InputPixelType;const unsigned int InputDimension=2;typedef itk::Image<InputPixelType,InputDimension> ImageType;typedef itk::ImageFileReader<ImageType> ReaderType;ReaderType::Pointer reader = ReaderType::New();reader->SetFileName("F://1-248.dcm");typedef itk::GDCMImageIO ImageIOType;ImageIOType::Pointer gdcmImageIO = ImageIOType::New();reader->SetImageIO(gdcmImageIO);reader->Update();std::cout<<"read dicom sucess"<<std::endl;//头文件数据字典typedef itk::MetaDataDictionary DictionaryType;DictionaryType &dictionary= gdcmImageIO->GetMetaDataDictionary();typedef itk::MetaDataObject<std::string> MetaDataStringType;//管理字符串类型//从数据字典中可以获得几乎所有dicom标签对应的数值DictionaryType::ConstIterator itr=dictionary.Begin();DictionaryType::ConstIterator end=dictionary.End();while(itr!=end){itk::MetaDataObjectBase::Pointer entry=itr->second;MetaDataStringType::Pointer entryValue=dynamic_cast<MetaDataStringType *>(entry.GetPointer());//dynamic_cast将一个基类对象指针(或引用)cast到继承类指针 MetaDataStringType::Pointerif(entryValue){std::string tagKey=itr->first;std::string labelId;bool found=itk::GDCMImageIO::GetLabelFromTag(tagKey,labelId);std::string tagValue = entryValue->GetMetaDataObjectValue();if(found){std::cout<<"("<<tagKey<<")"<<labelId;std::cout<<"="<<tagValue.c_str()<<std::endl;}else{std::cout<<"("<<tagKey<<")"<<"unknown";std::cout<<"="<<tagValue.c_str()<<std::endl;}++itr;}}//获取医院的名称并在qt上显示。std::string tagKey="0008|103e";std::string value;gdcmImageIO->GetValueFromTag(tagKey,value);std::cout<<"value="<<value.c_str()<<std::endl;ui->hospital->setText(value.c_str());typedef itk::ImageToVTKImageFilter<ImageType> FilterType;FilterType::Pointer connector = FilterType::New();connector->SetInput(reader->GetOutput());connector->Update(); //vtk版本大于5必须加上这句话,否则显示不出图片vtkImageFlip *flip=vtkImageFlip::New();//由于vtk、itk显示图像时y轴相反,此处做一次翻转flip->SetInputData(connector->GetOutput());flip->SetFilteredAxis(1);flip->Update();vtkImageViewer2 *viewer = vtkImageViewer2::New();// vtkRenderWindowInteractor *interactor=vtkRenderWindowInteractor::New();viewer->SetInputData(flip->GetOutput());viewer->SetColorWindow(1224);viewer->SetColorLevel(587);viewer->SetRenderWindow(ui->qvtkwidget->GetRenderWindow());viewer->Render();}
新闻热点
疑难解答