Commit 47c79d52 authored by Guillaume Pasero's avatar Guillaume Pasero

MRG: Synchronize with branch develop

Conflicts:
	Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx
parents 2ed55283 99723cb9
......@@ -76,7 +76,7 @@ private:
SetDocName("Polygon Class Statistics");
SetDocLongDescription("The application processes a set of geometries "
"intended for training (they should have a field giving the associated "
"class). The geometries are analysed against a support image to compute "
"class). The geometries are analyzed against a support image to compute "
"statistics : \n"
" - number of samples per class\n"
" - number of samples per geometry\n"
......@@ -92,17 +92,17 @@ private:
AddDocTag(Tags::Learning);
AddParameter(ParameterType_InputImage, "in", "InputImage");
AddParameter(ParameterType_InputImage, "in", "Input image");
SetParameterDescription("in", "Support image that will be classified");
AddParameter(ParameterType_InputImage, "mask", "InputMask");
AddParameter(ParameterType_InputImage, "mask", "Input validity mask");
SetParameterDescription("mask", "Validity mask (only pixels corresponding to a mask value greater than 0 will be used for statistics)");
MandatoryOff("mask");
AddParameter(ParameterType_InputFilename, "vec", "Input vectors");
SetParameterDescription("vec","Input geometries to analyse");
SetParameterDescription("vec","Input geometries to analyze");
AddParameter(ParameterType_OutputFilename, "out", "Output Statistics");
AddParameter(ParameterType_OutputFilename, "out", "Output XML statistics file");
SetParameterDescription("out","Output file to store statistics (XML format)");
AddParameter(ParameterType_ListView, "field", "Field Name");
......@@ -155,6 +155,22 @@ private:
}
}
}
// Check that the extension of the output parameter is XML (mandatory for
// StatisticsXMLFileWriter)
// Check it here to trigger the error before polygons analysis
if ( HasValue("out") )
{
// Store filename extension
// Check that the right extension is given : expected .xml
const std::string extension = itksys::SystemTools::GetFilenameLastExtension(this->GetParameterString("out"));
if (itksys::SystemTools::LowerCase(extension) != ".xml")
{
otbAppLogFATAL( << extension << " is a wrong extension for parameter \"out\": Expected .xml" );
}
}
}
void DoExecute() ITK_OVERRIDE
......@@ -223,7 +239,7 @@ private:
filter->SetLayerIndex(this->GetParameterInt("layer"));
filter->GetStreamer()->SetAutomaticAdaptativeStreaming(GetParameterInt("ram"));
AddProcess(filter->GetStreamer(),"Analyse polygons...");
AddProcess(filter->GetStreamer(),"Analyze polygons...");
filter->Update();
FilterType::ClassCountMapType &classCount = filter->GetClassCountOutput()->Get();
......
......@@ -264,7 +264,7 @@ private:
{
// fft ttransform
bool shift = GetParameterInt( "mode.fft.shift");
typedef otb::Image< std::complex<OutputPixelType> > ComplexOutputImageType;
typedef otb::Image< std::complex<OutputPixelType> > ComplexOutputImageType;
if (dir == 0 )
{
......
......@@ -173,6 +173,14 @@ otb_test_application(NAME apTvUtExtractROIRightInputFile
${INPUTDATA}/couleurs_extrait.png
${TEMP}/apTvUtExtractROIRightInputFile.tif)
otb_test_application(NAME apTvUtExtractROIComplexInputFile
APP ExtractROI
OPTIONS -in ${INPUTDATA}/complexInputCfloat.tif
-out ${TEMP}/apTvUtExtractROIComplexInputFile.tif cfloat
VALID --compare-image ${NOTOL}
${INPUTDATA}/complexInputCfloat.tif
${TEMP}/apTvUtExtractROIComplexInputFile.tif)
#----------- Rescale TESTS ----------------
otb_test_application(NAME apTvUtRescaleTest
......@@ -207,6 +215,11 @@ otb_test_application(NAME apTuUtReadImageInfoExtendedFilename_reader
OPTIONS -in ${INPUTDATA}/ToulouseExtract_WithGeom.tif?&skipgeom=true&skipcarto=true
)
otb_test_application(NAME apTuUtReadComplexImageInfoFilename_reader
APP ReadImageInfo
OPTIONS -in ${INPUTDATA}/complexInputCfloat.tif
)
set(TESTNAME
"gd-pleiades-1" #LARGEINPUT{PLEIADES/TLSE_JP2_DIMAPv2_PRIMARY_PMS_lossless_12bits/IMGPHR_201222215194743808/IMG_PHR1A_PMS_201201151100183_SEN_IPU_20120222_0901-001_R1C1.JP2}
......
......@@ -29,7 +29,7 @@
#include "otbReflectanceToRadianceImageFilter.h"
#include "otbReflectanceToSurfaceReflectanceImageFilter.h"
#include "itkMultiplyImageFilter.h"
#include "otbClampVectorImageFilter.h"
#include "otbClampImageFilter.h"
#include "otbSurfaceAdjacencyEffectCorrectionSchemeFilter.h"
#include "otbGroundSpacingImageFunction.h"
#include "vnl/vnl_random.h"
......@@ -92,7 +92,7 @@ public:
typedef itk::MultiplyImageFilter<DoubleVectorImageType,DoubleImageType,DoubleVectorImageType> ScaleFilterOutDoubleType;
typedef otb::ClampVectorImageFilter<DoubleVectorImageType,
typedef otb::ClampImageFilter<DoubleVectorImageType,
DoubleVectorImageType> ClampFilterType;
typedef ReflectanceToSurfaceReflectanceImageFilter<DoubleVectorImageType,
......
......@@ -60,7 +60,7 @@ private:
AddDocTag(Tags::Calibration);
AddDocTag(Tags::SAR);
AddParameter(ParameterType_ComplexInputImage, "in", "Input Image");
AddParameter(ParameterType_InputImage, "in", "Input Image");
SetParameterDescription("in", "Input complex image");
AddParameter(ParameterType_OutputImage, "out", "Output Image");
......
......@@ -31,7 +31,7 @@
#include "otbSinclairToReciprocalCoherencyMatrixFunctor.h"
#include "otbPerBandVectorImageFilter.h"
#include "itkMeanImageFilter.h"
#include "otbNRIBandImagesToOneNComplexBandsImage.h"
// #include "otbNRIBandImagesToOneNComplexBandsImage.h"
#include "otbImageListToVectorImageFilter.h"
#include "otbImageList.h"
......@@ -109,21 +109,21 @@ private:
AddDocTag(Tags::SAR);
AddParameter(ParameterType_ComplexInputImage, "inhh", "Input Image");
AddParameter(ParameterType_InputImage, "inhh", "Input Image");
SetParameterDescription("inhh", "Input image (HH)");
AddParameter(ParameterType_ComplexInputImage, "inhv", "Input Image");
AddParameter(ParameterType_InputImage, "inhv", "Input Image");
SetParameterDescription("inhv", "Input image (HV)");
MandatoryOff("inhv");
AddParameter(ParameterType_ComplexInputImage, "invh", "Input Image");
AddParameter(ParameterType_InputImage, "invh", "Input Image");
SetParameterDescription("invh", "Input image (VH)");
MandatoryOff("invh");
AddParameter(ParameterType_ComplexInputImage, "invv", "Input Image");
AddParameter(ParameterType_InputImage, "invv", "Input Image");
SetParameterDescription("invv", "Input image (VV)");
AddParameter(ParameterType_ComplexOutputImage, "out", "Output Image");
AddParameter(ParameterType_OutputImage, "out", "Output Image");
SetParameterDescription("out", "Output image");
AddParameter(ParameterType_Choice, "decomp", "Decompositions");
......@@ -201,7 +201,7 @@ private:
m_MeanFilter->SetInput(m_SRFilter->GetOutput());
m_HAFilter->SetInput(m_MeanFilter->GetOutput());
SetParameterComplexOutputImage("out", m_HAFilter->GetOutput() );
SetParameterOutputImage("out", m_HAFilter->GetOutput() );
break;
......@@ -220,7 +220,7 @@ private:
m_MeanFilter->SetInput(m_SRFilter->GetOutput());
m_BarnesFilter->SetInput(m_MeanFilter->GetOutput());
SetParameterComplexOutputImage("out", m_BarnesFilter->GetOutput() );
SetParameterOutputImage("out", m_BarnesFilter->GetOutput() );
break;
......@@ -239,7 +239,7 @@ private:
m_MeanFilter->SetInput(m_SRFilter->GetOutput());
m_HuynenFilter->SetInput(m_MeanFilter->GetOutput());
SetParameterComplexOutputImage("out", m_HuynenFilter->GetOutput() );
SetParameterOutputImage("out", m_HuynenFilter->GetOutput() );
break;
......@@ -257,7 +257,7 @@ private:
m_Concatener->SetInput( m_ImageList );
m_PauliFilter->SetInput(m_Concatener->GetOutput());
SetParameterComplexOutputImage("out", m_PauliFilter->GetOutput() );
SetParameterOutputImage("out", m_PauliFilter->GetOutput() );
break;
}
......
......@@ -232,7 +232,7 @@ private:
AddDocTag(Tags::SAR);
AddParameter(ParameterType_ComplexInputImage, "inc", "Input : multi-band complex image");
AddParameter(ParameterType_InputImage, "inc", "Input : multi-band complex image");
SetParameterDescription("inc", "Input : multi-band complex image");
MandatoryOff("inc");
......@@ -241,23 +241,23 @@ private:
MandatoryOff("inf");
AddParameter(ParameterType_ComplexInputImage, "inhh", "Input : one-band complex image (HH)");
AddParameter(ParameterType_InputImage, "inhh", "Input : one-band complex image (HH)");
SetParameterDescription("inhh", "Input : one-band complex image (HH)");
MandatoryOff("inhh");
AddParameter(ParameterType_ComplexInputImage, "inhv", "Input : one-band complex image (HV)");
AddParameter(ParameterType_InputImage, "inhv", "Input : one-band complex image (HV)");
SetParameterDescription("inhv", "Input : one-band complex image (HV)");
MandatoryOff("inhv");
AddParameter(ParameterType_ComplexInputImage, "invh", "Input : one-band complex image (VH)");
AddParameter(ParameterType_InputImage, "invh", "Input : one-band complex image (VH)");
SetParameterDescription("invh", "Input : one-band complex image (VH)");
MandatoryOff("invh");
AddParameter(ParameterType_ComplexInputImage, "invv", "Input : one-band complex image (VV)");
AddParameter(ParameterType_InputImage, "invv", "Input : one-band complex image (VV)");
SetParameterDescription("invv", "Input : one-band complex image (VV)");
MandatoryOff("invv");
AddParameter(ParameterType_ComplexOutputImage, "outc", "Output Complex Image");
AddParameter(ParameterType_OutputImage, "outc", "Output Complex Image");
SetParameterDescription("outc", "Output Complex image.");
MandatoryOff("outc");
......@@ -509,7 +509,7 @@ private:
m_RCohSRFilter->SetInputHH(GetParameterComplexDoubleImage("inhh"));
m_RCohSRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
SetParameterComplexOutputImage("outc", m_RCohSRFilter->GetOutput() ); // input : 3 x 1 complex channel | output : 6 complex channels
SetParameterOutputImage("outc", m_RCohSRFilter->GetOutput() ); // input : 3 x 1 complex channel | output : 6 complex channels
break;
......@@ -526,7 +526,7 @@ private:
m_RCovSRFilter->SetInputHH(GetParameterComplexDoubleImage("inhh"));
m_RCovSRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
SetParameterComplexOutputImage("outc", m_RCovSRFilter->GetOutput() ); // input : 3 x 1 complex channel | output : 6 complex channels
SetParameterOutputImage("outc", m_RCovSRFilter->GetOutput() ); // input : 3 x 1 complex channel | output : 6 complex channels
break;
......@@ -544,7 +544,7 @@ private:
m_RCCSRFilter->SetInputHH(GetParameterComplexDoubleImage("inhh"));
m_RCCSRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
SetParameterComplexOutputImage("outc", m_RCCSRFilter->GetOutput() ); // input : 3 x 1 complex channel | output : 6 complex channels
SetParameterOutputImage("outc", m_RCCSRFilter->GetOutput() ); // input : 3 x 1 complex channel | output : 6 complex channels
break;
......@@ -565,7 +565,7 @@ private:
m_RCCDFilter = RCCDFilterType::New();
m_RCCDFilter->SetInput(GetParameterComplexDoubleVectorImage("inc"));
SetParameterComplexOutputImage("outc", m_RCCDFilter->GetOutput() ); // input : 6 complex channels | 3 complex channels
SetParameterOutputImage("outc", m_RCCDFilter->GetOutput() ); // input : 6 complex channels | 3 complex channels
break;
......@@ -575,7 +575,7 @@ private:
m_RCRCFilter = RCRCFilterType::New();
m_RCRCFilter->SetInput(GetParameterComplexDoubleVectorImage("inc"));
SetParameterComplexOutputImage("outc", m_RCRCFilter->GetOutput() ); // input : 6 complex channels | 6 complex channels
SetParameterOutputImage("outc", m_RCRCFilter->GetOutput() ); // input : 6 complex channels | 6 complex channels
break;
......@@ -586,7 +586,7 @@ private:
m_RLCRCCFilter = RLCRCCFilterType::New();
m_RLCRCCFilter->SetInput(GetParameterComplexDoubleVectorImage("inc"));
SetParameterComplexOutputImage("outc", m_RLCRCCFilter->GetOutput() ); // input : 6 complex channels | output : 6 complex channels
SetParameterOutputImage("outc", m_RLCRCCFilter->GetOutput() ); // input : 6 complex channels | output : 6 complex channels
break;
......@@ -597,7 +597,7 @@ private:
m_MRCFilter->SetInput(GetParameterDoubleVectorImage("inf"));
SetParameterComplexOutputImage("outc", m_MRCFilter->GetOutput() ); // input : 16 real channels | output : 6 complex channels
SetParameterOutputImage("outc", m_MRCFilter->GetOutput() ); // input : 16 real channels | output : 6 complex channels
break;
......@@ -615,7 +615,7 @@ private:
m_CohSRFilter->SetInputVH(GetParameterComplexDoubleImage("invh"));
m_CohSRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
SetParameterComplexOutputImage("outc", m_CohSRFilter->GetOutput() ); // input : 4 x 1 complex channel | 10 complex channels
SetParameterOutputImage("outc", m_CohSRFilter->GetOutput() ); // input : 4 x 1 complex channel | 10 complex channels
break;
......@@ -630,7 +630,7 @@ private:
m_CovSRFilter->SetInputVH(GetParameterComplexDoubleImage("invh"));
m_CovSRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
SetParameterComplexOutputImage("outc", m_CovSRFilter->GetOutput() ); // input : 4 x 1 complex channel | output : 10 complex channels
SetParameterOutputImage("outc", m_CovSRFilter->GetOutput() ); // input : 4 x 1 complex channel | output : 10 complex channels
break;
......@@ -644,7 +644,7 @@ private:
m_CCSRFilter->SetInputVH(GetParameterComplexDoubleImage("invh"));
m_CCSRFilter->SetInputVV(GetParameterComplexDoubleImage("invv"));
SetParameterComplexOutputImage("outc", m_CCSRFilter->GetOutput() ); // input : 4 x 1 complex channel | output : 10 complex channels
SetParameterOutputImage("outc", m_CCSRFilter->GetOutput() ); // input : 4 x 1 complex channel | output : 10 complex channels
break;
......
......@@ -86,7 +86,7 @@ private:
AddDocTag(Tags::SAR);
AddParameter(ParameterType_ComplexInputImage, "in", "Input Image");
AddParameter(ParameterType_InputImage, "in", "Input Image");
SetParameterDescription("in", "Input image.");
AddParameter(ParameterType_OutputImage, "out", "Output Image");
SetParameterDescription("out", "Output image.");
......
......@@ -75,7 +75,7 @@ private:
AddDocTag(Tags::SAR);
AddDocTag(Tags::Manip);
// Input images
AddParameter(ParameterType_ComplexInputImage, "in", "Input Image");
AddParameter(ParameterType_InputImage, "in", "Input Image");
SetParameterDescription("in", "Input image (complex single band)");
// Outputs
......@@ -110,7 +110,7 @@ private:
m_Modulus = ModulusFilterType::New();
m_Phase = PhaseFilterType::New();
ComplexFloatVectorImageType::Pointer inImage = GetParameterComplexImage("in");
ComplexFloatVectorImageType::Pointer inImage = GetParameterComplexFloatVectorImage("in");
if (inImage->GetNumberOfComponentsPerPixel() != 1)
{
......
/*
* Copyright (C) 1999-2011 Insight Software Consortium
* Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
*
* This file is part of Orfeo Toolbox
......@@ -19,322 +18,67 @@
* limitations under the License.
*/
#ifndef otbDefaultConvertPixelTraits_h
#define otbDefaultConvertPixelTraits_h
#include "itkOffset.h"
#include "itkVector.h"
#include "itkMatrix.h"
#include "itkDefaultConvertPixelTraits.h"
namespace otb
namespace otb
{
/** \class DefaultConvertPixelTraits
* \brief Traits class used to by ConvertPixels to convert blocks of pixels.
*
* TOutputPixelType is the destination type. The input type is inferred
* by the templated static function Convert.
*
* This implementation does a simple assignment operator, so if you are
* going from a higher bit representation to a lower bit one (int to
* char), you may want to specialize and add some sort of transfer function.
*
* \ingroup OTBImageBase
*/
template<typename PixelType>
class DefaultConvertPixelTraits
template < typename PixelType>
class DefaultConvertPixelTraits
: public itk::DefaultConvertPixelTraits < PixelType >
{
public:
/** Determine the pixel data type. */
typedef typename PixelType::ComponentType ComponentType;
/** Return the number of components per pixel. */
static unsigned int GetNumberOfComponents()
{ return PixelType::GetNumberOfComponents(); }
/** Return the nth component of the pixel. */
static ComponentType GetNthComponent(int c, const PixelType& pixel)
{ return pixel.GetNthComponent(c); }
/** Set the nth component of the pixel. */
static void SetNthComponent(int c, PixelType& pixel, const ComponentType& v)
{ pixel.SetNthComponent(c, v); }
static void SetNthComponent(int itkNotUsed(c), PixelType & pixel, const PixelType& v)
{ pixel = v; }
typedef itk::DefaultConvertPixelTraits < PixelType > SuperClass;
using typename SuperClass::ComponentType;
/** Return a single scalar value from this pixel. */
static ComponentType GetScalarValue(const PixelType& pixel)
{ return pixel.GetScalarValue(); }
using SuperClass::SetNthComponent;
static void SetNthComponent(int , PixelType & pixel, const PixelType & v)
{
pixel = v;
}
};
#define OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(type) \
template<> \
class DefaultConvertPixelTraits<type> \
{ \
public: \
typedef type ComponentType; \
static unsigned int GetNumberOfComponents() \
{ \
return 1; \
} \
static void SetNthComponent(int , type& pixel, const ComponentType& v) \
{ \
pixel = v; \
} \
static type GetScalarValue(const type& pixel) \
{ \
return pixel; \
} \
};
OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(float)
OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(double)
OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(int)
OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(char)
OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(short)
OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(unsigned int)
OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(signed char)
OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(unsigned char)
OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(unsigned short)
OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(long)
OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(unsigned long)
OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL(bool)
#undef OTB_DEFAULTCONVERTTRAITS_NATIVE_SPECIAL
//
// Default traits for the Offset<> pixel type
//
template < typename T >
class DefaultConvertPixelTraits < ::std::complex < T > >
: public itk::DefaultConvertPixelTraits < ::std::complex < T > >
{
public:
#define OTB_DEFAULTCONVERTTRAITS_OFFSET_TYPE(dimension) \
template<> \
class DefaultConvertPixelTraits< itk::Offset<dimension> > \
{ \
public: \
typedef itk::Offset<dimension> TargetType; \
typedef TargetType::OffsetValueType ComponentType; \
static unsigned int GetNumberOfComponents() \
{ \
return dimension; \
} \
static void SetNthComponent(int i, TargetType & pixel, const ComponentType& v) \
{ \
pixel[i] = v; \
} \
static void SetNthComponent(int , TargetType & pixel, const TargetType& v) \
{ \
pixel = v; \
} \
static ComponentType GetScalarValue(const TargetType& pixel) \
{ \
return pixel[0]; \
} \
typedef itk::DefaultConvertPixelTraits < ::std::complex < T > > SuperClass;
using typename SuperClass::TargetType ;
using typename SuperClass::ComponentType ;
using SuperClass::SetNthComponent ;
static void SetNthComponent(int , TargetType & pixel, const TargetType & v)
{
pixel = v;
}
static TargetType GetNthComponent ( int , const TargetType & pixel )
{
return pixel;
}
static ComponentType GetScalarValue(const TargetType& pixel)
{
/*
* This seems to be dead code, since the complex to scalar
* conversion is done by ConvertPixelBuffer
*
* Historically, it was returning std::norm, which causes
* compilation error on MacOSX 10.9.
* Now returns the equivalent implementation of std::norm.
*/
return static_cast<ComponentType>( pixel.real()*pixel.real()
+ pixel.imag()*pixel.imag() );
}
};
// Define traits for Offset<> from dimensions 1 to 5
OTB_DEFAULTCONVERTTRAITS_OFFSET_TYPE(1)
OTB_DEFAULTCONVERTTRAITS_OFFSET_TYPE(2)
OTB_DEFAULTCONVERTTRAITS_OFFSET_TYPE(3)
OTB_DEFAULTCONVERTTRAITS_OFFSET_TYPE(4)
OTB_DEFAULTCONVERTTRAITS_OFFSET_TYPE(5)
//
// Default traits for the pixel types deriving from FixedArray<>
//
#define OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(type,componenttype, dimension) \
template<> \
class DefaultConvertPixelTraits< type< componenttype, dimension> > \
{ \
public: \
typedef type< componenttype, dimension > TargetType; \
typedef componenttype ComponentType; \
static unsigned int GetNumberOfComponents() \
{ \
return dimension; \
} \
static void SetNthComponent(int i, TargetType & pixel, const ComponentType& v) \
{ \
pixel[i] = v; \
} \
static void SetNthComponent(int , TargetType & pixel, const TargetType& v) \
{ \
pixel = v; \
} \
static ComponentType GetScalarValue(const TargetType& pixel) \
{ \
return pixel[0]; \
} \
}; \
//
//
// Define traits for Classed deriving from FixedArray from dimensions 1 to 6
// These classes include: Vector, CovariantVector and Point.
//
//
#define OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, Type) \
OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(ArrayType,Type,1) \
OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(ArrayType,Type,2) \
OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(ArrayType,Type,3) \
OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(ArrayType,Type,4) \
OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(ArrayType,Type,5) \
OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE(ArrayType,Type,6)
#define OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_TYPES_MACRO(ArrayType) \
OTB_DEFAULTCONVERTTRAITS_FIXEDARRAY_TYPE_ALL_MACRO(ArrayType, char); \