#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();}
新聞熱點
疑難解答