Main Page | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages | Examples

vetFilterNoiseChannel.cpp

Go to the documentation of this file.
00001 
00016 #include "vetFilterNoiseChannel.h"
00017 
00018 #include <time.h>       // time()
00019 #include <stdlib.h>     // rand()
00020 
00021 
00026 vetFilterNoiseChannel::vetFilterNoiseChannel(vetFilterNoiseChannelParameters* initParams) : vetFilter()
00027  {
00028         INFO("vetFilterNoiseChannel::vetFilterNoiseChannel(..* initParams) : vetFilter() [CONTRUCTOR]")
00029 
00030         zeroRGB[0] = 0;
00031         zeroRGB[1] = 0;
00032         zeroRGB[2] = 0;
00033 
00034         oneRGB[0] = 1;
00035         oneRGB[1] = 1;
00036         oneRGB[2] = 1;
00037 
00038         zeroChar = '0';
00039         oneChar = '1';
00040 
00041         setParameters(initParams);
00042         reset();
00043 
00044         setName("Noise Channel Simulator Filter");
00045         setDescription("Additive noise or others..");
00046         setVersion(1.0);
00047 
00048   }
00049 
00053 vetFilterNoiseChannel::~vetFilterNoiseChannel()
00054  {
00055         INFO("vetFilterNoiseChannel::~vetFilterNoiseChannel() [DESTRUCTOR]")
00056 
00057         if (myParams != NULL)
00058                 delete myParams;//BUG
00059         myParams = NULL;
00060 
00061  }
00062 
00072 VETRESULT vetFilterNoiseChannel::setParameters (vetFilterNoiseChannelParameters* initParams)
00073  {
00074         if ( initParams == NULL )
00075                 myParams = new vetFilterNoiseChannelParameters();
00076         else
00077                 myParams = initParams;
00078 
00079         allocateBuffer(myParams->currentBuffer);
00080 
00081         return VETRET_OK;
00082  }
00083 
00089 VETRESULT vetFilterNoiseChannel::reset()
00090  {
00091         INFO("VETRESULT vetFilterNoiseChannel::reset() [SET DEFAULT PARAMETERS]")
00092 
00093         releaseBuffers();
00094 
00095         if (myParams != NULL)
00096          {
00097                 myParams->reset();
00098                 allocateBuffer(myParams->currentBuffer);
00099          }
00100         else
00101                 setParameters(NULL);
00102 
00103         resetNoiseSource();
00104         externalSource = NULL;
00105 
00106         return VETRET_OK;
00107  }
00108 
00109 
00110 
00111 void vetFilterNoiseChannel::generateNoise(vetFrameYUV420& img, unsigned char zero)
00112  {
00113         unsigned int size = img.getBufferSize();
00114         unsigned int perc = (unsigned int)( (float)size * myParams->spread);
00115         int noiseco = 0;
00116         int norm = myParams->normalize_value;
00117 
00118         for ( unsigned int i = 0; i < size; i++ )
00119                 img.data[i] = zero;
00120 
00121         if ( myParams->normalized )
00122          {
00123                 for ( unsigned int i = 0; i < perc; i++ )
00124                  {
00125                         img.data[ noiseco = rand()*rand() % size ] = rand() % norm;
00126                  }
00127          }
00128         else
00129          {
00130                 for ( unsigned int i = 0; i < perc; i++ )
00131                  {
00132                         img.data[ rand()*rand() % size ] = (unsigned char)rand();
00133                  }
00134          }
00135  }
00136 
00137 void vetFilterNoiseChannel::generateNoise(vetFrameRGB24& img,  PixelRGB24 zero)
00138  {
00139         unsigned int size = img.getBufferSize();
00140         unsigned int perc = (unsigned int)( (float)size * myParams->spread);
00141         unsigned int noiseco = 0;
00142         int norm = myParams->normalize_value;
00143 
00144         for ( unsigned int i = 0; i < size; i++ )
00145                 img.data[i] = zero;
00146 
00147         if ( myParams->normalized )
00148          {
00149                 for ( unsigned int i = 0; i < perc; i++ )
00150                  {
00151                         noiseco = rand()*rand() % size;
00152                         img.data[noiseco][0] = (unsigned char)( rand() % norm);
00153                         noiseco = rand()*rand() % size;
00154                         img.data[noiseco][1] = (unsigned char)( rand() % norm);
00155                         noiseco = rand()*rand() % size;
00156                         img.data[noiseco][2] = (unsigned char)( rand() % norm);
00157                  }
00158          }
00159         else
00160          {
00161                 for ( unsigned int i = 0; i < perc; i++ )
00162                  {
00163                         noiseco = rand()*rand() % size;
00164                         img.data[noiseco][0] = (unsigned char)rand();
00165                         noiseco = rand()*rand() % size;
00166                         img.data[noiseco][1] = (unsigned char)rand();
00167                         noiseco = rand()*rand() % size;
00168                         img.data[noiseco][2] = (unsigned char)rand();
00169                  }
00170          }
00171  }
00172 
00173 void vetFilterNoiseChannel::generateNoise(vetFrameT<unsigned char>& img, unsigned char zero)
00174  {
00175         unsigned int size = img.getBufferSize();
00176         unsigned int perc = (unsigned int)( (float)size * myParams->spread);
00177         int noiseco = 0;
00178         int norm = myParams->normalize_value;
00179 
00180         for ( unsigned int i = 0; i < size; i++ )
00181                 img.data[i] = zero;
00182 
00183         if ( myParams->normalized )
00184          {
00185                 for ( unsigned int i = 0; i < perc; i++ )
00186                  {
00187                         img.data[ noiseco = rand()*rand() % size ] = rand() % norm;
00188                  }
00189          }
00190         else
00191          {
00192                 for ( unsigned int i = 0; i < perc; i++ )
00193                  {
00194                         img.data[ rand()*rand() % size ] = rand();
00195                  }
00196          }
00197  }
00198 
00199 
00200 VETRESULT vetFilterNoiseChannel::AddNoise(vetFrameYUV420& img)
00201  {
00202         INFO("VETRESULT vetFilterNoiseChannel::AddNoise(vetFrameYUV420& img)")
00203 
00204         if ( !isBufferYUV() )
00205          {
00206                 useBufferYUV(img.width, img.height);
00207                 //ret = VETRET_OK_DEPRECATED;
00208          }
00209 
00210         if ( externalSource == NULL )
00211                 generateNoise(*bufferYUV,  zeroChar);
00212         else
00213                 *externalSource >> *bufferYUV;
00214 
00215         *bufferYUV += img;
00216 
00217         return VETRET_OK;
00218  }
00219 
00220 
00221 VETRESULT vetFilterNoiseChannel::AddNoise(vetFrameRGB24& img)
00222  {
00223         INFO("VETRESULT vetFilterNoiseChannel::AddNoise(vetFrameRGB24& img)")
00224 
00225         if ( !isBufferRGB() )
00226          {
00227                 useBufferRGB(img.width, img.height);
00228                 //ret = VETRET_OK_DEPRECATED;
00229          }
00230 
00231         if ( externalSource == NULL )
00232                 generateNoise(*bufferRGB,  zeroRGB);
00233         else
00234                 *externalSource >> *bufferRGB;
00235 
00236         *bufferRGB += img;
00237 
00238         return VETRET_OK;
00239  }
00240 
00241 
00242 VETRESULT vetFilterNoiseChannel::AddNoise(vetFrameT<unsigned char>& img)
00243  {
00244         INFO("VETRESULT vetFilterNoiseChannel::AddNoise(vetFrameT<unsigned char>& img)")
00245 
00246         if ( !isBufferTuC() )
00247          {
00248                 useBufferTuC(img.width, img.height, img.profile);
00249                 //ret = VETRET_OK_DEPRECATED;
00250          }
00251 
00252         if ( externalSource == NULL )
00253                 generateNoise(*bufferTuC,  zeroChar);
00254         else
00255                 *externalSource >> *bufferTuC;
00256 
00257         *bufferTuC += img;
00258 
00259         return VETRET_OK;
00260  }
00261 
00262 VETRESULT vetFilterNoiseChannel::MultiplyNoise(vetFrameYUV420& img)
00263  {
00264         INFO("VETRESULT vetFilterNoiseChannel::MultiplyNoise(vetFrameYUV420& img)")
00265 
00266         if ( !isBufferYUV() )
00267          {
00268                 useBufferYUV(img.width, img.height);
00269                 //ret = VETRET_OK_DEPRECATED;
00270          }
00271 
00272         if ( externalSource == NULL )
00273                 generateNoise(*bufferYUV,  oneChar);
00274         else
00275                 *externalSource >> *bufferYUV;
00276 
00277         *bufferYUV *= img;
00278 
00279         return VETRET_OK;
00280  }
00281 
00282 
00283 VETRESULT vetFilterNoiseChannel::MultiplyNoise(vetFrameRGB24& img)
00284  {
00285         INFO("VETRESULT vetFilterNoiseChannel::MultiplyNoise(vetFrameRGB24& img)")
00286 
00287         if ( !isBufferRGB() )
00288          {
00289                 useBufferRGB(img.width, img.height);
00290                 //ret = VETRET_OK_DEPRECATED;
00291          }
00292 
00293         if ( externalSource == NULL )
00294                 generateNoise(*bufferRGB,  oneRGB);
00295         else
00296                 *externalSource >> *bufferRGB;
00297 
00298 //BUG BUG BUG BUG BUG BUG
00299 //      *bufferRGB *= img;
00300 
00301         return VETRET_OK;
00302  }
00303 
00304 VETRESULT vetFilterNoiseChannel::MultiplyNoise(vetFrameT<unsigned char>& img)
00305  {
00306         INFO("VETRESULT vetFilterNoiseChannel::MultiplyNoise(vetFrameT<unsigned char>& img)")
00307 
00308         if ( !isBufferTuC() )
00309          {
00310                 useBufferTuC(img.width, img.height, img.profile);
00311                 //ret = VETRET_OK_DEPRECATED;
00312          }
00313 
00314         if ( externalSource == NULL )
00315                 generateNoise(*bufferTuC,  oneChar);
00316         else
00317                 *externalSource >> *bufferTuC;
00318 
00319 //BUG
00320 //*bufferTuC *= img;
00321 
00322         return VETRET_OK;
00323  }
00324 
00325 
00326 
00327 void vetFilterNoiseChannel::resetNoiseSource()
00328  {
00329         INFO("void vetFilterNoiseChannel::resetNoiseSource()")
00330 
00331         // initialise random sunber generator
00332         time_t t;
00333         srand((unsigned) time(&t));
00334 
00335  }
00336 
00337 VETRESULT vetFilterNoiseChannel::setNoiseSource(vetInput& frameSource)
00338  {
00339         DEBUGMSG("VETRESULT vetFilterNoiseChannel::setNoiseSource(vetInput& frameSource)", &frameSource)
00340 
00341         externalSource = &frameSource;
00342 
00343         return VETRET_OK;
00344  }
00345 
00346 
00347 
00348 
00349 
00350 
00361 VETRESULT vetFilterNoiseChannel::importFrom(vetFrameYUV420& img)
00362  {
00363         INFO("VETRESULT vetFilterNoiseChannel::importFrom(vetFrameYUV420& img) [reading data]")
00364 
00365         if ( myParams->operation == vetFilterNoiseChannelParameters::ADDITIVE )
00366                 AddNoise(img);
00367         else if ( myParams->operation == vetFilterNoiseChannelParameters::MULTIPLICATIVE )
00368                 MultiplyNoise(img);
00369 
00370         return VETRET_OK;
00371  }
00372 
00383 VETRESULT vetFilterNoiseChannel::importFrom(vetFrameRGB24& img)
00384  {
00385         INFO("VETRESULT vetFilterNoiseChannel::importFrom(vetFrameYUV420& img) [reading data]")
00386 
00387         if ( myParams->operation == vetFilterNoiseChannelParameters::ADDITIVE )
00388                 AddNoise(img);
00389         else if ( myParams->operation == vetFilterNoiseChannelParameters::MULTIPLICATIVE )
00390                 MultiplyNoise(img);
00391 
00392         return VETRET_OK;
00393  }
00394 
00405 VETRESULT vetFilterNoiseChannel::importFrom(vetFrameT<unsigned char>& img)
00406  {
00407         INFO("VETRESULT vetFilterNoiseChannel::importFrom(vetFrameT<unsigned char>& img) [reading data]")
00408 
00409         if ( myParams->operation == vetFilterNoiseChannelParameters::ADDITIVE )
00410                 AddNoise(img);
00411         else if ( myParams->operation == vetFilterNoiseChannelParameters::MULTIPLICATIVE )
00412                 MultiplyNoise(img);
00413 
00414         return VETRET_OK;
00415  }
00416 
00417 
00418 
00419 
00420 
00421 
00422 
00423 vetFilterNoiseChannelParameters::vetFilterNoiseChannelParameters(NOISEOPER mode)
00424  {
00425         reset();
00426         operation = mode;
00427  }
00428 
00429 void vetFilterNoiseChannelParameters::reset()
00430  {
00431         operation = vetFilterNoiseChannelParameters::ADDITIVE;
00432         normalized = false;
00433         normalize_value = 255;
00434         spread = 1.;
00435         currentBuffer = vetFilterParameters::NONE;
00436  }
00437 
00438 
00439 
00440 int vetFilterNoiseChannelParameters::saveToStreamXML(FILE *fp)
00441  {
00442 
00443         if ( fp == NULL )
00444                 return VETRET_PARAM_ERR;
00445 
00446         if( fprintf(fp, "<vetFilterNoiseChannelParameters>\n") == EOF )
00447                 return VETRET_INTERNAL_ERR;
00448 
00449         if ( fprintf(fp, "  <operation value=\"%i\" />\n", (int)operation) == EOF)
00450                 return VETRET_INTERNAL_ERR;
00451 
00452         if ( fprintf(fp, "  <spread value=\"%f\" />\n", spread) == EOF)
00453                 return VETRET_INTERNAL_ERR;
00454 
00455         if ( fprintf(fp, "  <normalized enabled=\"%u\" value=\"%u\" />\n", (int)normalized, normalize_value) == EOF)
00456                 return VETRET_INTERNAL_ERR;
00457 
00458         if ( fprintf(fp, "  <internalBufferType value=\"%u\" />\n", (int)currentBuffer) == EOF)
00459                 return VETRET_INTERNAL_ERR;
00460 
00461         if( fprintf(fp, "</vetFilterNoiseChannelParameters>\n") == EOF )
00462                 return VETRET_INTERNAL_ERR;
00463 
00464         return VETRET_OK;
00465  }
00466 
00467 
00468 
00469 int vetFilterNoiseChannelParameters::loadFromStreamXML(FILE *fp)
00470  {
00471         if ( fscanf(fp, "<vetFilterNoiseChannelParameters>\n") == EOF )
00472                 throw "error in XML file, unable to import data.";
00473 
00474         int runTmp = 0;
00475         if ( fscanf(fp, "  <operation value=\"%i\" />\n", &runTmp) == EOF )
00476                 throw "error in XML file, unable to import data.";
00477         else
00478                 operation = (NOISEOPER)runTmp;
00479 
00480         if ( fscanf(fp, "  <spread value=\"%f\" />\n", &spread) == EOF )
00481                 throw "error in XML file, unable to import data.";
00482 
00483         int boolTmp = 0;
00484         if ( fscanf(fp, "  <normalized enabled=\"%u\" value=\"%u\" />\n", &boolTmp, &normalize_value) == EOF )
00485                 throw "error in XML file, unable to import data.";
00486 
00487         if (boolTmp == 0)
00488                 normalized = false;
00489         else
00490                 normalized = true;
00491 
00492         int cB = (int)currentBuffer;
00493         if ( fscanf(fp, "  <internalBufferType value=\"%u\" />\n", &cB) == EOF )
00494                 throw "error in XML file, unable to import data.";
00495 
00496         return VETRET_OK;
00497  }
00498 

Generated on Tue Jan 24 11:59:02 2006 for VETLib by  doxygen 1.4.4