Skip to content
Snippets Groups Projects
Commit b3f88a6a authored by Julien Malik's avatar Julien Malik
Browse files

MRG

parents 01fef69e a538c709
Branches
Tags
No related merge requests found
...@@ -77,6 +77,65 @@ private: ...@@ -77,6 +77,65 @@ private:
std::string m_AttributeName; std::string m_AttributeName;
}; };
/** \class AttributesMapMeasurementFunctor
* \brief This class allows to build a measurement vector from an AttributesMapLabelObject
*
* It Allows to select only a subset of the available attributes.
*/
template<class TLabelObject,class TMeasurementVector>
class AttributesMapMeasurementFunctor
{
public:
typedef std::vector<std::string> AttributesListType;
inline TMeasurementVector operator()(const TLabelObject * object) const
{
TMeasurementVector newSample(m_Attributes.size());
unsigned int attrIndex = 0;
typename AttributesListType::const_iterator attrIt = m_Attributes.begin();
while(attrIt != m_Attributes.end())
{
newSample[attrIndex] = object->GetAttribute(attrIt->c_str());
++attrIt;
++attrIndex;
}
return newSample;
}
/** Add an attribute to the exported attributes list */
void AddAttribute(const char * attr)
{
m_Attributes.push_back(attr);
}
/** Remove an attribute from the exported attributes list */
void RemoveAttribute(const char * attr)
{
AttributesListType::iterator elt = std::find(m_Attributes.begin(),m_Attributes.end(),attr);
if(elt!=m_Attributes.end())
{
m_Attributes.erase(elt);
}
}
/** Remove all attributes from the exported attributes list */
void ClearAttributes()
{
m_Attributes.clear();
}
/** Get The number of exported attributes */
unsigned int GetNumberOfAttributes()
{
return m_Attributes.size();
}
private:
AttributesListType m_Attributes;
};
} // end namespace Functor } // end namespace Functor
/** \class AttributesMapLabelObject /** \class AttributesMapLabelObject
......
...@@ -19,7 +19,6 @@ PURPOSE. See the above copyright notices for more information. ...@@ -19,7 +19,6 @@ PURPOSE. See the above copyright notices for more information.
#define __otbKMeansAttributesLabelMapFilter_h #define __otbKMeansAttributesLabelMapFilter_h
#include "itkLabelMapFilter.h" #include "itkLabelMapFilter.h"
#include "itkSimpleDataObjectDecorator.h"
#include "otbLabelMapWithClassLabelToLabeledSampleListFilter.h" #include "otbLabelMapWithClassLabelToLabeledSampleListFilter.h"
#include "itkListSample.h" #include "itkListSample.h"
#include "itkEuclideanDistance.h" #include "itkEuclideanDistance.h"
...@@ -54,10 +53,6 @@ public: ...@@ -54,10 +53,6 @@ public:
// LabelObject attributes // LabelObject attributes
typedef typename LabelObjectType::AttributesValueType AttributesValueType; typedef typename LabelObjectType::AttributesValueType AttributesValueType;
typedef typename LabelObjectType::AttributesMapType AttributesMapType;
typedef itk::SimpleDataObjectDecorator<AttributesMapType> AttributesMapObjectType;
typedef typename InputImageType::LabelObjectContainerType LabelObjectContainerType;
typedef typename LabelObjectContainerType::const_iterator LabelObjectContainerConstIterator;
typedef typename LabelObjectType::ClassLabelType ClassLabelType; typedef typename LabelObjectType::ClassLabelType ClassLabelType;
// LabelMapToSampleList // LabelMapToSampleList
...@@ -78,7 +73,6 @@ public: ...@@ -78,7 +73,6 @@ public:
typedef itk::Statistics::KdTreeBasedKmeansEstimator<TreeType> EstimatorType; typedef itk::Statistics::KdTreeBasedKmeansEstimator<TreeType> EstimatorType;
typedef itk::Statistics::EuclideanDistance<VectorType> DistanceType; typedef itk::Statistics::EuclideanDistance<VectorType> DistanceType;
typedef std::vector<VectorType> CentroidsVectorType; typedef std::vector<VectorType> CentroidsVectorType;
typedef itk::SimpleDataObjectDecorator<CentroidsVectorType> CentroidsVectorObjectType;
/** ImageDimension constants */ /** ImageDimension constants */
itkStaticConstMacro(InputImageDimension, unsigned int, itkStaticConstMacro(InputImageDimension, unsigned int,
...@@ -89,7 +83,7 @@ public: ...@@ -89,7 +83,7 @@ public:
/** Runtime information support. */ /** Runtime information support. */
itkTypeMacro(KMeansAttributesLabelMapFilter, itkTypeMacro(KMeansAttributesLabelMapFilter,
LabelMapFilter); itk::Object);
/** Return the centroids resulting from the KMeans */ /** Return the centroids resulting from the KMeans */
CentroidsVectorType& GetCentroids() CentroidsVectorType& GetCentroids()
......
/*=========================================================================
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.
=========================================================================*/
#ifndef __otbLabelMapSVMClassifier_h
#define __otbLabelMapSVMClassifier_h
#include "itkInPlaceLabelMapFilter.h"
#include "otbSVMModel.h"
#include "itkListSample.h"
#include "otbAttributesMapLabelObject.h"
namespace otb {
/** \class LabelMapSVMClassifier
* \brief Classify each LabelObject of the input LabelMap in place
*/
template<class TInputLabelMap>
class ITK_EXPORT LabelMapSVMClassifier :
public itk::InPlaceLabelMapFilter<TInputLabelMap>
{
public:
/** Standard class typedefs. */
typedef LabelMapSVMClassifier Self;
typedef itk::InPlaceLabelMapFilter<TInputLabelMap> Superclass;
typedef itk::SmartPointer<Self> Pointer;
typedef itk::SmartPointer<const Self> ConstPointer;
/** Some convenient typedefs. */
typedef TInputLabelMap LabelMapType;
typedef typename LabelMapType::Pointer LabelMapPointer;
typedef typename LabelMapType::ConstPointer LabelMaponstPointer;
typedef typename LabelMapType::LabelObjectType LabelObjectType;
typedef typename LabelObjectType::AttributesValueType AttributesValueType;
typedef typename LabelObjectType::ClassLabelType ClassLabelType;
typedef std::vector<AttributesValueType> MeasurementVectorType;
typedef Functor::AttributesMapMeasurementFunctor
<LabelObjectType, MeasurementVectorType> MeasurementFunctorType;
/** ImageDimension constants */
itkStaticConstMacro(InputImageDimension, unsigned int,
TInputLabelMap::ImageDimension);
/** Type definitions for the SVM Model. */
typedef SVMModel<AttributesValueType, ClassLabelType> SVMModelType;
typedef typename SVMModelType::Pointer SVMModelPointer;
/** Standard New method. */
itkNewMacro(Self);
/** Runtime information support. */
itkTypeMacro(LabelMapSVMClassifier,
itk::InPlaceLabelMapFilter);
itkSetObjectMacro(Model, SVMModelType);
void SetMeasurementFunctor(const MeasurementFunctorType& functor)
{
m_MeasurementFunctor = functor;
}
MeasurementFunctorType & GetMeasurementFunctor()
{
return m_MeasurementFunctor;
}
protected:
LabelMapSVMClassifier();
~LabelMapSVMClassifier() {};
virtual void ThreadedProcessLabelObject( LabelObjectType * labelObject );
private:
LabelMapSVMClassifier(const Self&); //purposely not implemented
void operator=(const Self&); //purposely not implemented
/** The SVM model used for classification */
SVMModelPointer m_Model;
/** The functor used to build the measurement vector */
MeasurementFunctorType m_MeasurementFunctor;
}; // end of class
} // end namespace otb
#ifndef OTB_MANUAL_INSTANTIATION
#include "otbLabelMapSVMClassifier.txx"
#endif
#endif
/*=========================================================================
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.
=========================================================================*/
#ifndef __otbLabelMapSVMClassifier_txx
#define __otbLabelMapSVMClassifier_txx
#include "otbLabelMapSVMClassifier.h"
namespace otb {
template <class TInputImage>
LabelMapSVMClassifier<TInputImage>
::LabelMapSVMClassifier()
{
// Force to single-threaded (SVMModel is not thread-safe)
// This way, we benefit of the LabelMapFilter design and only need
// to implement ThreadedProcessLabelObject
this->SetNumberOfThreads(1);
}
template<class TInputImage>
void
LabelMapSVMClassifier<TInputImage>
::ThreadedProcessLabelObject( LabelObjectType * labelObject )
{
ClassLabelType classLabel = m_Model->EvaluateLabel(m_MeasurementFunctor(labelObject));
labelObject->SetClassLabel(classLabel);
}
}// end namespace otb
#endif
...@@ -21,71 +21,10 @@ ...@@ -21,71 +21,10 @@
#include <algorithm> #include <algorithm>
#include "itkObject.h" #include "itkObject.h"
#include "otbAttributesMapLabelObject.h"
namespace otb namespace otb
{ {
namespace Functor
{
/** \class AttributesMapMeasurementFunctor
* \brief This class allows to build a measurement vector from an AttributesMapLabelObject
*
* It Allows to select only a subset of the available attributes.
*/
template<class TLabelObject,class TMeasurementVector>
class AttributesMapMeasurementFunctor
{
public:
typedef std::vector<std::string> AttributesListType;
inline TMeasurementVector operator()(const TLabelObject * object) const
{
TMeasurementVector newSample(m_Attributes.size());
newSample.Fill(0);
unsigned int attrIndex = 0;
typename AttributesListType::const_iterator attrIt = m_Attributes.begin();
while(attrIt != m_Attributes.end())
{
newSample[attrIndex] = object->GetAttribute(attrIt->c_str());
++attrIt;
++attrIndex;
}
return newSample;
}
/** Add an attribute to the exported attributes list */
void AddAttribute(const char * attr)
{
m_Attributes.push_back(attr);
}
/** Remove an attribute from the exported attributes list */
void RemoveAttribute(const char * attr)
{
AttributesListType::iterator elt = std::find(m_Attributes.begin(),m_Attributes.end(),attr);
if(elt!=m_Attributes.end())
{
m_Attributes.erase(elt);
}
}
/** Remove all attributes from the exported attributes list */
void ClearAttributes()
{
m_Attributes.clear();
}
/** Get The number of exported attributes */
unsigned int GetNumberOfAttributes()
{
return m_Attributes.size();
}
private:
AttributesListType m_Attributes;
};
}
/** \class LabelMapToSampleListFilter /** \class LabelMapToSampleListFilter
* \brief This class converts a LabelObjectMap to a SampleList for * \brief This class converts a LabelObjectMap to a SampleList for
* learning and classification. * learning and classification.
......
...@@ -17,13 +17,14 @@ SET(EPSILON_9 0.000000001) ...@@ -17,13 +17,14 @@ SET(EPSILON_9 0.000000001)
#Tolerance sur la difference des valeurs numeriques dans le --compare-ascii #Tolerance sur la difference des valeurs numeriques dans le --compare-ascii
SET(EPSILON_3 0.001) SET(EPSILON_3 0.001)
# Common generic tests
SET(OBIA_TESTS1 ${CXX_TEST_PATH}/otbOBIATests1) SET(OBIA_TESTS1 ${CXX_TEST_PATH}/otbOBIATests1)
# Tests involving PostGIS interface
SET(OBIA_TESTS2 ${CXX_TEST_PATH}/otbOBIATests2) SET(OBIA_TESTS2 ${CXX_TEST_PATH}/otbOBIATests2)
# Tests involving learning
SET(OBIA_TESTS3 ${CXX_TEST_PATH}/otbOBIATests3)
# OBIATests1 # OBIATests1
ADD_TEST(obTuAttributesMapLabelObjectNew ${OBIA_TESTS1} ADD_TEST(obTuAttributesMapLabelObjectNew ${OBIA_TESTS1}
otbAttributesMapLabelObjectNew) otbAttributesMapLabelObjectNew)
...@@ -160,6 +161,18 @@ ADD_TEST(obTvLabelMapToGISTableFilter ${OBIA_TESTS2} ...@@ -160,6 +161,18 @@ ADD_TEST(obTvLabelMapToGISTableFilter ${OBIA_TESTS2}
Bidfeud0) Bidfeud0)
ENDIF(OTB_USE_PQXX) ENDIF(OTB_USE_PQXX)
# OBIATests3 (need Learning)
ADD_TEST(obTuLabelMapSVMClassifierNew ${OBIA_TESTS3}
otbLabelMapSVMClassifierNew)
ADD_TEST(obTvLabelMapSVMClassifier ${OBIA_TESTS3}
otbLabelMapSVMClassifier
${INPUTDATA}/maur.tif
${INPUTDATA}/maur_labelled.tif
${TEMP}/obTvLabelMapSVMClassifierLabeledOutput.tif)
SET(BasicOBIA_SRCS1 SET(BasicOBIA_SRCS1
otbAttributesMapLabelObjectNew.cxx otbAttributesMapLabelObjectNew.cxx
otbAttributesMapLabelObjectWithClassLabelNew.cxx otbAttributesMapLabelObjectWithClassLabelNew.cxx
...@@ -193,6 +206,10 @@ otbLabelMapToGISTableFilter.cxx ...@@ -193,6 +206,10 @@ otbLabelMapToGISTableFilter.cxx
) )
ENDIF(OTB_USE_PQXX) ENDIF(OTB_USE_PQXX)
SET(BasicOBIA_SRCS3
otbLabelMapSVMClassifier.cxx
)
ADD_EXECUTABLE(otbOBIATests1 otbOBIATests1.cxx ${BasicOBIA_SRCS1}) ADD_EXECUTABLE(otbOBIATests1 otbOBIATests1.cxx ${BasicOBIA_SRCS1})
TARGET_LINK_LIBRARIES(otbOBIATests1 OTBIO OTBOBIA OTBTesting) TARGET_LINK_LIBRARIES(otbOBIATests1 OTBIO OTBOBIA OTBTesting)
...@@ -201,4 +218,8 @@ ADD_EXECUTABLE(otbOBIATests2 otbOBIATests2.cxx ${BasicOBIA_SRCS2}) ...@@ -201,4 +218,8 @@ ADD_EXECUTABLE(otbOBIATests2 otbOBIATests2.cxx ${BasicOBIA_SRCS2})
TARGET_LINK_LIBRARIES(otbOBIATests2 OTBIO OTBOBIA OTBTesting OTBGeospatialAnalysis pq pqxx) TARGET_LINK_LIBRARIES(otbOBIATests2 OTBIO OTBOBIA OTBTesting OTBGeospatialAnalysis pq pqxx)
ENDIF(OTB_USE_PQXX) ENDIF(OTB_USE_PQXX)
ADD_EXECUTABLE(otbOBIATests3 otbOBIATests3.cxx ${BasicOBIA_SRCS3})
TARGET_LINK_LIBRARIES(otbOBIATests3 OTBIO OTBOBIA OTBLearning OTBTesting)
ENDIF( NOT OTB_DISABLE_CXX_TESTING AND BUILD_TESTING ) ENDIF( NOT OTB_DISABLE_CXX_TESTING AND BUILD_TESTING )
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "itkLabelImageToLabelMapFilter.h" #include "itkLabelImageToLabelMapFilter.h"
#include "otbImageToLabelMapWithAttributesFilter.h" #include "otbImageToLabelMapWithAttributesFilter.h"
#include "otbKMeansAttributesLabelMapFilter.h" #include "otbKMeansAttributesLabelMapFilter.h"
#include "otbShapeAttributesLabelMapFilter.h"
const unsigned int Dimension = 2; const unsigned int Dimension = 2;
typedef unsigned short LabelType; typedef unsigned short LabelType;
......
/*=========================================================================
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 "otbImageFileReader.h"
#include "otbImageFileWriter.h"
#include <fstream>
#include <iostream>
#include "otbImage.h"
#include "otbVectorImage.h"
#include "otbAttributesMapLabelObjectWithClassLabel.h"
#include "itkLabelImageToLabelMapFilter.h"
#include "otbShapeAttributesLabelMapFilter.h"
#include "otbRadiometricAttributesLabelMapFilter.h"
#include "otbLabelMapWithClassLabelToLabeledSampleListFilter.h"
#include "otbSVMSampleListModelEstimator.h"
#include "otbLabelMapSVMClassifier.h"
#include "otbLabelMapWithClassLabelToClassLabelImageFilter.h"
const unsigned int Dimension = 2;
typedef unsigned short LabelType;
typedef double PixelType;
typedef otb::AttributesMapLabelObjectWithClassLabel<LabelType, Dimension, double, LabelType> LabelObjectType;
typedef itk::LabelMap<LabelObjectType> LabelMapType;
typedef otb::VectorImage<PixelType, Dimension> VectorImageType;
typedef otb::Image<unsigned int,2> LabeledImageType;
typedef otb::ImageFileReader<VectorImageType> ReaderType;
typedef otb::ImageFileReader<LabeledImageType> LabeledReaderType;
typedef otb::ImageFileWriter<VectorImageType> WriterType;
typedef otb::ImageFileWriter<LabeledImageType> LabeledWriterType;
typedef itk::LabelImageToLabelMapFilter<LabeledImageType,LabelMapType> LabelMapFilterType;
typedef otb::ShapeAttributesLabelMapFilter<LabelMapType> ShapeFilterType;
typedef otb::RadiometricAttributesLabelMapFilter<LabelMapType,VectorImageType> RadiometricFilterType;
// SVM model estimation
typedef itk::VariableLengthVector<double> VectorType;
typedef itk::FixedArray<LabelType,1> TrainingVectorType;
typedef itk::Statistics::ListSample<VectorType> ListSampleType;
typedef itk::Statistics::ListSample<TrainingVectorType> TrainingListSampleType;
typedef otb::LabelMapWithClassLabelToLabeledSampleListFilter<LabelMapType,ListSampleType,TrainingListSampleType>
LabelMap2ListSampleFilterType;
typedef otb::Functor::VariableLengthVectorToMeasurementVectorFunctor<VectorType> MeasurementVectorFunctorType;
typedef otb::SVMSampleListModelEstimator<ListSampleType,TrainingListSampleType,
MeasurementVectorFunctorType> SVMEstimatorType;
typedef otb::LabelMapSVMClassifier<LabelMapType> ClassifierType;
typedef otb::LabelMapWithClassLabelToClassLabelImageFilter<LabelMapType,LabeledImageType> LabelMapWithClassLabelToClassLabelImageFilterType;
LabelObjectType::Pointer makeTrainingSample(LabelMapType* labelMap, LabelType labelObjectId, LabelType classLabel)
{
LabelObjectType::Pointer newLabelObject = LabelObjectType::New();
newLabelObject->CopyAllFrom( labelMap->GetLabelObject(labelObjectId) );
newLabelObject->SetClassLabel(classLabel);
return newLabelObject;
}
int otbLabelMapSVMClassifierNew(int argc, char * argv[])
{
ClassifierType::Pointer classifier = ClassifierType::New();
return EXIT_SUCCESS;
}
int otbLabelMapSVMClassifier(int argc, char * argv[])
{
const char * infname = argv[1];
const char * lfname = argv[2];
const char * outfname = argv[3];
// SmartPointer instanciation
ReaderType::Pointer reader = ReaderType::New();
LabeledReaderType::Pointer labeledReader = LabeledReaderType::New();
LabelMapFilterType::Pointer filter = LabelMapFilterType::New();
ShapeFilterType::Pointer shapeFilter = ShapeFilterType::New();
RadiometricFilterType::Pointer radiometricFilter = RadiometricFilterType::New();
ClassifierType::Pointer classifier = ClassifierType::New();
// Inputs
reader->SetFileName(infname);
labeledReader->SetFileName(lfname);
// Filter
filter->SetInput(labeledReader->GetOutput());
filter->SetBackgroundValue(itk::NumericTraits<LabelType>::max());
shapeFilter->SetInput(filter->GetOutput());
radiometricFilter->SetInput(shapeFilter->GetOutput());
radiometricFilter->SetFeatureImage(reader->GetOutput());
radiometricFilter->Update();
// Build training samples
LabelMapType::Pointer labelMap = radiometricFilter->GetOutput();
LabelMapType::Pointer trainingLabelMap = LabelMapType::New();
// The following is specific to the input specified in CMakeLists
// water
trainingLabelMap->PushLabelObject(makeTrainingSample(labelMap, 13, 0));
// road
trainingLabelMap->PushLabelObject(makeTrainingSample(labelMap, 88, 1));
trainingLabelMap->PushLabelObject(makeTrainingSample(labelMap, 114, 1));
trainingLabelMap->PushLabelObject(makeTrainingSample(labelMap, 144, 1));
// boat
trainingLabelMap->PushLabelObject(makeTrainingSample(labelMap, 52, 2));
trainingLabelMap->PushLabelObject(makeTrainingSample(labelMap, 31, 2));
trainingLabelMap->PushLabelObject(makeTrainingSample(labelMap, 11, 2));
// roof
trainingLabelMap->PushLabelObject(makeTrainingSample(labelMap, 58, 3));
trainingLabelMap->PushLabelObject(makeTrainingSample(labelMap, 60, 3));
trainingLabelMap->PushLabelObject(makeTrainingSample(labelMap, 27, 3));
trainingLabelMap->PushLabelObject(makeTrainingSample(labelMap, 81, 3));
// vegetation
trainingLabelMap->PushLabelObject(makeTrainingSample(labelMap, 161, 4));
trainingLabelMap->PushLabelObject(makeTrainingSample(labelMap, 46, 4));
LabelMap2ListSampleFilterType::Pointer labelMap2SampleList = LabelMap2ListSampleFilterType::New();
labelMap2SampleList->SetInputLabelMap(trainingLabelMap);
std::vector<std::string> attributes = labelMap->GetLabelObject(0)->GetAvailableAttributes();
std::vector<std::string>::const_iterator attrIt;
for (attrIt = attributes.begin(); attrIt != attributes.end(); ++attrIt)
{
labelMap2SampleList->GetMeasurementFunctor().AddAttribute((*attrIt).c_str());
}
labelMap2SampleList->Update();
SVMEstimatorType::Pointer svmEstim = SVMEstimatorType::New();
svmEstim->SetInputSampleList(labelMap2SampleList->GetOutputSampleList());
svmEstim->SetTrainingSampleList(labelMap2SampleList->GetOutputTrainingSampleList());
svmEstim->SetNumberOfClasses(5);
svmEstim->Modified();
svmEstim->Update();
classifier->SetInput(labelMap);
classifier->SetModel(svmEstim->GetModel());
for (attrIt = attributes.begin(); attrIt != attributes.end(); ++attrIt)
{
classifier->GetMeasurementFunctor().AddAttribute((*attrIt).c_str());
}
classifier->Update();
LabelMapWithClassLabelToClassLabelImageFilterType::Pointer imGenerator = LabelMapWithClassLabelToClassLabelImageFilterType::New();
imGenerator->SetInput(classifier->GetOutput());
LabeledWriterType::Pointer writer = LabeledWriterType::New();
writer->SetInput(imGenerator->GetOutput());
writer->SetFileName(outfname);
writer->Update();
return EXIT_SUCCESS;
}
/*=========================================================================
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.
=========================================================================*/
// this file defines the otbCommonTest for the test driver
// and all it expects is that you have a function called RegisterTests
#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
//
#include "otbTestMain.h"
void RegisterTests()
{
REGISTER_TEST(otbLabelMapSVMClassifierNew);
REGISTER_TEST(otbLabelMapSVMClassifier);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment