<div dir="ltr">I have a test program modified from an example I found online. It reads a 4-d image and extract the z-stack from each time step and save it as a .ome.tiff.<div><br></div><div>The program works fine on Mac, but on Windows it hangs at <span style="color:rgb(0,0,0);white-space:pre-wrap">itksysProcess_WaitForData() in itkSCIFIOImageIO.cxx.</span></div>
<div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div style><span style="color:rgb(0,0,0);white-space:pre-wrap">I use the SCIFIO from ITK by enabling fetch_SCIFIO.</span></div><div style><span style="color:rgb(0,0,0);white-space:pre-wrap"><br>
</span></div><div style><span style="color:rgb(0,0,0);white-space:pre-wrap">Here is the the code:</span></div><div style><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div style><font color="#000000"><span style="white-space:pre-wrap">#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
#include <iostream>
#include <fstream>
#include "itkSCIFIOImageIO.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkImage.h"
#include "itkRGBPixel.h"
#include "itkMetaDataObject.h"
#include "itkExtractImageFilter.h"
#include <itkImageIORegion.h>
#if defined(ITK_USE_MODULAR_BUILD)
#define SPECIFIC_IMAGEIO_MODULE_TEST
#endif
int main( int argc, char * argv [] )
{
if( argc < 2)
{
std::cerr << "Usage: " << argv[0] << " input";
return EXIT_FAILURE;
}
typedef unsigned short PixelType;
const unsigned int Dimension = 4;
typedef itk::Image< PixelType, Dimension > ImageType;
typedef itk::ImageFileReader<ImageType> ReaderType;
typedef itk::ImageIORegion ImageIORegionType;
typedef itk::ImageFileWriter<ImageType> WriterType;
typedef itk::ExtractImageFilter<ImageType, ImageType> ExtractImageFilter;
// This ImageIO won't actually be used, it's just a reference to remember how many
// T-slices there are, as the extracted ImageIO will be truncated.
itk::SCIFIOImageIO::Pointer io = itk::SCIFIOImageIO::New();
io->DebugOn();
std::string inputFilename = argv[1];
std::cout << argv[1] << std::endl;
std::cout << "before setfilename" << std::endl;
io->SetFileName(argv[1]);
std::cout << "after setfilename" << std::endl;
io->ReadImageInformation();
std::cout << "after readImageInformation" << std::endl;
unsigned int numberOfDim = io->GetNumberOfDimensions();
// Similarly this region will be reused to ensure when we know how big the image is when
// we try to extract a single T-slice
ImageIORegionType region(4);
for( unsigned long i = 0; i < numberOfDim; i++ )
{
std::cout << "Setting index: " << i << " to: " << io->GetDimensions(i) << std::endl;
region.SetIndex( i, 0 );
region.SetSize( i, io->GetDimensions(i) );
}
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName(argv[1]);
reader->UseStreamingOn();
WriterType::Pointer writer = WriterType::New();
for( unsigned int i = 0; i < region.GetSize( numberOfDim-1 ); i++ )
{
std::cout << i << std::endl;
// When I was persisting these objects between iterations I ran into
// I ran into errors based on remembering the wrong region sizes
itk::SCIFIOImageIO::Pointer imageIO = itk::SCIFIOImageIO::New();
ExtractImageFilter::Pointer extractor = ExtractImageFilter::New();
imageIO->DebugOn();
imageIO->SetFileName(argv[1]);
imageIO->SetUseStreamedReading(true);
imageIO->SetUseStreamedWriting(true);
// reset to the largest possible region, so that the extraction region is contained
imageIO->SetIORegion( region );
imageIO->ReadImageInformation();
reader->SetImageIO(imageIO);
std::cout << "ImageIO Region: " << imageIO << std::endl;
ImageType::IndexType start;
ImageType::SizeType size;
for( unsigned int j = 0; j < numberOfDim; j++ )
{
start[j] = 0;
size[j] = io->GetDimensions(j);
}
start[ numberOfDim-1 ] = i;
//size[ numberOfDim-2 ] = 1;
size[ numberOfDim-1 ] = 1;
ImageType::RegionType desiredRegion;
desiredRegion.SetSize(size);
desiredRegion.SetIndex(start);
extractor->SetExtractionRegion(desiredRegion);
std::cout << "Region of extraction: " << extractor->GetExtractionRegion() << std::endl;
std::cout << "Largest possible reader region, pre-update: " << reader->GetImageIO()->GetIORegion() << std::endl;
extractor->SetInput(reader->GetOutput());
extractor->Update();
std::cout << "Largest possible reader region, post-update: " << reader->GetImageIO()->GetIORegion() << std::endl;
std::ostringstream istream;
istream << i << ".ome.tiff";
std::string fname = istream.str();
writer->SetFileName( fname.c_str() );
writer->SetImageIO(imageIO);
writer->SetInput(extractor->GetOutput());
try
{
writer->Update();
}
catch (itk::ExceptionObject &e)
{
std::cerr << e << std::endl;
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}</span></font><br></div><div style><font color="#000000"><span style="white-space:pre-wrap"><br></span></font></div><div style><font color="#000000"><span style="white-space:pre-wrap">Best,</span></font></div><div style>
<font color="#000000"><span style="white-space:pre-wrap">Joe</span></font></div></div>