Skip to content
Snippets Groups Projects
Forked from Main Repositories / otb
21962 commits behind the upstream repository.
otbWrapperInputImageParameter.cxx 12.58 KiB
/*=========================================================================

  Program:   ORFEO Toolbox
  Language:  C++
  Date:      $Date$
  Version:   $Revision$


  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
  See OTBCopyright.txt 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.

=========================================================================*/
#include "otbWrapperInputImageParameter.h"
#include "itksys/SystemTools.hxx"
#include "otbImageFileReader.h"
#include "itkCastImageFilter.h"
#include "otbImageToVectorImageCastFilter.h"
#include "otbWrapperTypes.h"

namespace otb
{
namespace Wrapper
{

InputImageParameter::InputImageParameter()
{
  this->SetName("Input Image");
  this->SetKey("in");
  m_FileName="";
  this->ClearValue();
}

InputImageParameter::~InputImageParameter()
{
}

void
InputImageParameter::SetFromFileName(const std::string& filename)
{
  // First clear previous file choosen
  this->ClearValue();

  // TODO : when the logger will be available, redirect the exception
  // in the logger (like what is done in MsgReporter)
  if (!filename.empty()
      && itksys::SystemTools::FileExists(filename.c_str()))
    {
    FloatVectorReaderType::Pointer reader = FloatVectorReaderType::New();
    reader->SetFileName(filename);
    try
      {
      reader->UpdateOutputInformation();
      }
    catch(itk::ExceptionObject & err)
      {
      }

    // the specified filename is valid => store the value
    m_FileName = filename;
    SetActive(true);
    }
}


FloatVectorImageType*
InputImageParameter::GetImage()
{
  return this->GetImage<FloatVectorImageType>();
}


#define otbGetImageMacro(image)                       \
  image##Type *                                       \
  InputImageParameter::Get##image ()                  \
  {                                                   \
    return this->GetImage< image##Type > ();          \
  }

otbGetImageMacro(UInt8Image)
otbGetImageMacro(Int8Image);
otbGetImageMacro(UInt16Image);
otbGetImageMacro(Int16Image);
otbGetImageMacro(UInt32Image);
otbGetImageMacro(Int32Image);
otbGetImageMacro(FloatImage);
otbGetImageMacro(DoubleImage);

otbGetImageMacro(UInt8VectorImage);
otbGetImageMacro(Int8VectorImage);
otbGetImageMacro(UInt16VectorImage);
otbGetImageMacro(Int16VectorImage);
otbGetImageMacro(UInt32VectorImage);
otbGetImageMacro(Int32VectorImage);
otbGetImageMacro(FloatVectorImage);
otbGetImageMacro(DoubleVectorImage);

otbGetImageMacro(UInt8RGBAImage);
otbGetImageMacro(Int8RGBAImage);
otbGetImageMacro(UInt16RGBAImage);
otbGetImageMacro(Int16RGBAImage);
otbGetImageMacro(UInt32RGBAImage);
otbGetImageMacro(Int32RGBAImage);
otbGetImageMacro(FloatRGBAImage);
otbGetImageMacro(DoubleRGBAImage);


template <class TOutputImage>
TOutputImage *
InputImageParameter::GetImage()
{
  // 2 cases : the user set a filename vs. the user set an image
  //////////////////////// Filename case:
  if( !m_FileName.empty() )
    {
    typedef otb::ImageFileReader<TOutputImage> ReaderType;
    typename ReaderType::Pointer reader = ReaderType::New();
    reader->SetFileName(m_FileName);
    try
      {
      reader->UpdateOutputInformation();
      }
    catch(itk::ExceptionObject & err)
      {
      this->ClearValue();
      }
    
    m_Image = reader->GetOutput();
    m_Reader = reader;

    // Pay attention, don't return m_Image because it is a ImageBase...
    return reader->GetOutput();
    }
  //////////////////////// Image case:
  else
    {
    if( m_Image.IsNull() )
      {
      itkExceptionMacro("No input image or filename detected...");
      }
    else
      {
  if (dynamic_cast<Int8ImageType*>(m_Image.GetPointer()))
      {
      return CastImage<Int8ImageType, TOutputImage>();
      }
    else if (dynamic_cast<UInt8ImageType*>(m_Image.GetPointer()))
      {
      return CastImage<UInt8ImageType, TOutputImage>();
      }
    else if (dynamic_cast<Int16ImageType*>(m_Image.GetPointer()))
      {
      return CastImage<Int16ImageType, TOutputImage>();
      }
    else if (dynamic_cast<UInt16ImageType*>(m_Image.GetPointer()))
      {
      return CastImage<UInt16ImageType, TOutputImage>();
      }
    else if (dynamic_cast<Int32ImageType*>(m_Image.GetPointer()))
      {
      return CastImage<Int32ImageType, TOutputImage>();
      }
    else if (dynamic_cast<UInt32ImageType*>(m_Image.GetPointer()))
      {
      return CastImage<UInt32ImageType, TOutputImage>();
      }
    else if (dynamic_cast<FloatImageType*>(m_Image.GetPointer()))
      {
      return CastImage<FloatImageType, TOutputImage>();
      }
    else if (dynamic_cast<DoubleImageType*>(m_Image.GetPointer()))
      {
      return CastImage<DoubleImageType, TOutputImage>();
      }
    else if (dynamic_cast<Int8VectorImageType*>(m_Image.GetPointer()))
      {
      return CastImage<Int8VectorImageType, TOutputImage>();
      }
    else if (dynamic_cast<UInt8VectorImageType*>(m_Image.GetPointer()))
      {
      return CastImage<UInt8VectorImageType, TOutputImage>();
      }
    else if (dynamic_cast<Int16VectorImageType*>(m_Image.GetPointer()))
      {
      return CastImage<Int16VectorImageType, TOutputImage>();
      }
    else if (dynamic_cast<UInt16VectorImageType*>(m_Image.GetPointer()))
      {
      return CastImage<UInt16VectorImageType, TOutputImage>();
      }
    else if (dynamic_cast<Int32VectorImageType*>(m_Image.GetPointer()))
      {
      return CastImage<Int32VectorImageType, TOutputImage>();
      }
    else if (dynamic_cast<UInt32VectorImageType*>(m_Image.GetPointer()))
      {
      return CastImage<UInt32VectorImageType, TOutputImage>();
      }
    else if (dynamic_cast<FloatVectorImageType*>(m_Image.GetPointer()))
      {
      return CastImage<FloatVectorImageType, TOutputImage>();
      }
    else if (dynamic_cast<DoubleVectorImageType*>(m_Image.GetPointer()))
      {
      return CastImage<DoubleVectorImageType, TOutputImage>();
      }
    else if (dynamic_cast<Int8RGBAImageType*>(m_Image.GetPointer()))
      {
      return CastImage<Int8RGBAImageType, TOutputImage>();
      }
    else if (dynamic_cast<UInt8RGBAImageType*>(m_Image.GetPointer()))
      {
      return CastImage<UInt8RGBAImageType, TOutputImage>();
      }
    else if (dynamic_cast<Int16RGBAImageType*>(m_Image.GetPointer()))
      {
      return CastImage<Int16RGBAImageType, TOutputImage>();
      }
    else if (dynamic_cast<UInt16RGBAImageType*>(m_Image.GetPointer()))
      {
      return CastImage<UInt16RGBAImageType, TOutputImage>();
      }
    else if (dynamic_cast<Int32RGBAImageType*>(m_Image.GetPointer()))
      {
      return CastImage<Int32RGBAImageType, TOutputImage>();
      }
    else if (dynamic_cast<UInt32RGBAImageType*>(m_Image.GetPointer()))
      {
      return CastImage<UInt32RGBAImageType, TOutputImage>();
      }
    else if (dynamic_cast<FloatRGBAImageType*>(m_Image.GetPointer()))
      {
      return CastImage<FloatRGBAImageType, TOutputImage>();
      }
    else if (dynamic_cast<DoubleRGBAImageType*>(m_Image.GetPointer()))
      {
      return CastImage<DoubleRGBAImageType, TOutputImage>();
      }
    else
      {
      itkExceptionMacro("Unknown image type");
      }
  
      }
    }
}


template <class TInputImage, class TOutputImage>
TOutputImage*
InputImageParameter::SimpleCastImage()
{
  TInputImage* realInputImage = dynamic_cast<TInputImage*>(m_Image.GetPointer());
  
  typedef itk::CastImageFilter<TInputImage, TOutputImage> CasterType;
  typename CasterType::Pointer caster = CasterType::New();
  
  caster->SetInput(realInputImage);
  caster->UpdateOutputInformation();
  
  m_Image = caster->GetOutput();
  m_Caster = caster;
  
  return caster->GetOutput();
}
  
                       
template <class TInputImage, class TOutputImage>
TOutputImage*
InputImageParameter::CastVectorImageFromImage()
{
  TInputImage* realInputImage = dynamic_cast<TInputImage*>(m_Image.GetPointer());
  
  typedef ImageToVectorImageCastFilter<TInputImage, TOutputImage> CasterType;
  typename CasterType::Pointer caster = CasterType::New();
  
  caster->SetInput(realInputImage);
  caster->UpdateOutputInformation();
  
  m_Image = caster->GetOutput();
  m_Caster = caster;
  
  return caster->GetOutput();
}


#define otbCastImageMacro(InputImageType, OutputImageType, theMethod)   \
  template<> OutputImageType *                                          \
  InputImageParameter::CastImage<InputImageType , OutputImageType>()    \
  {                                                                     \
    return this->theMethod<InputImageType , OutputImageType>();         \
  }

#define otbGenericCastImageMacro(InputImageType, theMethod, prefix)     \
  otbCastImageMacro(InputImageType, UInt8##prefix##ImageType, theMethod) \
  otbCastImageMacro(InputImageType, Int8##prefix##ImageType, theMethod) \
  otbCastImageMacro(InputImageType, UInt16##prefix##ImageType, theMethod) \
  otbCastImageMacro(InputImageType, Int16##prefix##ImageType, theMethod) \
  otbCastImageMacro(InputImageType, UInt32##prefix##ImageType, theMethod) \
  otbCastImageMacro(InputImageType, Int32##prefix##ImageType, theMethod) \
  otbCastImageMacro(InputImageType, Float##prefix##ImageType, theMethod) \
  otbCastImageMacro(InputImageType, Double##prefix##ImageType, theMethod)


/*********************************************************************
********************** Image -> Image
**********************************************************************/
otbCastImageMacro(Int8ImageType, Int8ImageType, SimpleCastImage )

otbGenericCastImageMacro(UInt8ImageType, SimpleCastImage, )
otbGenericCastImageMacro(Int16ImageType, SimpleCastImage, )
otbGenericCastImageMacro(UInt16ImageType, SimpleCastImage, )
otbGenericCastImageMacro(Int32ImageType, SimpleCastImage, )
otbGenericCastImageMacro(UInt32ImageType, SimpleCastImage, )
otbGenericCastImageMacro(FloatImageType, SimpleCastImage, )
otbGenericCastImageMacro(DoubleImageType, SimpleCastImage, )


/*********************************************************************
********************** VectorImage -> VectorImage
**********************************************************************/
otbGenericCastImageMacro(Int8VectorImageType, SimpleCastImage, Vector)
otbGenericCastImageMacro(UInt8VectorImageType, SimpleCastImage, Vector)
otbGenericCastImageMacro(Int16VectorImageType, SimpleCastImage, Vector)
otbGenericCastImageMacro(UInt16VectorImageType, SimpleCastImage, Vector)
otbGenericCastImageMacro(Int32VectorImageType, SimpleCastImage, Vector)
otbGenericCastImageMacro(UInt32VectorImageType, SimpleCastImage, Vector)
otbGenericCastImageMacro(FloatVectorImageType, SimpleCastImage, Vector)
otbGenericCastImageMacro(DoubleVectorImageType, SimpleCastImage, Vector)


/*********************************************************************
********************** RGBAImage -> RGBAImage
**********************************************************************/
otbGenericCastImageMacro(Int8RGBAImageType, SimpleCastImage, RGBA)
otbGenericCastImageMacro(UInt8RGBAImageType, SimpleCastImage, RGBA)
otbGenericCastImageMacro(Int16RGBAImageType, SimpleCastImage, RGBA)
otbGenericCastImageMacro(UInt16RGBAImageType, SimpleCastImage, RGBA)
otbGenericCastImageMacro(Int32RGBAImageType, SimpleCastImage, RGBA)
otbGenericCastImageMacro(UInt32RGBAImageType, SimpleCastImage, RGBA)
otbGenericCastImageMacro(FloatRGBAImageType, SimpleCastImage, RGBA)
otbGenericCastImageMacro(DoubleRGBAImageType, SimpleCastImage, RGBA)


/*********************************************************************
********************** Image -> VectorImage
**********************************************************************/
otbGenericCastImageMacro(Int8ImageType, CastVectorImageFromImage, Vector)
otbGenericCastImageMacro(UInt8ImageType, CastVectorImageFromImage, Vector)
otbGenericCastImageMacro(Int16ImageType, CastVectorImageFromImage, Vector)
otbGenericCastImageMacro(UInt16ImageType, CastVectorImageFromImage, Vector)
otbGenericCastImageMacro(Int32ImageType, CastVectorImageFromImage, Vector)
otbGenericCastImageMacro(UInt32ImageType, CastVectorImageFromImage, Vector)
otbGenericCastImageMacro(FloatImageType, CastVectorImageFromImage, Vector)
otbGenericCastImageMacro(DoubleImageType, CastVectorImageFromImage, Vector)


void
InputImageParameter::SetImage(FloatVectorImageType* image)
{
  this->SetImage<FloatVectorImageType>( image );
}


template <class TInputImage>
void
InputImageParameter::SetImage(TInputImage* image)
{
  m_Image = image;
}


bool
InputImageParameter::HasValue() const
{
  if( m_FileName.empty() && m_Image.IsNull() )
    return false;
  else
    return true;
}

void
InputImageParameter::ClearValue()
{
 m_Image  = NULL;
 m_Reader = NULL;
 m_Caster = NULL;
 m_FileName = "";
}


}
}