Merge branch 'dicomNet' into 'master'
Basic Functionality - UI, DCMDB, DCMNet See merge request cpt_bioeng/drt!11
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
cmake_minimum_required(VERSION 2.8.8)
|
||||
cmake_minimum_required(VERSION 2.8.12)
|
||||
|
||||
SET(LIB_NAME itkDTRrecon)
|
||||
|
||||
@ -10,7 +10,6 @@ find_package(VTK REQUIRED)
|
||||
INCLUDE_DIRECTORIES(${VTK_INCLUDE_DIRS})
|
||||
|
||||
FIND_PACKAGE(GDCM REQUIRED)
|
||||
include(${GDCM_USE_FILE})
|
||||
INCLUDE_DIRECTORIES(${GDCM_INCLUDE_DIRS})
|
||||
|
||||
SET(SRCS
|
||||
@ -34,7 +33,7 @@ SET(LINK_LIBS
|
||||
${LIB_NAME}
|
||||
${VTK_LIBRARIES}
|
||||
${ITK_LIBRARIES}
|
||||
${GDCM_LIBRARIES}
|
||||
gdcmMSFF
|
||||
)
|
||||
|
||||
TARGET_LINK_LIBRARIES(
|
||||
@ -45,3 +44,7 @@ TARGET_LINK_LIBRARIES(
|
||||
target_include_directories (${LIB_NAME}
|
||||
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
)
|
||||
|
||||
|
||||
set(EXTRA_LIBS ${EXTRA_LIBS} itkDTRrecon)
|
||||
set(EXTRA_LIBS ${EXTRA_LIBS} PARENT_SCOPE)
|
||||
|
@ -22,6 +22,7 @@ gfattori 08.11.2021
|
||||
#include "itkMatrix.h"
|
||||
#include "itkGDCMSeriesFileNames.h"
|
||||
#include "itkOrientImageFilter.h"
|
||||
#include <gdcmIPPSorter.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
@ -369,8 +370,108 @@ void itkImageProcessor::SetCustom_2Dsize(int nX1, int nY1,int nX2,int nY2)
|
||||
//TODO UPDATE TO FOLLOW
|
||||
}
|
||||
|
||||
int itkImageProcessor::load3DSerieFromFiles( std::vector<std::string> v_fnames){
|
||||
|
||||
int itkImageProcessor::load3DSerie(const char * pcDirName)
|
||||
tPatOrientation m_PatOrientation
|
||||
= tPatOrientation::NotDefined;
|
||||
|
||||
/* Since are not sure DB indexer to sort images,
|
||||
* we run the IPP sorter here. */
|
||||
using IppSorterType = gdcm::IPPSorter;
|
||||
IppSorterType ZSorter;
|
||||
|
||||
ZSorter.SetComputeZSpacing( true );
|
||||
ZSorter.SetZSpacingTolerance( 1e-3 );
|
||||
bool b = ZSorter.Sort(v_fnames);
|
||||
if( !b )
|
||||
{
|
||||
std::cerr << "itkImageProcessor::load3DSerieFromFiles :: Failed to sort files based on IPP." << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* Some debugging output */
|
||||
//std::cout << "Sorting succeeded:" << std::endl;
|
||||
//ZSorter.Print( std::cout );
|
||||
//std::cout << "Found z-spacing:" << std::endl;
|
||||
//std::cout << ZSorter.GetZSpacing() << std::endl;
|
||||
|
||||
const std::vector<std::string> & v_sortedFnames =
|
||||
ZSorter.GetFilenames();
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
using ImageIOType = itk::GDCMImageIO;
|
||||
ImageIOType::Pointer dicomIO = ImageIOType::New();
|
||||
|
||||
ImageSeriesReaderType3D::Pointer
|
||||
imageSeriesReader3D = ImageSeriesReaderType3D::New();
|
||||
|
||||
imageSeriesReader3D->SetImageIO(dicomIO);
|
||||
imageSeriesReader3D->SetFileNames(v_sortedFnames);
|
||||
//imageSeriesReader3D->SetNumberOfWorkUnits(8);
|
||||
imageSeriesReader3D->ForceOrthogonalDirectionOff(); // properly read CTs with gantry tilt
|
||||
//imageSeriesReader3D->SetSpacingWarningRelThreshold();
|
||||
|
||||
imageSeriesReader3D->Update();
|
||||
|
||||
if(v_fnames.size()>0){
|
||||
|
||||
gdcm::Reader R;
|
||||
R.SetFileName(v_sortedFnames.at(0).c_str());
|
||||
if(!R.Read())
|
||||
{
|
||||
cerr<<"ERROR: cannot read file: "<<v_sortedFnames.at(0).c_str()<<endl;
|
||||
return -1;
|
||||
}
|
||||
const gdcm::File &file = R.GetFile();
|
||||
const gdcm::DataSet &ds = file.GetDataSet();
|
||||
|
||||
char* sTmpString = new char [255];
|
||||
strcpy( sTmpString,gGetStringValueFromTag( gdcm::Tag(0x0018,0x5100), ds));
|
||||
*std::remove(sTmpString, sTmpString + strlen(sTmpString), ' ') = 0;
|
||||
|
||||
if(!strcmp(sTmpString,ImageOrientationStrings[eImageOrientationType::HFS])){
|
||||
m_PatOrientation = eImageOrientationType::HFS;
|
||||
} else if(!strcmp(sTmpString,ImageOrientationStrings[eImageOrientationType::FFS])){
|
||||
m_PatOrientation = eImageOrientationType::FFS;
|
||||
} else {
|
||||
m_PatOrientation = eImageOrientationType::NotDefined;
|
||||
}
|
||||
|
||||
delete [] (sTmpString);
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
CastFilterType3D::Pointer caster3D =
|
||||
CastFilterType3D::New();
|
||||
|
||||
caster3D->SetInput(imageSeriesReader3D->GetOutput());
|
||||
caster3D->Update();
|
||||
|
||||
m_VolumeSourceDupli->SetInputImage(caster3D->GetOutput());
|
||||
m_VolumeSourceDupli->Update();
|
||||
|
||||
caster3D = NULL;
|
||||
|
||||
|
||||
}
|
||||
catch (itk::ExceptionObject & ex)
|
||||
{
|
||||
std::cout << ex << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
InternalImageType::Pointer m_InputImage =
|
||||
m_VolumeSourceDupli->GetOutput();
|
||||
return
|
||||
this->fill3DVolumeMeta(m_InputImage, m_PatOrientation);
|
||||
|
||||
}
|
||||
|
||||
int itkImageProcessor::load3DSerieFromFolder(const char * pcDirName)
|
||||
{
|
||||
|
||||
using NamesGeneratorType = itk::GDCMSeriesFileNames;
|
||||
@ -402,7 +503,7 @@ int itkImageProcessor::load3DSerie(const char * pcDirName)
|
||||
else
|
||||
{
|
||||
std::cout << "No DICOMs in: " << pcDirName << std::endl;
|
||||
return EXIT_SUCCESS;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
while (seriesItr != seriesEnd)
|
||||
@ -467,7 +568,7 @@ int itkImageProcessor::load3DSerie(const char * pcDirName)
|
||||
m_PatOrientation = eImageOrientationType::NotDefined;
|
||||
}
|
||||
|
||||
free (sTmpString);
|
||||
delete [] (sTmpString);
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
@ -493,9 +594,17 @@ int itkImageProcessor::load3DSerie(const char * pcDirName)
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
InternalImageType::Pointer m_InputImage =
|
||||
m_VolumeSourceDupli->GetOutput();
|
||||
return
|
||||
this->fill3DVolumeMeta(m_InputImage, m_PatOrientation);
|
||||
|
||||
}
|
||||
|
||||
/** Fill Meta after 3D volume load */
|
||||
int itkImageProcessor::fill3DVolumeMeta(
|
||||
InternalImageType::Pointer m_InputImage,
|
||||
tPatOrientation m_PatOrientation){
|
||||
|
||||
|
||||
if(m_CTMetaInfo != NULL){
|
||||
@ -597,9 +706,9 @@ int itkImageProcessor::load3DSerie(const char * pcDirName)
|
||||
image3DIn =
|
||||
m_3DInputChangeInformationToZero->GetOutput();
|
||||
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
|
||||
|
||||
}
|
||||
|
||||
const std::vector <double> itkImageProcessor::GetRTImportOffset()
|
||||
|
@ -72,7 +72,9 @@ public:
|
||||
itkTypeMacro(itkImageProcessor, Object);
|
||||
|
||||
/** Input data load methods*/
|
||||
int load3DSerie(const char* );
|
||||
int load3DSerieFromFolder(const char* );
|
||||
int load3DSerieFromFiles( std::vector<std::string> );
|
||||
|
||||
int load2D(const char *);
|
||||
|
||||
void loadRTPlanInfo(double, double, double, double, double ,double);
|
||||
@ -167,6 +169,9 @@ private:
|
||||
itkImageProcessor(const Self&); //purposely not implemented
|
||||
void operator=(const Self&); //purposely not implemented
|
||||
|
||||
/** Fill Meta after 3D volume load */
|
||||
int fill3DVolumeMeta(InternalImageType::Pointer,
|
||||
tPatOrientation);
|
||||
|
||||
/** Image types */
|
||||
using ImageType2D = itk::Image<PixelType3D, Dimension>;
|
||||
|
@ -148,6 +148,8 @@ int vtkContourTopogramProjectionFilter::RequestData(
|
||||
pp2[1] -= dProjectionLPSOffset [1];
|
||||
pp2[2] -= dProjectionLPSOffset [2];
|
||||
|
||||
// std::cout << ii << " " << pp2[0] << " " << pp2[1] << " " << pp2[2] << std::endl;
|
||||
|
||||
PrjPoints->InsertPoint(ii,pp2);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user