[ITK] PipelineMonitorImageFilter
David Froger
david.froger.ml at mailoo.org
Wed Jan 14 03:27:37 EST 2015
Hi,
I'm trying to use PipelineMonitorImageFilter to monitor the regions of an
image written to a file with streaming.
I've modified the file itkHDF5ImageIOStreamingReadWriteTest.cxx like this
(attached):
diff --git a/Modules/IO/HDF5/test/itkHDF5ImageIOStreamingReadWriteTest.cxx
b/Modules/IO/HDF5/test/itkHDF5ImageIOStreamingReadWriteTest.cxx
index b1f26b8..ab9072e 100644
--- a/Modules/IO/HDF5/test/itkHDF5ImageIOStreamingReadWriteTest.cxx
+++ b/Modules/IO/HDF5/test/itkHDF5ImageIOStreamingReadWriteTest.cxx
@@ -54,8 +54,13 @@ int HDF5ReadWriteTest2(const char *fileName)
}
typedef typename itk::ImageFileWriter<ImageType> WriterType;
typename WriterType::Pointer writer = WriterType::New();
+
+ typedef typename itk::PipelineMonitorImageFilter<ImageType> MonitorFilter;
+ typename MonitorFilter::Pointer writerMonitor = MonitorFilter::New();
+ writerMonitor->SetInput(im);
+
writer->SetFileName(fileName);
- writer->SetInput(im);
+ writer->SetInput(writerMonitor->GetOutput());
writer->SetNumberOfStreamDivisions(5);
try
{
@@ -76,7 +81,6 @@ int HDF5ReadWriteTest2(const char *fileName)
reader->SetFileName(fileName);
reader->SetUseStreaming(true);
- typedef typename itk::PipelineMonitorImageFilter<ImageType> MonitorFilter;
typename MonitorFilter::Pointer monitor = MonitorFilter::New();
monitor->SetInput(reader->GetOutput());
This change causes an "Exception: Numerical" later (line 106), when trying to
use "it" to iterate on "im".
I don't understand what's happening and what I did wrong. Is "im" deallocated by
"writerMonitor"?
Thanks,
David
-------------- next part --------------
/*=========================================================================
*
* Copyright Insight Software Consortium
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*=========================================================================*/
#include "itkHDF5ImageIOFactory.h"
#include "itkIOTestHelper.h"
#include "itkPipelineMonitorImageFilter.h"
#include "itkStreamingImageFilter.h"
template <typename TPixel>
int HDF5ReadWriteTest2(const char *fileName)
{
int success(EXIT_SUCCESS);
typedef typename itk::Image<TPixel,3> ImageType;
typename ImageType::RegionType imageRegion;
typename ImageType::SizeType size;
typename ImageType::IndexType index;
typename ImageType::SpacingType spacing;
typename ImageType::PointType origin;
typename ImageType::DirectionType myDirection;
for(unsigned i = 0; i < 3; i++)
{
size[i] = 5;
index[i] = 0;
spacing[i] = 1.0 / (static_cast<double>(i) + 1.0);
origin[i] = static_cast<double>(i) + 7.0;
}
imageRegion.SetSize(size);
imageRegion.SetIndex(index);
typename ImageType::Pointer im =
itk::IOTestHelper::AllocateImageFromRegionAndSpacing<ImageType>(imageRegion,spacing);
//
// fill image buffer
vnl_random randgen(12345678);
itk::ImageRegionIterator<ImageType> it(im,im->GetLargestPossibleRegion());
for(it.GoToBegin(); !it.IsAtEnd(); ++it)
{
TPixel pix;
itk::IOTestHelper::RandomPix(randgen,pix);
it.Set(pix);
}
typedef typename itk::ImageFileWriter<ImageType> WriterType;
typename WriterType::Pointer writer = WriterType::New();
typedef typename itk::PipelineMonitorImageFilter<ImageType> MonitorFilter;
typename MonitorFilter::Pointer writerMonitor = MonitorFilter::New();
writerMonitor->SetInput(im);
writer->SetFileName(fileName);
writer->SetInput(writerMonitor->GetOutput());
writer->SetNumberOfStreamDivisions(5);
try
{
writer->Write();
}
catch(itk::ExceptionObject &err)
{
std::cout << "itkHDF5ImageIOTest" << std::endl
<< "Exception Object caught: " << std::endl
<< err << std::endl;
return EXIT_FAILURE;
}
// force writer close
writer = typename WriterType::Pointer();
typedef typename itk::ImageFileReader<ImageType> ReaderType;
typename ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName(fileName);
reader->SetUseStreaming(true);
typename MonitorFilter::Pointer monitor = MonitorFilter::New();
monitor->SetInput(reader->GetOutput());
typedef typename itk::StreamingImageFilter<ImageType, ImageType> StreamingFilter;
typename StreamingFilter::Pointer streamer = StreamingFilter::New();
streamer->SetInput(monitor->GetOutput());
streamer->SetNumberOfStreamDivisions(5);
typename ImageType::Pointer im2;
try
{
streamer->Update();
}
catch(itk::ExceptionObject &err)
{
std::cout << "itkHDF5ImageIOTest" << std::endl
<< "Exception Object caught: " << std::endl
<< err << std::endl;
return EXIT_FAILURE;
}
im2 = streamer->GetOutput();
itk::ImageRegionIterator<ImageType> it2(im2,im2->GetLargestPossibleRegion());
for(it.GoToBegin(),it2.GoToBegin(); !it.IsAtEnd() && !it2.IsAtEnd(); ++it,++it2)
{
if(it.Value() != it2.Value())
{
std::cout << "Original Pixel (" << it.Value()
<< ") doesn't match read-in Pixel ("
<< it2.Value() << std::endl;
success = EXIT_FAILURE;
break;
}
}
itk::IOTestHelper::Remove(fileName);
return success;
}
int
itkHDF5ImageIOStreamingReadWriteTest(int ac, char * av [])
{
std::string prefix("");
if(ac > 1)
{
prefix = *++av;
--ac;
itksys::SystemTools::ChangeDirectory(prefix.c_str());
}
itk::ObjectFactoryBase::RegisterFactory(itk::HDF5ImageIOFactory::New() );
int result(0);
result += HDF5ReadWriteTest2<unsigned char>("StreamingUCharImage.hdf5");
result += HDF5ReadWriteTest2<float>("StreamingFloatImage.hdf5");
result += HDF5ReadWriteTest2<itk::RGBPixel<unsigned char> >("StreamingRGBImage.hdf5");
return result != 0;
}
More information about the Community
mailing list