[Insight-users] Re: ITK compiling (use from external project)

Luis Ibanez luis.ibanez at kitware.com
Thu Sep 2 19:37:03 EDT 2004


Hi Christian,

Thanks for sending your files.

After a couple of modifications they worked in Linux.
Please find attached the corrected versions.


In any case, looking at the internal code, it seems
that you are duplicating the functionality of the


    RescaleIntensityImageFiilter


http://www.itk.org/Insight/Doxygen/html/classitk_1_1RescaleIntensityImageFilter.html

Do you have any reason for not using the existing
RescaleIntensityImageFiilter  ?



Please let us know,


    Thanks



      Luis



----------------------
Christian Dold wrote:

> Hello
> I checked the .tpp .txx and the .h files for the #ifdef/#endif flags but
> everything looks ok.
> attached the files which are making trouble
> 
>        itkMapIntensityImageFilter.h
>        itkMapIntensityImageFilter.txx
> 
> Thanks a lot for figure out whats going on!
> Christian
> 
> Luis Ibanez wrote:
> 
> 
>>
>>Hi Christian,
>>
>>Thanks for sending your CMake information.
>>
>>
>>It seems that some of the classes in your application
>>are generating a recursive template instantiation and
>>bringing the VC++ compiler to its internal limit.
>>
>>
>>The current suspect is your class:
>>
>> \src\visualization\itkMapIntensityImageFilter.txx
>>
>>
>>That seems to be instantiating a ShiftScaleImageFilter
>>internally.
>>
>>
>>Are you setting the appropriate #ifdef/#endif flags in
>>the .h and the .txx files ?
>>
>>
>>Maybe it will be simpler if you just post to the users
>>list your files
>>
>>
>>       itkMapIntensityImageFilter.h
>>       itkMapIntensityImageFilter.txx
>>
>>
>>Thanks
>>
>>
>>
>>   Luis
>>
>>
>>-----------
>>PS. In general it is simpler to send the CMakeCache.txt file,
>>    than sending screenshots of CMake's GUI.
>>
>>
>>----------------------------------------------------------
>>Christian Dold wrote:
>>
>>
>>>Hi Luis
>>>yes I am using cmake.
>>>attacehd the cmake settings as png files
>>>
>>>I will be great to hear there is a solution for this problem
>>>Thanks
>>>Christian
>>>
>>>
>>>Luis Ibanez wrote:
>>>
>>>
>>>
>>>>Hi Christian,
>>>>
>>>>Are you using CMake for configuring your project ?
>>>>
>>>>       It looks like you are not...
>>>>
>>>>
>>>>
>>>>CMake usually takes care of setting all the compiler
>>>>flags necesary for using ITK.
>>>>
>>>>Please post the CMakeLists.txt that you are using
>>>>for configuring your project.
>>>>
>>>>
>>>> Thanks
>>>>
>>>>
>>>>   Luis
>>>>
>>>>
>>>>------------------------
>>>>Christian Dold wrote:
>>>>
>>>>
>>>>
>>>>>Hi Luis
>>>>>I got lots of problems since last week during compiling my project.
>>>>>For example:
>>>>>:\ITK\InsightToolkit-1.6.0\Code\BasicFilters\itkRecursiveGaussianImageFilter.h(67)
>>>>>
>>>>>
>>>>>: fatal error C1076: compiler limit : internal heap limit reached; use
>>>>>/Zm to specify a higher limit
>>>>>    
>>>>>D:\ITK\InsightToolkit-1.6.0\Code\BasicFilters\itkRecursiveGaussianImageFilter.h(67)
>>>>>
>>>>>
>>>>>: while compiling class-template member function 'double __thiscall
>>>>>itk::RecursiveGaussianImageFilter<class itk::Image<float,3>,class
>>>>>itk::Image<float,3> >::
>>>>>....
>>>>>C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\ostream(354) :
>>>>>fatal error C1076: compiler limit : internal heap limit reached;
>>>>>use /Zm
>>>>>to specify a higher limit
>>>>>mipregiongrowing.cpp
>>>>>D:\ITK\InsightToolkit-1.6.0\Code\Common\itkWeakPointer.h(110) : fatal
>>>>>error C1076: compiler limit : internal heap limit reached; use /Zm to
>>>>>specify a higher limit
>>>>>       .\src\visualization\itkMapIntensityImageFilter.txx(36) : see
>>>>>reference to class template instantiation 'itk::WeakPointer<class
>>>>>itk::ShiftScaleImageFilter<class itk::Image<float,3>,class
>>>>>itk::Image<unsigned short,3> > >' being compiled
>>>>>       C:\Program Files\Microsoft Visual
>>>>>Studio\VC98\INCLUDE\xmemory(66) : while compiling class-template
>>>>>member
>>>>>function '__thiscall itk::MapIntensityImageFilter<class
>>>>>itk::Image<float,3>,class itk::Image<unsigned short,3>
>>>>>
>>>>>>::itk::MapIntensityImag
>>>>>
>>>>>
>>>>>
>>>>>.....
>>>>>mipaccureader.cpp
>>>>>D:\ITK\InsightToolkit-1.6.0\Code\BasicFilters\itkAnisotropicDiffusionImageFilter.h(110)
>>>>>
>>>>>
>>>>>: fatal error C1076: compiler limit : internal heap limit reached; use
>>>>>/Zm to specify a higher limit
>>>>>    
>>>>>D:\ITK\InsightToolkit-1.6.0\Code\BasicFilters\itkAnisotropicDiffusionImageFilter.h(110)
>>>>>
>>>>>
>>>>>: while compiling class-template member function 'void __thiscall
>>>>>itk::AnisotropicDiffusionImageFilter<class itk::Image<float,3>,class
>>>>>itk::Image<float,3
>>>>>
>>>>>
>>>>>
>>>>>>>::SetConductanceScalingUpdateInterval(const unsigned int)'
>>>>>>
>>>>>>
>>>>>....
>>>>>I always got the same error, changing the zm parameter did not work.
>>>>>Using no Zm works not. I searched on the internet but nothing helpes.
>>>>>Compiling on other mashines produces the same error.
>>>>>
>>>>>I will be a pleasure to get some info what to do to remove this
>>>>>failure
>>>>>Thanks a lot
>>>>>Christian
>>>>>
>>>>
>>>>
>>>>
>>>>
>===========================================




-------------- next part --------------
/*=========================================================================

  Program:   Insight Segmentation & Registration Toolkit
  Module:    $RCSfile: itkMapIntensityImageFilter.h,v $
  Language:  C++
  Date:      $Date: 2004/05/04 10:58:00 $
  Version:   $Revision: 1.0 $

  Copyright (c) Insight Software Consortium. All rights reserved.
  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 notices for more information.

=========================================================================*/
#ifndef __itkMapIntensityImageFilter_h
#define __itkMapIntensityImageFilter_h

#include "itkImageToImageFilter.h"
#include "itkStatisticsImageFilter.h"
#include "itkShiftScaleImageFilter.h"

#include "itkEventObject.h"

namespace itk {

/** \class MapIntensityImageFilter 
 * \brief Applies a linear transformation to the intensity levels of the
 * input image according to the selected mapping mode.
 *
 * MapIntensityImageFilter applies pixel-wise a linear transformation
 * to the intensity values of input image pixels. The linear transformation
 * is defined by the user in terms of the minimum and maximum values that 
 * the output image should have, as well as the minimum and maximum values
 * of the input image.
 *
 * The input minimum and maximum values can either be computed from the input
 * image, or be specified explicitly by the user, according to the mapping
 * mode set with SetMappingMode(). The default mapping mode is MinMax.
 */
template<class TInputImage,class TOutputImage>
class ITK_EXPORT MapIntensityImageFilter : 
    public ImageToImageFilter<TInputImage, TOutputImage>
{
public:
  /** Standard Self typedef */
  typedef MapIntensityImageFilter Self;
  typedef ImageToImageFilter<TInputImage,TOutputImage>  Superclass;
  typedef SmartPointer<Self>        Pointer;
  typedef SmartPointer<const Self>  ConstPointer;
  
  /** Method for creation through the object factory. */
  itkNewMacro(Self);  

  /** Runtime information support. */
  itkTypeMacro(MapIntensityImageFilter, ImageToImageFilter);
  
  /** Image related typedefs. */
  typedef typename TInputImage::Pointer InputImagePointer;
  typedef typename TOutputImage::Pointer OutputImagePointer;

  typedef typename TOutputImage::PixelType OutputPixelType;
  typedef typename TInputImage::PixelType  InputPixelType;
  
  typedef enum { Range, MinMax } MappingMode;

  /** Set the mapping mode. */
  itkSetMacro(MappingMode, MappingMode);

  /** Get the mapping mode. */
  itkGetConstMacro(MappingMode, MappingMode);

  /**
   * Set mapping mode to Range; use-specified values for input minimum and
   * maximum will be used.
   */
  void SetMappingModeToRange()
  {
    this->SetMappingMode(Range);
  }

  /**
   * Set mapping mode to MinMax; the values for input minimum and maximum
   * will be computed from the input image.
   */
  void SetMappingModeToMinMax()
  {
    this->SetMappingMode(MinMax);
  }

  /** Set the minimum value of the output image */
  itkSetMacro(OutputMinimum, OutputPixelType);
  
  /** Get the minimum value of the output image */
  itkGetConstMacro(OutputMinimum, OutputPixelType);
  
  /** Set the maximum value of the output image */
  itkSetMacro(OutputMaximum, OutputPixelType);

  /** Get the maximum value of the output image */
  itkGetConstMacro(OutputMaximum, OutputPixelType);

  /** Set the minimum value of the input image */
  itkSetMacro(InputMinimum, InputPixelType);
  
  /** Get the minimum value of the input image */
  itkGetConstMacro(InputMinimum, InputPixelType);
  
  /** Set the maximum value of the input image */
  itkSetMacro(InputMaximum, InputPixelType);

  /** Get the maximum value of the input image */
  itkGetConstMacro(InputMaximum, InputPixelType);


protected:
  MapIntensityImageFilter();

  /** GenerateData. */
  void  GenerateData ();

  // Override since the filter needs all the data for the algorithm
  void GenerateInputRequestedRegion();

private:
  MapIntensityImageFilter(const Self&); //purposely not implemented
  void operator=(const Self&); //purposely not implemented

  typename StatisticsImageFilter<TInputImage>::Pointer m_StatisticsFilter;
  typename ShiftScaleImageFilter<TInputImage,TOutputImage>::Pointer m_ShiftScaleFilter;

  MappingMode m_MappingMode;

  InputPixelType m_InputMinimum;
  InputPixelType m_InputMaximum;

  InputPixelType m_ComputedInputMinimum;
  InputPixelType m_ComputedInputMaximum;

  OutputPixelType m_OutputMinimum;
  OutputPixelType m_OutputMaximum;

} ; // end of class

} // end namespace itk
  
//#ifndef ITK_MANUAL_INSTANTIATION
#include "itkMapIntensityImageFilter.txx"
//#endif

#endif

-------------- next part --------------
/*=========================================================================

  Program:   Insight Segmentation & Registration Toolkit
  Module:    $RCSfile: itkMapIntensityImageFilter.txx,v $
  Language:  C++
  Date:      $Date: 2004/05/04 10:58:00 $
  Version:   $Revision: 1.0 $

  Copyright (c) Insight Software Consortium. All rights reserved.
  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm 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 notices for more information.

=========================================================================*/
#ifndef _itkMapIntensityImageFilter_txx
#define _itkMapIntensityImageFilter_txx

#include "itkMapIntensityImageFilter.h"
#include "itkImageRegionIterator.h"
#include "itkStatisticsImageFilter.h"
#include "itkShiftScaleImageFilter.h"
#include "itkProgressAccumulator.h"
#include "itkCommand.h"

namespace itk
{

template <class TInputImage, class TOutputImage>
MapIntensityImageFilter<TInputImage, TOutputImage>
::MapIntensityImageFilter()
{
  m_StatisticsFilter = 0;
  m_StatisticsFilter = StatisticsImageFilter<TInputImage>::New();
  m_ShiftScaleFilter = ShiftScaleImageFilter<TInputImage,TOutputImage>::New();

  m_InputMinimum = NumericTraits<InputPixelType>::max();
  m_InputMaximum = NumericTraits<InputPixelType>::Zero;

  m_ComputedInputMinimum = NumericTraits<InputPixelType>::max();
  m_ComputedInputMaximum = NumericTraits<InputPixelType>::Zero;

  m_OutputMinimum = NumericTraits<OutputPixelType>::max();
  m_OutputMaximum = NumericTraits<OutputPixelType>::Zero;

  m_MappingMode = MinMax;

}

template <class TInputImage, class TOutputImage>
void
MapIntensityImageFilter<TInputImage, TOutputImage>
::GenerateInputRequestedRegion()
{
  Superclass::GenerateInputRequestedRegion();
  if ( this->GetInput() )
    {
    InputImagePointer image =
      const_cast< typename Superclass::InputImageType * >( this->GetInput() );
    image->SetRequestedRegionToLargestPossibleRegion();
    }
}

template <class TInputImage, class TOutputImage>
void 
MapIntensityImageFilter<TInputImage, TOutputImage>
::GenerateData()
{
  ProgressAccumulator::Pointer progress = ProgressAccumulator::New();
  progress->SetMiniPipelineFilter(this);

  progress->RegisterInternalFilter(m_StatisticsFilter,.5f);
  progress->RegisterInternalFilter(m_ShiftScaleFilter,.5f);

  if (m_MappingMode == MinMax)
  {

    // Gather statistics
    m_StatisticsFilter->SetInput(this->GetInput());
    m_StatisticsFilter->GetOutput()->SetRequestedRegion(this->GetOutput()->GetRequestedRegion());
    m_StatisticsFilter->Update();

    m_ComputedInputMinimum = static_cast<InputPixelType>( m_StatisticsFilter->GetMinimum() );
    m_ComputedInputMaximum = static_cast<InputPixelType>( m_StatisticsFilter->GetMaximum() );

    // Set the parameters for shift/scale
	// avoid division by zero...
	if (m_ComputedInputMinimum != m_ComputedInputMaximum)
	{
		m_ShiftScaleFilter->SetShift(
			(m_OutputMinimum * m_ComputedInputMaximum
				- m_OutputMaximum * m_ComputedInputMinimum)
			/ (m_OutputMaximum - m_OutputMinimum));
		m_ShiftScaleFilter->SetScale(
			(m_OutputMaximum - m_OutputMinimum)
			/ (m_ComputedInputMaximum - m_ComputedInputMinimum));
	}
	else
	{
		m_ShiftScaleFilter->SetShift(0.0);
		m_ShiftScaleFilter->SetScale(1.0);
	}
  }
  else //if (m_MappingMode == Range)
  {
    // Set the parameters for shift/scale
    m_ShiftScaleFilter->SetShift(
        (m_OutputMinimum * m_InputMaximum - m_OutputMaximum * m_InputMinimum)
        / (m_OutputMaximum - m_OutputMinimum));
    m_ShiftScaleFilter->SetScale(
        (m_OutputMaximum - m_OutputMinimum)
        / (m_InputMaximum - m_InputMinimum));
  }

  m_ShiftScaleFilter->SetInput(this->GetInput());
  
  m_ShiftScaleFilter->GetOutput()->SetRequestedRegion(this->GetOutput()->GetRequestedRegion());
  m_ShiftScaleFilter->Update();

  // Graft the mini pipeline output to this filters output
  this->GraftOutput(m_ShiftScaleFilter->GetOutput());
}

} // end namespace itk

#endif



More information about the Insight-users mailing list