TePDIMixModel_test.cpp

Shows how to use this class.

00001 #define TEAGN_ENABLE_STDOUT_LOG
00002 
00003 #include <TePDIExamplesBase.hpp>
00004 
00005 #include <vector>
00006 
00007 #include <TeInitRasterDecoders.h>
00008 #include <TeProgress.h>
00009 #include <TeStdIOProgress.h>
00010 #include <TeRasterParams.h>
00011 #include <TePDITypes.hpp>
00012 #include <TePDIParameters.hpp>
00013 #include <TeAgnostic.h>
00014 #include <TePDIUtils.hpp>
00015 #include <TeRasterParams.h>
00016 #include <TePDIMixModel.hpp>
00017 #include <TePDIMixModelComponentList.hpp>
00018 #include <TePDIMixModelSpectralBandList.hpp>
00019 
00020 void PrincoMixModel_test()
00021 {
00022   #define componentsNumber 3
00023   #define spectralBandsNumber 3
00024 
00025   TePDIParameters params;
00026 
00027 // ----- Setting spectralbands e components -----
00028   TePDIMixModelComponentList componentList;
00029   componentList.insertComponent(0, "nuvem");
00030   componentList.insertPixel(0, 0, 1.000);
00031   componentList.insertPixel(0, 1, 0.725);
00032   componentList.insertPixel(0, 2, 1.000);
00033   
00034   componentList.insertComponent(1, "vegetacao");
00035   componentList.insertPixel(1, 0, 0.392);
00036   componentList.insertPixel(1, 1, 0.251);
00037   componentList.insertPixel(1, 2, 0.604);
00038   
00039   componentList.insertComponent(2, "sombra");
00040   componentList.insertPixel(2, 0, 0.165);
00041   componentList.insertPixel(2, 1, 0.098);
00042   componentList.insertPixel(2, 2, 0.196);
00043   
00044   TePDIMixModelSpectralBandList spectralBandList;
00045   spectralBandList.insertSpectralBand(TePDIMixModelSpectralBand(250, 2, 0.450000, 0.520000, "CBERS2_CCD_BLUE"));
00046   spectralBandList.insertSpectralBand(TePDIMixModelSpectralBand(250, 3, 0.520000, 0.590000, "CBERS2_CCD_GREEN"));
00047   spectralBandList.insertSpectralBand(TePDIMixModelSpectralBand(250, 4, 0.630000, 0.690000, "CBERS2_CCD_RED"));
00048 
00049 // Setting input rasters parameter
00050   TePDITypes::TePDIRasterVectorType input_rasters;
00051   
00052   TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
00053     std::string(TEPDIEXAMPLESRESPATH "cbers_rgb342_crop1.tif" ), 'r'));
00054   TEAGN_TRUE_OR_THROW(inRaster->init(), "Unable to init input_raster" );
00055   
00056   for(unsigned int i = 0; i < spectralBandsNumber; i++)
00057   {
00058     input_rasters.push_back(inRaster);
00059   }
00060   
00061 // Setting number of bands in each input raster
00062   std::vector<int> bands;
00063   bands.push_back(0);
00064   bands.push_back(1);
00065   bands.push_back(2);
00066 
00067 // Setting output rasters parameter
00068   TePDITypes::TePDIRasterVectorType output_rasters;
00069   for(unsigned int i = 0; i < componentsNumber; i++)
00070   {
00071     TePDITypes::TePDIRasterPtrType outRaster;
00072     TEAGN_TRUE_OR_THROW(TePDIUtils::TeAllocRAMRaster(outRaster, 1, 1, 1, false, TeDOUBLE, 0), "RAM raster " + Te2String(i+1) + " alloc error" );
00073     output_rasters.push_back(outRaster);
00074   }
00075 
00076   int  computeErrorRasters = 1,
00077     computeAverageError = 1,
00078     normalize = 0;
00079 
00080 // Setting the parameters created before
00081   params.SetParameter("mixmodel_type", string("princo"));
00082   params.SetParameter("component_list", componentList);
00083   params.SetParameter("spectral_band_list", spectralBandList);
00084   params.SetParameter("input_rasters", input_rasters);
00085   params.SetParameter("bands", bands);
00086   params.SetParameter("output_rasters", output_rasters);
00087   params.SetParameter("compute_error_rasters", computeErrorRasters);
00088   params.SetParameter("compute_average_error", computeAverageError);
00089   params.SetParameter("normalize", normalize);
00090 
00091 // Checking if it's necessary to create error rasters
00092   if (computeErrorRasters)
00093   {
00094     TePDITypes::TePDIRasterVectorType output_error_rasters;
00095     for(unsigned int i = 0; i < componentsNumber; i++)
00096     {
00097       TePDITypes::TePDIRasterPtrType outRaster;
00098       TEAGN_TRUE_OR_THROW(TePDIUtils::TeAllocRAMRaster(outRaster, 1, 1, 1, false, TeDOUBLE, 0), "RAM error raster " + Te2String(i+1) + " alloc error" );
00099       output_error_rasters.push_back(outRaster);
00100     }
00101     params.SetParameter("output_error_rasters", output_error_rasters);
00102   }
00103 
00104 // Checking if it's necessary to create average error double
00105   double averageError = 0.0;
00106   if (computeAverageError)
00107     params.SetParameter("average_error", averageError);
00108 
00109 // Making the algorithm and calling its execution
00110   TePDIMixModel mixmodel;
00111   TEAGN_TRUE_OR_THROW(mixmodel.Reset(params), "Reset failed");
00112   TEAGN_TRUE_OR_THROW(mixmodel.Apply(), "Apply error");
00113 
00114 // Write output rasters in disk
00115   TEAGN_TRUE_OR_THROW(params.GetParameter("output_rasters", output_rasters), "Unable to retrive generated images");
00116   TEAGN_TRUE_OR_THROW(output_rasters.size() == componentsNumber, "Invalid output rasters number");
00117   for(unsigned int i = 0; i < componentsNumber; i++)
00118     TEAGN_TRUE_OR_THROW(TePDIUtils::TeRaster2Geotiff(output_rasters[i], TEPDIEXAMPLESBINPATH "TePDIPrincoMixModel" + Te2String(i+1) + ".tif"), "GeoTIFF " + Te2String(i+1) + " generation error");
00119 
00120 // Write a color composite raster in disk  
00121   TeRasterParams base_raster_params = input_rasters[0]->params();
00122   base_raster_params.nBands( componentsNumber );
00123   base_raster_params.setDataType( TeDOUBLE, -1 );
00124   TePDITypes::TePDIRasterPtrType outRaster;
00125   TEAGN_TRUE_OR_THROW(TePDIUtils::TeAllocRAMRaster(outRaster, 
00126     base_raster_params, false ),
00127     "RAM Color Raster Alloc error" );
00128   for(int k = 0; k < componentsNumber; k++)
00129     for (int i = 0; i < base_raster_params.nlines_; i++)
00130       for (int j = 0; j < base_raster_params.ncols_; j++)
00131       {
00132         double p;
00133         output_rasters[k]->getElement(j, i, p);
00134         outRaster->setElement(j, i, p, k);
00135       }
00136   TEAGN_TRUE_OR_THROW(TePDIUtils::TeRaster2Geotiff(outRaster, TEPDIEXAMPLESBINPATH "TePDIPrincoMixModelCOLOR.tif"), "GeoTIFF Color generation error");
00137 
00138 // Write output error rasters in disk
00139   params.GetParameter("compute_error_rasters", computeErrorRasters);
00140   if (computeErrorRasters)
00141   {
00142     TePDITypes::TePDIRasterVectorType output_error_rasters;
00143     TEAGN_TRUE_OR_THROW(params.GetParameter("output_error_rasters", output_error_rasters), "Unable to retrive generated error rasters");
00144     TEAGN_TRUE_OR_THROW(output_error_rasters.size() == componentsNumber, "Invalid output error rasters number");
00145     for(unsigned int i = 0; i < componentsNumber; i++)
00146       TEAGN_TRUE_OR_THROW(TePDIUtils::TeRaster2Geotiff(output_error_rasters[i], TEPDIEXAMPLESBINPATH "TePDIPrincoMixModelError" + Te2String(i+1) + ".tif"), "GeoTIFF error " + Te2String(i+1) + " generation error");
00147   }
00148 
00149 // Parameter don't come back after the algorithm execution
00150   params.GetParameter("compute_average_error", computeAverageError);
00151   if (computeAverageError)
00152   {
00153     TEAGN_TRUE_OR_THROW(params.GetParameter("average_error", averageError), "Unable to retrive average error");
00154     //cout << "Average Erro = " << averageError << endl;
00155   }
00156 
00157 }
00158 
00159 int main()
00160 {
00161   TEAGN_LOGMSG("Test started.");
00162   
00163   try
00164   {
00165     TeInitRasterDecoders();
00166     
00167     TeStdIOProgress pi;
00168     TeProgress::setProgressInterf(dynamic_cast< TeProgressBase* >(&pi));
00169     
00170     PrincoMixModel_test();
00171   }
00172   catch( const TeException& e ){
00173     TEAGN_LOGERR( "Test Failed - " + e.message() );
00174     return EXIT_FAILURE;
00175   } 
00176   
00177   TEAGN_LOGMSG("Test OK.");
00178   return EXIT_SUCCESS;
00179 }
00180 

Generated on Sun Jul 29 04:01:03 2012 for TerraLib - Development Source by  doxygen 1.5.3