From c630acb538125d374ab52b6d180eeeb0933beec6 Mon Sep 17 00:00:00 2001
From: Aurelien Bricier <aurelien.bricier@c-s.fr>
Date: Tue, 9 Nov 2010 13:44:56 +0100
Subject: [PATCH] ENH: added Histogramm support to otbImageFunctionAdaptor

---
 .../Common/otbVariableLengthVectorConverter.h | 13 ++++++-----
 .../otbVariableLengthVectorConverter.txx      | 23 ++++++++++++-------
 .../otbImageFunctionAdaptor.cxx               |  4 ++--
 3 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/Code/Common/otbVariableLengthVectorConverter.h b/Code/Common/otbVariableLengthVectorConverter.h
index fac00cf55e..f1a0c43f51 100644
--- a/Code/Common/otbVariableLengthVectorConverter.h
+++ b/Code/Common/otbVariableLengthVectorConverter.h
@@ -24,6 +24,7 @@
 #include "itkExceptionObject.h"
 #include "itkFixedArray.h"
 #include "itkHistogram.h"
+#include "itkSmartPointer.h"
 
 
 namespace otb
@@ -207,9 +208,9 @@ private:
 
 //Histogram
 template< class TMeasurement, unsigned int VMeasurementVectorSize, class TFrequencyContainer, class TPrecisionType >
-class ITK_EXPORT VariableLengthVectorConverter<itk::Statistics::Histogram<TMeasurement, 
-                                                                          VMeasurementVectorSize, 
-                                                                          TFrequencyContainer>,
+class ITK_EXPORT VariableLengthVectorConverter<typename itk::SmartPointer< const itk::Statistics::Histogram<TMeasurement, 
+                                                                                                            VMeasurementVectorSize, 
+                                                                                                            TFrequencyContainer> >,
                                                TPrecisionType> :
 public itk::ProcessObject
 {
@@ -228,9 +229,9 @@ public:
 
   typedef TPrecisionType                                                           OutputPrecisionType;
   typedef typename itk::VariableLengthVector<OutputPrecisionType>                  OutputType;
-  typedef typename itk::Statistics::Histogram<TMeasurement, 
-                                              VMeasurementVectorSize, 
-                                              TFrequencyContainer>                 InputType;
+  typedef typename itk::SmartPointer< const itk::Statistics::Histogram<TMeasurement, 
+                                                                       VMeasurementVectorSize, 
+                                                                       TFrequencyContainer> >   InputType;
 
   OutputType Convert(InputType input);
  
diff --git a/Code/Common/otbVariableLengthVectorConverter.txx b/Code/Common/otbVariableLengthVectorConverter.txx
index 16a84fd82a..42931131a5 100644
--- a/Code/Common/otbVariableLengthVectorConverter.txx
+++ b/Code/Common/otbVariableLengthVectorConverter.txx
@@ -107,21 +107,28 @@ VariableLengthVectorConverter< itk::FixedArray<TInternalInputType, VArrayDimensi
 
 // Histogram
 template< class TMeasurement, unsigned int VMeasurementVectorSize, class TFrequencyContainer, class TPrecisionType >
-typename VariableLengthVectorConverter< itk::Statistics::Histogram<TMeasurement, VMeasurementVectorSize, TFrequencyContainer>, TPrecisionType>
+typename VariableLengthVectorConverter< itk::SmartPointer< const itk::Statistics::Histogram<TMeasurement, 
+                                                                                            VMeasurementVectorSize, 
+                                                                                            TFrequencyContainer> >, 
+                                        TPrecisionType>
 ::OutputType
-VariableLengthVectorConverter< itk::Statistics::Histogram<TMeasurement, VMeasurementVectorSize, TFrequencyContainer>, TPrecisionType>
+VariableLengthVectorConverter< itk::SmartPointer<const itk::Statistics::Histogram<TMeasurement, 
+                                                                                  VMeasurementVectorSize, 
+                                                                                  TFrequencyContainer> >, 
+                               TPrecisionType>
 ::Convert(InputType input)
 {
-  unsigned int nbBins, rsltIdx = 0;
+  unsigned int rsltIdx = 0;
+  itk::Size<1> nbBins;
   OutputType result;
 
-  nbBins = input.GetSize();
-
-  result.SetSize(nbBins);
+  nbBins[0] = input->GetSize()[0];
+  
+  result.SetSize(nbBins[0]);
 
-  for (unsigned int i=0; i<nbBins; i++)
+  for (unsigned int i=0; i<nbBins[0]; i++)
     {
-    result[rsltIdx] = static_cast<OutputPrecisionType>(input.GetFrequency(i));
+    result[rsltIdx] = static_cast<OutputPrecisionType>(input->GetFrequency(i));
     rsltIdx ++;
     }
   
diff --git a/Testing/Code/FeatureExtraction/otbImageFunctionAdaptor.cxx b/Testing/Code/FeatureExtraction/otbImageFunctionAdaptor.cxx
index 2169f78968..2f7fc61774 100644
--- a/Testing/Code/FeatureExtraction/otbImageFunctionAdaptor.cxx
+++ b/Testing/Code/FeatureExtraction/otbImageFunctionAdaptor.cxx
@@ -266,7 +266,7 @@ int otbImageFunctionAdaptor(int argc, char * argv[])
               << "\t - resultRaM : " << resultRaM[i] << std::endl;
     rsltIdx ++;
     }
-/*
+
   LHFunction->SetInputImage(reader->GetOutput());
   LHFunction->SetNeighborhoodRadius(5);
   LHFunction->SetNumberOfHistogramBins(64);
@@ -290,7 +290,7 @@ int otbImageFunctionAdaptor(int argc, char * argv[])
               << "\t - resultLH : " << resultLH->GetFrequency(i) << std::endl;
     rsltIdx ++;
     }
- */
+
   error = vcl_sqrt(error);
   std::cout << std::endl << "Error : " << error << std::endl
             << std::endl;
-- 
GitLab