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
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
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
00062 std::vector<int> bands;
00063 bands.push_back(0);
00064 bands.push_back(1);
00065 bands.push_back(2);
00066
00067
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
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
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
00105 double averageError = 0.0;
00106 if (computeAverageError)
00107 params.SetParameter("average_error", averageError);
00108
00109
00110 TePDIMixModel mixmodel;
00111 TEAGN_TRUE_OR_THROW(mixmodel.Reset(params), "Reset failed");
00112 TEAGN_TRUE_OR_THROW(mixmodel.Apply(), "Apply error");
00113
00114
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
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
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
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
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