From a991af4b3875b1c79672894b59f872254a6aa4ee Mon Sep 17 00:00:00 2001 From: Robert OSFIELD Date: Fri, 22 Aug 2008 16:39:17 +0000 Subject: [PATCH] Introduced initial cut of a dicom loader, which uses ITK to do the loading. --- CMakeLists.txt | 1 + src/osgDB/Registry.cpp | 3 + src/osgPlugins/CMakeLists.txt | 9 ++ src/osgPlugins/dicom/CMakeLists.txt | 14 ++ src/osgPlugins/dicom/ReaderWriterDICOM.cpp | 175 +++++++++++++++++++++ 5 files changed, 202 insertions(+) create mode 100644 src/osgPlugins/dicom/CMakeLists.txt create mode 100644 src/osgPlugins/dicom/ReaderWriterDICOM.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 822f28f3f71..f1480784dd5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -225,6 +225,7 @@ FIND_PACKAGE(Performer) FIND_PACKAGE(ZLIB) FIND_PACKAGE(GDAL) FIND_PACKAGE(CURL) +FIND_PACKAGE(ITK) SET(wxWidgets_USE_LIBS base core gl net) FIND_PACKAGE(wxWidgets) diff --git a/src/osgDB/Registry.cpp b/src/osgDB/Registry.cpp index 4f588f72be4..b3ead705348 100644 --- a/src/osgDB/Registry.cpp +++ b/src/osgDB/Registry.cpp @@ -211,6 +211,9 @@ Registry::Registry() addFileExtensionAlias("ivz", "gz"); addFileExtensionAlias("ozg", "gz"); + addFileExtensionAlias("dcm", "dicom"); + addFileExtensionAlias("dic", "dicom"); + #if defined(DARWIN_QUICKTIME) addFileExtensionAlias("jpg", "qt"); addFileExtensionAlias("jpe", "qt"); diff --git a/src/osgPlugins/CMakeLists.txt b/src/osgPlugins/CMakeLists.txt index 9796c94f63d..213bc2a67a2 100644 --- a/src/osgPlugins/CMakeLists.txt +++ b/src/osgPlugins/CMakeLists.txt @@ -100,6 +100,15 @@ IF(CURL_FOUND) ADD_SUBDIRECTORY(curl) ENDIF(CURL_FOUND) +############################################################ +# +# 3D Image plugins +# +IF(ITK_FOUND) + ADD_SUBDIRECTORY(dicom) +ENDIF(ITK_FOUND) + + ############################################################ # # 3rd party 3d plugins diff --git a/src/osgPlugins/dicom/CMakeLists.txt b/src/osgPlugins/dicom/CMakeLists.txt new file mode 100644 index 00000000000..cf92643bcf9 --- /dev/null +++ b/src/osgPlugins/dicom/CMakeLists.txt @@ -0,0 +1,14 @@ +INCLUDE(${ITK_USE_FILE}) + +INCLUDE_DIRECTORIES( ITK_INCLUDE_DIRS ) + +SET(TARGET_SRC ReaderWriterDICOM.cpp ) + +LINK_DIRECTORIES(${ITK_LIBRARY_DIRS}) + +# LINK_LIBRARIES(${ITK_LIBRARIES}) + +LINK_LIBRARIES(ITKCommon ITKIO) + +#### end var setup ### +SETUP_PLUGIN(dicom) diff --git a/src/osgPlugins/dicom/ReaderWriterDICOM.cpp b/src/osgPlugins/dicom/ReaderWriterDICOM.cpp new file mode 100644 index 00000000000..4822f82b5d5 --- /dev/null +++ b/src/osgPlugins/dicom/ReaderWriterDICOM.cpp @@ -0,0 +1,175 @@ +// Released under the OSGPL license, as part of the OpenSceneGraph distribution. +// +// ReaderWriter for sgi's .rgb format. +// specification can be found at http://local.wasp.uwa.edu.au/~pbourke/dataformats/sgirgb/sgiversion.html + +#include +#include + +#include + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include + +class ReaderWriterDICOM : public osgDB::ReaderWriter +{ + public: + + ReaderWriterDICOM() + { + supportsExtension("dic","dicom image format"); + supportsExtension("dcm","dicom image format"); + supportsExtension("dicom","dicom image format"); + supportsExtension("*","dicom image format"); + } + + template + T* readData(std::istream& fin, unsigned int length, unsigned int& numComponents) const + { + numComponents = length/sizeof(T); + T* data = new T[numComponents]; + fin.read((char*)data, numComponents*sizeof(T)); + + // read over any padding + length -= numComponents*sizeof(T); + while(fin && length>0) { fin.get(); --length; } + + return data; + } + + template + void printData(std::ostream& out, T* data, unsigned int numComponents) const + { + if (sizeof(T)==1) + { + for(unsigned int i=0; i32) out< ImageType; + + + typedef itk::ImageFileReader< ImageType > ReaderType; + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName( fileName.c_str() ); + + typedef itk::GDCMImageIO ImageIOType; + ImageIOType::Pointer gdcmImageIO = ImageIOType::New(); + reader->SetImageIO( gdcmImageIO ); + + try + { + reader->Update(); + } + catch (itk::ExceptionObject & e) + { + std::cerr << "exception in file reader " << std::endl; + std::cerr << e.GetDescription() << std::endl; + std::cerr << e.GetLocation() << std::endl; + return ReadResult::ERROR_IN_READING_FILE; + } + + ImageType::Pointer inputImage = reader->GetOutput(); + + ImageType::RegionType region = inputImage->GetBufferedRegion(); + ImageType::SizeType size = region.GetSize(); + ImageType::IndexType start = region.GetIndex(); + + //inputImage->GetSpacing(); + //inputImage->GetOrigin(); + + unsigned int width = size[0]; + unsigned int height = size[1]; + unsigned int depth = size[2]; + + osg::RefMatrix* matrix = new osg::RefMatrix; + + osg::notify(osg::NOTICE)<<"width = "<