GDCM: GetSubSequenceData.cxx

GDCM 3.2.8

GetSubSequenceData.cxx
/*=========================================================================
Program: GDCM (Grassroots DICOM). A DICOM library
Copyright (c) 2006-2011 Mathieu Malaterre
All rights reserved.
See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "gdcmReader.h"
#include "gdcmImage.h"
#include "gdcmImageWriter.h"
#include "gdcmDataElement.h"
#include "gdcmPrivateTag.h"
#include "gdcmUIDGenerator.h"
#include <iostream>
#include <sstream>
#include <string>
#include <map>
/*
* This example will extract the Movie from the private group of
* GEMS_Ultrasound_MovieGroup_001 See Attribute
* (7fe1,60,GEMS_Ultrasound_MovieGroup_001)
*
* The output file will be stored in `outvid.dcm` as
* MultiframeGrayscaleByteSecondaryCaptureImageStorage
*/
using namespace gdcm;
static bool processgroup(Item & item3, std::string const & outfilename)
{
// Item &item3 = sqi3->GetItem(1);
DataSet &subds3 = item3. GetNestedDataSet();
const PrivateTag tseq6(0x7fe1,0x26,"GEMS_Ultrasound_MovieGroup_001");
if( !subds3. FindDataElement( tseq6 ) ) return true;
const DataElement& seq6 = subds3. GetDataElement( tseq6 );
SmartPointer<SequenceOfItems> sqi6 = seq6. GetValueAsSQ();
size_t ni6= sqi6->GetNumberOfItems();
gdcm_assert( sqi6->GetNumberOfItems() >= 1 );
const PrivateTag tseq7(0x7fe1,0x86,"GEMS_Ultrasound_MovieGroup_001");
int dimx = 0, dimy = 0;
for( size_t i6 = 1; i6 <= ni6; ++i6 )
{
Item &item6 = sqi6->GetItem(i6);
DataSet &subds6 = item6.GetNestedDataSet();
if( subds6.FindDataElement( tseq7 ) )
{
Element<VR::SL, VM::VM4> el;
el. SetFromDataElement( subds6.GetDataElement( tseq7 ) );
dimx = el. GetValue(0);
dimy = el.GetValue(1);
std::cout << "Dims= " << dimx << " " << dimy << std::endl;
}
}
const PrivateTag tseq3(0x7fe1,0x36,"GEMS_Ultrasound_MovieGroup_001");
if( !subds3.FindDataElement( tseq3 ) ) return true;
const DataElement& seq3 = subds3.GetDataElement( tseq3 );
// std::cout << seq3 << std::endl;
SmartPointer<SequenceOfItems> sqi4 = seq3.GetValueAsSQ();
size_t ni4= sqi4->GetNumberOfItems();
gdcm_assert( sqi4->GetNumberOfItems() >= 1 );
const PrivateTag tseq8(0x7fe1,0x37,"GEMS_Ultrasound_MovieGroup_001");
const PrivateTag tseq4(0x7fe1,0x43,"GEMS_Ultrasound_MovieGroup_001");
const PrivateTag tseq5(0x7fe1,0x60,"GEMS_Ultrasound_MovieGroup_001");
std::vector<char> imbuffer;
int dimz = 0;
for( size_t i4 = 1; i4 <= ni4; ++i4 )
{
Item &item4 = sqi4->GetItem(i4);
DataSet &subds4 = item4.GetNestedDataSet();
if( !subds4.FindDataElement( tseq8 ) ) return true;
const DataElement& de8 = subds4.GetDataElement( tseq8 );
Element<VR::UL,VM::VM1> ldimz;
ldimz.SetFromDataElement( de8 );
std::cout << "ldimz: " << ldimz.GetValue() << std::endl;
dimz += ldimz.GetValue();
if( !subds4.FindDataElement( tseq4 ) ) return true;
const DataElement& seq4 = subds4.GetDataElement( tseq4 );
if( !subds4.FindDataElement( tseq5 ) ) return true;
const DataElement& seq5 = subds4.GetDataElement( tseq5 );
// std::cout << seq4 << std::endl;
// std::cout << seq5 << std::endl;
const ByteValue *bv4 = seq4. GetByteValue();
(void)bv4;
Element<VR::FD, VM::VM1_n> el0;
el0.SetFromDataElement( seq4 );
std::cout << "TimeStamp (" << el0. GetLength() << "): ";
// Seems like the 3D volumes is split into chunks of max 100 frames...
gdcm_assert( ldimz.GetValue() == el0.GetLength() );
for( unsigned long i = 0; i < el0.GetLength(); ++i ) {
if(i) std::cout << ",";
std::cout << el0.GetValue(i);
}
std::cout << std::endl;
#if 0
{
std::ofstream out( "/tmp/mo4", std::ios::binary );
out.write( bv4->GetPointer(), bv4->GetLength());
out.close();
}
#endif
const ByteValue *bv5 = seq5.GetByteValue();
#if 0
{
std::ofstream out( "/tmp/mo5", std::ios::binary );
out.write( bv5->GetPointer(), bv5->GetLength());
out.close();
}
#endif
std::cout << bv5->GetLength() << std::endl;
imbuffer.insert( imbuffer.begin(), bv5->GetPointer(), bv5->GetPointer() + bv5->GetLength() );
}
DataElement fakedata;
fakedata. SetByteValue( imbuffer.data(), (uint32_t)imbuffer.size() );
gdcm::SmartPointer<gdcm::Image> im = new gdcm::Image;
im->SetNumberOfDimensions( 3 );
im->SetDimension(0, dimx );
im->SetDimension(1, dimy );
im->SetDimension(2, dimz );
size_t l1 = imbuffer.size();
(void)l1;
size_t l2 = im->GetBufferLength();
(void)l2;
gdcm_assert( im->GetBufferLength() == imbuffer.size() );
im->SetPhotometricInterpretation( gdcm::PhotometricInterpretation::MONOCHROME2 );
im->SetDataElement( fakedata );
gdcm::ImageWriter w;
w. SetImage( *im );
DataSet &dataset = w. GetFile().GetDataSet();
gdcm::UIDGenerator uid;
gdcm::DataElement de( Tag(0x8,0x18) ); // SOP Instance UID
de. SetVR( VR::UI );
const char *u = uid. Generate();
de.SetByteValue( u, (uint32_t)strlen(u) );
//ds.Insert( de );
dataset. Replace( de );
de. SetTag( Tag(0x8,0x16) ); // SOP Class UID
de.SetVR( VR::UI );
gdcm::MediaStorage ms(
gdcm::MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage );
de.SetByteValue( ms. GetString(), (uint32_t)strlen(ms.GetString()));
dataset.Replace( de ); // replace !
w. SetFileName( outfilename.c_str() );
if( !w. Write() )
{
return false;
}
return true;
}
int main(int argc, char *argv[])
{
if( argc < 2 ) return 1;
const char *filename = argv[1];
gdcm::Reader reader;
reader. SetFileName( filename );
reader. Read();
gdcm::File &file = reader. GetFile();
gdcm::DataSet &ds = file.GetDataSet();
const PrivateTag tseq(0x7fe1,0x1,"GEMS_Ultrasound_MovieGroup_001");
if( !ds.FindDataElement( tseq ) ) return 1;
const DataElement& seq = ds.GetDataElement( tseq );
SmartPointer<SequenceOfItems> sqi = seq.GetValueAsSQ();
gdcm_assert( sqi->GetNumberOfItems() == 1 );
Item &item = sqi->GetItem(1);
DataSet &subds = item.GetNestedDataSet();
const PrivateTag tseq1(0x7fe1,0x10,"GEMS_Ultrasound_MovieGroup_001");
if( !subds.FindDataElement( tseq1 ) ) return 1;
const DataElement& seq1 = subds.GetDataElement( tseq1 );
SmartPointer<SequenceOfItems> sqi2 = seq1.GetValueAsSQ();
gdcm_assert( sqi2->GetNumberOfItems() == 1 );
//int n = sqi2->GetNumberOfItems();
int index = 1;
Item &item2 = sqi2->GetItem(index);
DataSet &subds2 = item2.GetNestedDataSet();
const PrivateTag tseq2(0x7fe1,0x20,"GEMS_Ultrasound_MovieGroup_001");
if( !subds2.FindDataElement( tseq2 ) ) return 1;
const DataElement& seq2 = subds2.GetDataElement( tseq2 );
// std::cout << seq2 << std::endl;
SmartPointer<SequenceOfItems> sqi3 = seq2.GetValueAsSQ();
size_t ni3 = sqi3->GetNumberOfItems(); (void)ni3;
gdcm_assert( sqi3->GetNumberOfItems() >= 1 );
std::cout << "#Groups = " << sqi3->GetNumberOfItems() << std::endl;
for( SequenceOfItems::SizeType i = 1; i <= sqi3->GetNumberOfItems(); ++i) {
Item &item3 = sqi3->GetItem(i);
std::ostringstream os;
os << "outvid";
os << i;
os << ".dcm";
processgroup(item3, os.str());
}
return 0;
}
gdcm::ByteValue
Class to represent binary value (array of bytes).
Definition gdcmByteValue.h:36
gdcm::ByteValue::GetPointer
const char * GetPointer() const
Definition gdcmByteValue.h:114
gdcm::ByteValue::GetLength
VL GetLength() const override
Definition gdcmByteValue.h:81
gdcm::DataElement
Class to represent a Data Element either Implicit or Explicit.
Definition gdcmDataElement.h:59
gdcm::DataElement::GetByteValue
const ByteValue * GetByteValue() const
Definition gdcmDataElement.h:133
gdcm::DataElement::SetTag
void SetTag(const Tag &t)
Definition gdcmDataElement.h:71
gdcm::DataElement::GetValueAsSQ
SmartPointer< SequenceOfItems > GetValueAsSQ() const
gdcm::DataElement::SetByteValue
void SetByteValue(const char *array, VL length)
Definition gdcmDataElement.h:126
gdcm::DataElement::SetVR
void SetVR(VR const &vr)
Definition gdcmDataElement.h:88
gdcm::DataSet
Class to represent a Data Set (which contains Data Elements).
Definition gdcmDataSet.h:56
gdcm::DataSet::GetDataElement
const DataElement & GetDataElement(const Tag &t) const
Definition gdcmDataSet.h:188
gdcm::DataSet::FindDataElement
bool FindDataElement(const PrivateTag &t) const
Look up if private tag 't' is present in the dataset:
gdcm::DataSet::Replace
void Replace(const DataElement &de)
Replace a dataelement with another one.
Definition gdcmDataSet.h:150
gdcm::Element
Element class.
Definition gdcmElement.h:70
gdcm::Element::GetLength
unsigned long GetLength() const
Definition gdcmElement.h:79
gdcm::Element::GetValue
const VRToType< TVR >::Type & GetValue(unsigned int idx=0) const
Definition gdcmElement.h:94
gdcm::Element::SetFromDataElement
void SetFromDataElement(DataElement const &de)
Definition gdcmElement.h:110
gdcm::File
a DICOM File
Definition gdcmFile.h:34
gdcm::File::GetDataSet
const DataSet & GetDataSet() const
Get Data Set.
Definition gdcmFile.h:57
gdcm::ImageWriter
ImageWriter.
Definition gdcmImageWriter.h:33
gdcm::ImageWriter::Write
bool Write() override
Write.
gdcm::Image
Image.
Definition gdcmImage.h:47
gdcm::Item
Class to represent an Item.
Definition gdcmItem.h:46
gdcm::Item::GetNestedDataSet
const DataSet & GetNestedDataSet() const
Definition gdcmItem.h:80
gdcm::MediaStorage
MediaStorage.
Definition gdcmMediaStorage.h:44
gdcm::MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
@ MultiframeGrayscaleByteSecondaryCaptureImageStorage
Definition gdcmMediaStorage.h:67
gdcm::MediaStorage::GetString
const char * GetString() const
Return the Media String of the object.
gdcm::PhotometricInterpretation::MONOCHROME2
@ MONOCHROME2
Definition gdcmPhotometricInterpretation.h:34
gdcm::PixmapWriter::SetImage
virtual void SetImage(Pixmap const &img)
gdcm::PrivateTag
Class to represent a Private DICOM Data Element (Attribute) Tag (Group, Element, Owner).
Definition gdcmPrivateTag.h:39
gdcm::Reader
Reader ala DOM (Document Object Model).
Definition gdcmReader.h:54
gdcm::Reader::GetFile
const File & GetFile() const
Set/Get File.
Definition gdcmReader.h:72
gdcm::Reader::Read
virtual bool Read()
Main function to read a file.
gdcm::Reader::SetFileName
void SetFileName(const char *filename_native)
gdcm::SequenceOfItems::SizeType
ItemVector::size_type SizeType
Definition gdcmSequenceOfItems.h:44
gdcm::SmartPointer
Class for Smart Pointer.
Definition gdcmSmartPointer.h:40
gdcm::Tag
Class to represent a DICOM Data Element (Attribute) Tag (Group, Element).
Definition gdcmTag.h:39
gdcm::UIDGenerator
Class for generating unique UID.
Definition gdcmUIDGenerator.h:28
gdcm::UIDGenerator::Generate
const char * Generate()
gdcm::VR::UI
@ UI
Definition gdcmVR.h:87
gdcm::Writer::GetFile
File & GetFile()
Definition gdcmWriter.h:67
gdcm::Writer::SetFileName
void SetFileName(const char *filename_native)
Set the filename of DICOM file to write:
gdcmDataElement.h
gdcm_assert
#define gdcm_assert(cond)
Definition gdcmException.h:104
gdcmImageWriter.h
gdcmImage.h
gdcmPrivateTag.h
gdcmReader.h
gdcmUIDGenerator.h
gdcm
Definition gdcmASN1.h:21