[Insight-users] Re: image reader->Update() problem

Thomas Lambertz thomas at hexerei-software.de
Sun Jan 14 13:07:51 EST 2007


Hi,

i havent found the thread start - so please be patient if my answer does 
not fit.

Are the images to read in all of the same size ? If not i would suggest 
use of reader->UpdateLargestPossibleRegion();
instead of
reader->Update();.

Afaik, Update does only setup the OutputRequestedRegion only once. So if 
there is a change in size it would not be recognized.


Another simple checks:

- what happens when you read in the same file in the loop ?
    reader->SetFileName( fileNames[0] );
    instead of
    reader->SetFileName( fileNames[fni] );
   
- what happens when you move
    ReaderType::Pointer reader = ReaderType::New();
    at the beginning inside the loop ?
    reader is a smartpointer so that the object should be deleted at 
each loops end (leaving the scope where reader is declared in)


Greets,
Tom


Daniel Mace wrote:
> Ashish,
>
> The assertion errors tend to pop up (only/more often) with windows 
> machines for some reason, so they are odd bugs to track down.  I could 
> be wrong, but I'm not entirely sure that your image file has set its 
> region settings correctly.  Just to make sure, after the line
> -----------------
> InputImageType::Pointer image = reader->GetOutput();
> -----------------
>
> add in a
> -----------------
> image->Update()
> ----------------
>
> Just to make sure that the image->GetRequestedRegion() actually 
> returns a valid region.  I'm pretty sure that assigning it to an image 
> doesn't actually create the image regions until it is forced to 
> update.  Had this code been in a ImageToImageFilter the Update() would 
> be propagated down the line before the Regions and iterators were 
> called in the GenerateData() method.  I don't think that is happening 
> here.
>
> Cheers,
> Dan
>
> Ashish Singh wrote:
>> Hi Dan,
>>
>> I tried it with the 'for' loop that you suggested. I even tried it 
>> with different set of images. It behaves the same each time, i.e. the 
>> first run in the for loop goes fine, the second time, it crashes. So 
>> what I did was to comment each line below the reader->Update() one by 
>> one to find out if anything else is causing the error. And I found 
>> out that if I comment the writer1->Update() line down below in the 
>> for loop, it doesn't crash at reader->Update anymore and goes through 
>> the entire for loop. But then I don't want to comment the 
>> writer1->Update() line, because then I can't write the files.
>> Do you know how to fix it? Has anyone else faced this problem?
>>
>> Thanks,
>> Ashish
>>
>> On 1/11/07, *Daniel Mace* < dlm19 at duke.edu <mailto:dlm19 at duke.edu>> 
>> wrote:
>>
>>     Ashish,
>>
>>     It could be an issue with the reader reading in that particular 
>> file.
>>     Tracking down the particular location of the vector assertion
>>     error can
>>     be a bit painful as everything is caught by the ITK exception
>>     libraries
>>     and repropagated.  See what happens if you start you loop off with
>>     the
>>     second image.  Replace your for loop with the following and see 
>> if it
>>     gets through the first iteration.
>>
>>     ---------------------------
>>       for(fni = 1; fni<numberOfFilenames; fni++)
>>     ---------------------------
>>
>>     If it still dies on the second loop, then we can at least
>>     contribute it
>>     to the code you wrote and not an error with the reader reading in a
>>     particular tag/etc. for that particular image.
>>
>>     Cheers,
>>     Dan
>>
>>     Ashish Singh wrote:
>>     > Dan here's my complete code.It is crashing inside the loop
>>     second time
>>     > at the reader->Update().Can you or anyone please help me figure 
>> out
>>     > what's wrong  here?
>>     >
>>     > Thanks,
>>     > Ashish
>>     > ------------
>>     > #include " itkImageFileReader.h"
>>     > #include "itkImageFileWriter.h"
>>     > #include "itkRescaleIntensityImageFilter.h"
>>     > #include "itkGDCMImageIO.h"
>>     > #include "itkImageRegionConstIterator.h"
>>     > #include "itkImageRegionIterator.h"
>>     > #include "itkRegionOfInterestImageFilter.h"
>>     > #include "itkGDCMSeriesFileNames.h"
>>     > #include <list>
>>     > #include <fstream>
>>     > #include <vector>
>>     > #include <itksys/SystemTools.hxx>
>>     >
>>     > using namespace std;
>>     >  int main( int argc, char* argv[] )
>>     >  {
>>     >
>>     >   typedef signed short InputPixelType;
>>     >   const unsigned int   InputDimension = 2;
>>     >
>>     >   typedef itk::Image< InputPixelType, InputDimension >
>>     InputImageType;
>>     >   typedef itk::ImageFileReader< InputImageType > ReaderType;
>>     >
>>     >   typedef itk::GDCMImageIO           ImageIOType;
>>     >   ImageIOType::Pointer gdcmImageIO = ImageIOType::New();
>>     >
>>     >   ReaderType::Pointer reader = ReaderType::New();
>>     >
>>     >   typedef itk::GDCMSeriesFileNames NamesGeneratorType;
>>     >   NamesGeneratorType::Pointer nameGenerator =
>>     NamesGeneratorType::New();
>>     >   nameGenerator->SetInputDirectory( "D:\\testimages\\SRS00001"  );
>>     >
>>     >   typedef std::vector<std::string> FileNamesContainer;
>>     >   FileNamesContainer fileNames = 
>> nameGenerator->GetInputFileNames();
>>     >   unsigned int numberOfFilenames =  fileNames.size();
>>     >   std::cout << numberOfFilenames << std::endl;
>>     >   unsigned int fni;
>>     >   for(fni = 0; fni<numberOfFilenames; fni++)
>>     >   {
>>     >     std::cout << "filename # " << fni << " = ";
>>     >     std::cout << fileNames[fni] << std::endl;
>>     >   }
>>     >
>>     >  typedef itk::Image<InputPixelType, InputDimension> 
>> InputImageType;
>>     >  typedef itk::ImageRegionConstIterator< InputImageType >
>>     > ConstIteratorType;
>>     >  typedef itk::ImageRegionIterator< InputImageType > IteratorType;
>>     >  InputImageType::Pointer image2 = InputImageType::New();
>>     >  typedef itk::ImageFileWriter< InputImageType >  Writer1Type;
>>     >  Writer1Type::Pointer writer1 = Writer1Type::New();
>>     >
>>     >   for(fni = 0; fni<numberOfFilenames; fni++)
>>     >   {
>>     >       cout<<"inside for loop"<<" "<<"loop # "<<fni<<endl;
>>     >
>>     >       reader->SetFileName( fileNames[fni] );
>>     >       reader->SetImageIO( gdcmImageIO );
>>     >       try
>>     >         {
>>     >             reader->Update();
>>     >         }
>>     >       catch (itk::ExceptionObject & e)
>>     >         {
>>     >             std::cerr << "exception in file reader " << std::endl;
>>     >             std::cerr << e << std::endl;
>>     >             return EXIT_FAILURE;
>>     >         }
>>     >
>>     >      InputImageType::Pointer image = reader->GetOutput();
>>     >      image2->SetRegions(image->GetRequestedRegion());
>>     >      image2->CopyInformation(image);
>>     >      image2->Allocate();
>>     >
>>     >      ConstIteratorType in1( image, image->GetRequestedRegion() );
>>     >
>>     >      IteratorType out( image2, image->GetRequestedRegion() );
>>     >
>>     >      for (in1.GoToBegin(),out.GoToBegin
>>     ();!in1.IsAtEnd();++in1,++out)
>>     > //copy original image to new image
>>     >      {
>>     >         out.Set(in1.Get());
>>     >      }
>>     >
>>     >       if(fni==0)
>>     >         writer1->SetFileName("D:\\testimages\\SRS\\IM1.dcm" );
>>     >       if(fni==1)
>>     >           writer1->SetFileName("D:\\testimages\\SRS\\IM2.dcm" );
>>     >       writer1->SetInput( image2 );
>>     >       writer1->SetImageIO(gdcmImageIO);
>>     >
>>     >       try
>>     >         {
>>     >             writer1->Update();
>>     >         }
>>     >       catch (itk::ExceptionObject & e)
>>     >         {
>>     >             std::cerr << "exception in file writer " << std::endl;
>>     >             std::cerr << e << std::endl;
>>     >             return EXIT_FAILURE;
>>     >         }
>>     >   }//for loop end
>>     >     return EXIT_SUCCESS;
>>     >
>>     >  }
>>     > --------------
>>     >
>>     > On 1/11/07, *Ashish Singh* <mrasingh at gmail.com
>>     <mailto:mrasingh at gmail.com>
>>     > <mailto:mrasingh at gmail.com <mailto:mrasingh at gmail.com>>> wrote:
>>     >
>>     >     Thanks Dan. I tried this. It still doesn't work.Now I get an
>>     >     unhandled exception at 0x00406515 in my exe file.
>>     >
>>     >
>>     >     On 1/11/07, *Daniel Mace* < dlm19 at duke.edu
>>     <mailto:dlm19 at duke.edu>
>>     >     <mailto: dlm19 at duke.edu <mailto:dlm19 at duke.edu>>> wrote:
>>     >
>>     >         Ashish,
>>     >
>>     >         I think I ran into the same problem a while ago.  I 
>> ended up
>>     >         replacing
>>     >         the code with the following
>>     >         -----------------------------------------
>>     >         const vector<string> &fileNames
>>     >         =  nameGenerator->GetInputFileNames();
>>     >         -----------------------------------------
>>     >
>>     >         and then set the file names by calling
>>     >
>>     >         ---------------------------------------------
>>     >         reader->SetFileName( fileNames[i].c_str());
>>     >         ---------------------------------------------
>>     >
>>     >         More of a quick fix for me (as I was returning to C++
>>     after an
>>     >         8 year
>>     >         hiatus), and I'm sure there is something more
>>     efficient.  Try
>>     >         making
>>     >         that change and let me know if it works.
>>     >
>>     >         Cheers,
>>     >         Dan
>>     >
>>     >         Ashish Singh wrote:
>>     >         > Thanks for replying Dan. Yes that's what it is,
>>     >         > reader->SetFileName(fileNames[fni]).
>>     >         > The fname was a typo in my previous message,sorry for
>>     that.
>>     >         It doesn't
>>     >         > work with
>>     >         > reader->SetFileName(fileNames[fni])
>>     >         >
>>     >         > The exact error message is a pop up box, titled Microsft
>>     >         Visual C++
>>     >         > debug Library. It reads-
>>     >         > ---------
>>     >         > Debug Assertion Failed!
>>     >         > Program:...
>>     >         > File: C:\program Files(x86)\Microsft Visual Studio
>>     >         8\VC\include\vector
>>     >         > Line: 756
>>     >         >
>>     >         > Expression: vector subscript out of range
>>     >         >
>>     >         > For information on how your program can cause assertion
>>     >         failure, see
>>     >         > the Visual C++ documentation on asserts.
>>     >         >
>>     >         > abort-retry-ignore
>>     >         > --------
>>     >         >
>>     >         > Do you know what is going wrong here?
>>     >         >
>>     >         > Thanks,
>>     >         > Ashish
>>     >         >
>>     >         > On 1/11/07, *Daniel Mace* < dlm19 at duke.edu
>>     <mailto:dlm19 at duke.edu>
>>     >         <mailto:dlm19 at duke.edu <mailto:dlm19 at duke.edu>> <mailto:
>>     dlm19 at duke.edu <mailto:dlm19 at duke.edu>
>>     >         <mailto: dlm19 at duke.edu <mailto:dlm19 at duke.edu>>>> wrote:
>>     >         >
>>     >         >     Ashish,
>>     >         >
>>     >         >     What's the exact error message that it gives
>>     you?  Also,
>>     >         where do you
>>     >         >     set "fname".  perhaps it should be:
>>     >         >     -----------
>>     >         >     reader->SetFileName(fileNames[fni])
>>     >         >     --------
>>     >         >     unless you set fname somewhere else in the code that
>>     >         isn't present.
>>     >         >
>>     >         >     Cheers,
>>     >         >     Dan
>>     >         >
>>     >         >     Ashish Singh wrote:
>>     >         >     > Hi,
>>     >         >     >
>>     >         >     > I am a newbie to ITK. I was trying to read a 
>> set of
>>     >         dicom images
>>     >         >     from
>>     >         >     > a directory and then use reader->update() to 
>> process
>>     >         each one of
>>     >         >     them
>>     >         >     > one after the other. But the reader->update()
>>     gives me
>>     >         an error
>>     >         >     after
>>     >         >     > reading the first image. Can anyone please tell
>>     me how
>>     >         to fix this
>>     >         >     > problem?
>>     >         >     >
>>     >         >     > This is what my code looks like. It is not the
>>     complete
>>     >         code,
>>     >         >     but only
>>     >         >     > the relevant part of it.
>>     >         >     > ---------------
>>     >         >     >   typedef itk::GDCMSeriesFileNames
>>     NamesGeneratorType;
>>     >         >     >   NamesGeneratorType::Pointer nameGenerator =
>>     >         >     NamesGeneratorType::New();
>>     >         >     >   nameGenerator->SetInputDirectory(
>>     "D:\\testimages"  );
>>     >         >     >
>>     >         >     >   typedef std::vector<std::string>
>>     FileNamesContainer;
>>     >         >     >   FileNamesContainer fileNames =
>>     >         nameGenerator->GetInputFileNames();
>>     >         >     >     unsigned int numberOfFilenames
>>     =  fileNames.size();
>>     >         >     >   std::cout << numberOfFilenames << std::endl;
>>     >         >     >   unsigned int fni;
>>     >         >     >
>>     >         >     >   for(fni = 0; fni<numberOfFilenames; fni++)
>>     >         >     >     {
>>     >         >     >     std::cout << "filename # " << fni << " = ";
>>     >         >     >     std::cout << fileNames[fni] << std::endl;
>>     >         >     >     }
>>     >         >     >
>>     >         >     >   for(fni = 0; fni<numberOfFilenames; fni++)
>>     >         >     >   {
>>     >         >     >   reader->SetFileName( fname);
>>     >         >     >
>>     >         >     >   reader->SetImageIO( gdcmImageIO );
>>     >         >     >
>>     >         >     >   try
>>     >         >     >     {
>>     >         >     >         reader->Update();//this is where it
>>     gives me an
>>     >         error second
>>     >         >     > time in the loop.
>>     >         >     >     }
>>     >         >     >   catch (itk::ExceptionObject & e)
>>     >         >     >     {
>>     >         >     >     std::cerr << "exception in file reader " <<
>>     std::endl;
>>     >         >     >     std::cerr << e << std::endl;
>>     >         >     >     return EXIT_FAILURE;
>>     >         >     >     }
>>     >         >     > // code for processing the image //
>>     >         >     > //code for writing the processed image//
>>     >         >     > }// for loop complete
>>     >         >     > --------------------------------------
>>     >         >     > The filenames are correctly read, the code runs
>>     fine
>>     >         the first time
>>     >         >     > through the for loop, but second time it gives
>>     an error
>>     >         at the
>>     >         >     > reader->Update() line.
>>     >         >     > Can anyone please tell me why is this happening
>>     and how
>>     >         to fix it?
>>     >         >     >
>>     >         >     > Thanks,
>>     >         >     > Ashish
>>     >         >     >
>>     >         >     >
>>     >         >     >
>>     >         >
>>     >            
>> ------------------------------------------------------------------------
>>     >         >
>>     >         >     >
>>     >         >     > _______________________________________________
>>     >         >     > Insight-users mailing list
>>     >         >     > Insight-users at itk.org
>>     <mailto:Insight-users at itk.org> <mailto:Insight-users at itk.org
>>     <mailto:Insight-users at itk.org>>
>>     >         <mailto: Insight-users at itk.org
>>     <mailto:Insight-users at itk.org> <mailto:Insight-users at itk.org
>>     <mailto:Insight-users at itk.org>>>
>>     >         >     > http://www.itk.org/mailman/listinfo/insight-users
>>     >         >     >
>>     >         >
>>     >         >
>>     >
>>     >
>>     >
>>
>>
>
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
>



More information about the Insight-users mailing list