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

vetDigitalFilter.cpp

Go to the documentation of this file.
00001 
00018 #include "vetDigitalFilter.h"
00019 
00020 
00027 vetDigitalFilter::vetDigitalFilter(vetDigitalFilterParameters* initParams) : vetFilter()
00028  {
00029         setParameters(initParams);
00030         reset();
00031 
00032         setName("Digital Filter");
00033         setDescription("Lowpass, gaussian, highpass....");
00034         setVersion(1.0);
00035  }
00036 
00037 
00041 vetDigitalFilter::~vetDigitalFilter()
00042  {
00043         if (myParams != NULL)
00044                 delete myParams;
00045         myParams = NULL;
00046 
00047  }
00048 
00049 
00050 VETRESULT vetDigitalFilter::reset()
00051  {
00052         INFO("VETRESULT vetDigitalFilter::reset() [SET DEFAULT PARAMETERS]")
00053 
00054         releaseBuffers();
00055 
00056         if (myParams != NULL)
00057          {
00058                 myParams->reset();
00059                 allocateBuffer(myParams->currentBuffer);
00060          }
00061         else
00062                 setParameters(NULL);
00063 
00064         return VETRET_OK;
00065  }
00066 
00067 
00068 
00069 VETRESULT vetDigitalFilter::setParameters (vetDigitalFilterParameters* initParams)
00070  {
00071 
00072         if ( initParams == NULL )
00073                 myParams = new vetDigitalFilterParameters();
00074         else
00075                 myParams = initParams;
00076 
00077         allocateBuffer(myParams->currentBuffer);
00078 
00079         return VETRET_OK;
00080  }
00081 
00082 
00083 VETRESULT vetDigitalFilter::setDefaultKernel(int index)
00084  {
00085 
00086         if (myParams->currentKernel != NULL)
00087                 delete myParams->currentKernel;
00088 
00089         myParams->currentKernel  = vetDFMatrix::createKernel_3x3(index);
00090 
00091         return VETRET_OK;
00092 
00093  }
00094 
00095 
00096 
00098 
00099 
00100 
00101 
00102 VETRESULT vetDigitalFilter::importFrom(vetFrameYUV420& img)
00103  {
00104         DEBUGMSG("VETRESULT vetDigitalFilter::importFrom(vetFrameYUV420& img) [reading data]", myParams->runMode)
00105 
00106         int ret = VETRET_OK;
00107 
00108         if ( !isBufferYUV() )
00109          {
00110                 useBufferYUV(img.width, img.height);
00111                 ret = VETRET_OK_DEPRECATED;
00112          }
00113 
00114         if (myParams->currentKernel == NULL)
00115          {
00116                 *bufferYUV = img;
00117                 return ret;
00118          }
00119         else
00120                 ret += doProcessing(img, *bufferYUV, *myParams->currentKernel, myParams->clampNegative);
00121 
00122         return ret;
00123  }
00124 
00125 VETRESULT vetDigitalFilter::importFrom(vetFrameRGB24& img)
00126  {
00127         DEBUGMSG("VETRESULT vetDigitalFilter::importFrom(vetFrameYUV420& img) [reading data]", myParams->runMode)
00128 
00129         int ret = VETRET_OK;
00130 
00131         if ( !isBufferRGB() )
00132          {
00133                 useBufferRGB(img.width, img.height);
00134                 ret = VETRET_OK_DEPRECATED;
00135          }
00136 
00137         if (myParams->currentKernel == NULL)
00138          {
00139                 *bufferRGB = img;
00140                 return ret;
00141          }
00142         else
00143                 ret += doProcessing(img, *bufferRGB, *myParams->currentKernel, myParams->clampNegative);
00144 
00145         return ret;
00146  }
00147 
00148 
00149 VETRESULT vetDigitalFilter::importFrom(vetFrameT<unsigned char>& img)
00150  {
00151         DEBUGMSG("VETRESULT vetDigitalFilter::importFrom(vetFrameT& img) [reading data]", myParams->runMode)
00152 
00153         return VETRET_NOT_IMPLEMENTED;
00154  }
00155 
00156 
00157 
00158 
00159 
00160 
00164 
00165 
00166 
00167 VETRESULT vetDigitalFilter::doProcessing(vetFrameRGB24& source, vetFrameRGB24& dest, vetDFMatrix& kernel, bool clamp)
00168  {
00169         if (source.width != dest.width || source.height != dest.height)
00170                 dest.reAllocCanvas(source.width, source.height);
00171 
00172         signed long numb;
00173         unsigned int src_w = source.width;
00174 
00175         if (kernel.getDim() == 3)
00176          {
00177           for(unsigned int x=0; x < src_w; x++)
00178            for(unsigned int y=0; y < source.height; y++)
00179                 {
00180                         if ( x && y && (x != src_w-1) && (y != source.height-1)) //3x3 matrix!
00181                          {
00182                            for(int ch=0; ch < 3; ch++)
00183                                 {
00184                                         numb = (long) ( (long) source.data[(y-1) * src_w + (x-1)][ch] * kernel[0] +
00185                                                                         (long) source.data[(y-1) * src_w +  x   ][ch] * kernel[1] +
00186                                                                         (long) source.data[(y-1) * src_w + (x+1)][ch] * kernel[2] +
00187                                                                         (long) source.data[ y    * src_w + (x-1)][ch] * kernel[3] +
00188                                                                         (long) source.data[ y    * src_w +  x   ][ch] * kernel[4] +
00189                                                                         (long) source.data[ y    * src_w + (x+1)][ch] * kernel[5] +
00190                                                                         (long) source.data[(y+1) * src_w + (x-1)][ch] * kernel[6] +
00191                                                                         (long) source.data[(y+1) * src_w +  x   ][ch] * kernel[7] +
00192                                                                         (long) source.data[(y+1) * src_w + (x+1)][ch] * kernel[8]       );
00193 
00194                                         if ( numb )
00195                                                 numb /= (long)kernel[9];//normalization
00196 
00197                                         dest.data[y * src_w + x][ch] = (unsigned char)numb;
00198                                  }
00199                          }
00200                         else
00201                          {
00202                                 dest.data[y * src_w + x][0] = source.data[y * src_w + x][0];
00203                                 dest.data[y * src_w + x][1] = source.data[y * src_w + x][1];
00204                                 dest.data[y * src_w + x][2] = source.data[y * src_w + x][2];
00205                          }
00206            }
00207          }
00208         else if (kernel.getDim() == 5)
00209          {
00210           for(unsigned int x=0; x < src_w; x++)
00211            for(unsigned int y=0; y < source.height; y++)
00212                 {
00213                         if ( (x-2) && (y-2) && (x != src_w-2) && (y != source.height-2)) //5x5 matrix!
00214                          {
00215                            for(int ch=0; ch < 3; ch++)
00216                                 {
00217                                  numb = (long) (
00218                                                                         (long) source.data[(y-2) * src_w + (x-2)][ch] * kernel[0] +
00219                                                                         (long) source.data[(y-2) * src_w + (x-1)][ch] * kernel[1] +
00220                                                                         (long) source.data[(y-2) * src_w +  x   ][ch] * kernel[2] +
00221                                                                         (long) source.data[(y-2) * src_w + (x+1)][ch] * kernel[3] +
00222                                                                         (long) source.data[(y-2) * src_w + (x+2)][ch] * kernel[4] +
00223                                                                         (long) source.data[(y-1) * src_w + (x-2)][ch] * kernel[5] +
00224                                                                         (long) source.data[(y-1) * src_w + (x-1)][ch] * kernel[6] +
00225                                                                         (long) source.data[(y-1) * src_w +  x   ][ch] * kernel[7] +
00226                                                                         (long) source.data[(y-1) * src_w + (x+1)][ch] * kernel[8] +
00227                                                                         (long) source.data[(y-1) * src_w + (x+2)][ch] * kernel[9] +
00228                                                                         (long) source.data[ y    * src_w + (x-2)][ch] * kernel[10] +
00229                                                                         (long) source.data[ y    * src_w + (x-1)][ch] * kernel[11] +
00230                                                                          (long) source.data[ y    * src_w +  x   ][ch] * kernel[12] +
00231                                                                         (long) source.data[ y    * src_w + (x+1)][ch] * kernel[13] +
00232                                                                         (long) source.data[ y    * src_w + (x+2)][ch] * kernel[14] +
00233                                                                         (long) source.data[(y+1) * src_w + (x-2)][ch] * kernel[15] +
00234                                                                         (long) source.data[(y+1) * src_w + (x-1)][ch] * kernel[16] +
00235                                                                         (long) source.data[(y+1) * src_w +  x   ][ch] * kernel[17] +
00236                                                                         (long) source.data[(y+1) * src_w + (x+1)][ch] * kernel[18] +
00237                                                                         (long) source.data[(y+1) * src_w + (x+2)][ch] * kernel[19] +
00238                                                                         (long) source.data[(y+2) * src_w + (x-2)][ch] * kernel[20] +
00239                                                                         (long) source.data[(y+2) * src_w + (x-1)][ch] * kernel[21] +
00240                                                                         (long) source.data[(y+2) * src_w +  x   ][ch] * kernel[22] +
00241                                                                         (long) source.data[(y+2) * src_w + (x+1)][ch] * kernel[23] +
00242                                                                         (long) source.data[(y+2) * src_w + (x+2)][ch] * kernel[24]      );
00243 
00244                                  if ( numb )
00245                                         numb /= (long)kernel[25];//normalization
00246 
00247                                  dest.data[y * src_w + x][ch] = (unsigned char)numb;
00248                                 }
00249                          }
00250                         else
00251                          {
00252                                 dest.data[y * src_w + x][0] = source.data[y * src_w + x][0];
00253                                 dest.data[y * src_w + x][1] = source.data[y * src_w + x][1];
00254                                 dest.data[y * src_w + x][2] = source.data[y * src_w + x][2];
00255                          }
00256            }
00257          }
00258         else if (kernel.getDim() == 7)
00259          {
00260                 for(unsigned int x=0; x < src_w; x++)
00261                    for(unsigned int y=0; y < source.height; y++)
00262                         {
00263                          if ( (x-3) && (y-3) && (x != src_w-3) && (y != source.height-3)) //7x7 matrix!
00264                           {
00265                            for(int ch=0; ch < 3; ch++)
00266                                 {
00267                                  numb = (long) (
00268                                                                         (long) source.data[(y-3) * src_w + (x-3)][ch] * kernel[0] +
00269                                                                         (long) source.data[(y-3) * src_w + (x-2)][ch] * kernel[1] +
00270                                                                         (long) source.data[(y-3) * src_w + (x-1)][ch] * kernel[2] +
00271                                                                         (long) source.data[(y-3) * src_w +  x   ][ch] * kernel[3] +
00272                                                                         (long) source.data[(y-3) * src_w + (x+1)][ch] * kernel[4] +
00273                                                                         (long) source.data[(y-3) * src_w + (x+2)][ch] * kernel[5] +
00274                                                                         (long) source.data[(y-3) * src_w + (x+3)][ch] * kernel[6] +
00275                                                                         (long) source.data[(y-2) * src_w + (x-3)][ch] * kernel[7] +
00276                                                                         (long) source.data[(y-2) * src_w + (x-2)][ch] * kernel[8] +
00277                                                                         (long) source.data[(y-2) * src_w + (x-1)][ch] * kernel[9] +
00278                                                                         (long) source.data[(y-2) * src_w +  x   ][ch] * kernel[10] +
00279                                                                         (long) source.data[(y-2) * src_w + (x+1)][ch] * kernel[11] +
00280                                                                         (long) source.data[(y-2) * src_w + (x+2)][ch] * kernel[12] +
00281                                                                         (long) source.data[(y-2) * src_w + (x+3)][ch] * kernel[13] +
00282                                                                         (long) source.data[(y-1) * src_w + (x-3)][ch] * kernel[14] +
00283                                                                         (long) source.data[(y-1) * src_w + (x-2)][ch] * kernel[15] +
00284                                                                         (long) source.data[(y-1) * src_w + (x-1)][ch] * kernel[16] +
00285                                                                         (long) source.data[(y-1) * src_w +  x   ][ch] * kernel[17] +
00286                                                                         (long) source.data[(y-1) * src_w + (x+1)][ch] * kernel[18] +
00287                                                                         (long) source.data[(y-1) * src_w + (x+2)][ch] * kernel[19] +
00288                                                                         (long) source.data[(y-1) * src_w + (x+3)][ch] * kernel[20] +
00289                                                                         (long) source.data[ y    * src_w + (x-3)][ch] * kernel[21] +
00290                                                                         (long) source.data[ y    * src_w + (x-2)][ch] * kernel[22] +
00291                                                                         (long) source.data[ y    * src_w + (x-1)][ch] * kernel[23] +
00292                                                                          (long) source.data[ y    * src_w +  x   ][ch] * kernel[24] +
00293                                                                         (long) source.data[ y    * src_w + (x+1)][ch] * kernel[25] +
00294                                                                         (long) source.data[ y    * src_w + (x+2)][ch] * kernel[26] +
00295                                                                         (long) source.data[ y    * src_w + (x+3)][ch] * kernel[27] +
00296                                                                         (long) source.data[(y+1) * src_w + (x-3)][ch] * kernel[28] +
00297                                                                         (long) source.data[(y+1) * src_w + (x-2)][ch] * kernel[29] +
00298                                                                         (long) source.data[(y+1) * src_w + (x-1)][ch] * kernel[30] +
00299                                                                         (long) source.data[(y+1) * src_w +  x   ][ch] * kernel[31] +
00300                                                                         (long) source.data[(y+1) * src_w + (x+1)][ch] * kernel[32] +
00301                                                                         (long) source.data[(y+1) * src_w + (x+2)][ch] * kernel[33] +
00302                                                                         (long) source.data[(y+1) * src_w + (x+3)][ch] * kernel[34] +
00303                                                                         (long) source.data[(y+2) * src_w + (x-3)][ch] * kernel[35] +
00304                                                                         (long) source.data[(y+2) * src_w + (x-2)][ch] * kernel[36] +
00305                                                                         (long) source.data[(y+2) * src_w + (x-1)][ch] * kernel[37] +
00306                                                                         (long) source.data[(y+2) * src_w +  x   ][ch] * kernel[38] +
00307                                                                         (long) source.data[(y+2) * src_w + (x+1)][ch] * kernel[39] +
00308                                                                         (long) source.data[(y+2) * src_w + (x+2)][ch] * kernel[40] +
00309                                                                         (long) source.data[(y+2) * src_w + (x+3)][ch] * kernel[41] +
00310                                                                         (long) source.data[(y+3) * src_w + (x-3)][ch] * kernel[42] +
00311                                                                         (long) source.data[(y+3) * src_w + (x-2)][ch] * kernel[43] +
00312                                                                         (long) source.data[(y+3) * src_w + (x-1)][ch] * kernel[44] +
00313                                                                         (long) source.data[(y+3) * src_w +  x   ][ch] * kernel[45] +
00314                                                                         (long) source.data[(y+3) * src_w + (x+1)][ch] * kernel[46] +
00315                                                                         (long) source.data[(y+3) * src_w + (x+2)][ch] * kernel[47] +
00316                                                                         (long) source.data[(y+3) * src_w + (x+3)][ch] * kernel[48]      );
00317 
00318                                         if ( numb )
00319                                                 numb /= (long)kernel[49];//normalization
00320 
00321                                         dest.data[y * src_w + x][ch] = (unsigned char)numb;
00322                                  }
00323                          }
00324                         else
00325                          {
00326                                 dest.data[y * src_w + x][0] = source.data[y * src_w + x][0];
00327                                 dest.data[y * src_w + x][1] = source.data[y * src_w + x][1];
00328                                 dest.data[y * src_w + x][2] = source.data[y * src_w + x][2];
00329                          }
00330            }
00331          }
00332         else
00333                 return VETRET_NOT_IMPLEMENTED;
00334 
00335    return VETRET_OK;
00336  }
00337 
00338 
00339 VETRESULT vetDigitalFilter::doProcessing(vetFrameYUV420& source, vetFrameYUV420& dest, vetDFMatrix& kernel, bool clamp)
00340  {
00341         if (source.width != dest.width || source.height != dest.height)
00342                 dest.reAllocCanvas(source.width, source.height);
00343 
00344         return VETRET_NOT_IMPLEMENTED;
00345 
00346  }
00347 
00348 VETRESULT vetDigitalFilter::doProcessing(vetFrameT<unsigned char>& source, vetFrameT<unsigned char>& dest, vetDFMatrix& kernel, bool clamp)
00349  {
00350         if (source.width != dest.width || source.height != dest.height)
00351                 dest.reAllocCanvas(source.width, source.height);
00352 
00353         return VETRET_NOT_IMPLEMENTED;
00354 
00355  }
00356 
00357 
00358 VETRESULT vetDigitalFilter::doRotateKernel(vetDFMatrix& kernel)
00359 {
00360         if (&kernel == NULL)
00361                 return VETRET_PARAM_ERR;
00362 
00363         char tmpVal;
00364 
00365         if (kernel.getDim() == 3)
00366          {
00367                 tmpVal = kernel[0];
00368                 kernel[0] = kernel[3];
00369                 kernel[3] = kernel[6];
00370                 kernel[6] = kernel[7];
00371                 kernel[7] = kernel[8];
00372                 kernel[8] = kernel[5];
00373                 kernel[5] = kernel[2];
00374                 kernel[2] = kernel[1];
00375                 kernel[1] = tmpVal;
00376          }
00377         else if (kernel.getDim() == 3)
00378          {
00379                 tmpVal = kernel[0];
00380                 kernel[0] = kernel[10];
00381                 kernel[10] = kernel[20];
00382                 kernel[20] = kernel[22];
00383                 kernel[22] = kernel[24];
00384                 kernel[24] = kernel[14];
00385                 kernel[14] = kernel[4];
00386                 kernel[4] = kernel[2];
00387                 kernel[2] = tmpVal;
00388 
00389                 tmpVal = kernel[5];
00390                 kernel[5] = kernel[15];
00391                 kernel[15] = kernel[21];
00392                 kernel[21] = kernel[23];
00393                 kernel[23] = kernel[19];
00394                 kernel[19] = kernel[9];
00395                 kernel[9] = kernel[3];
00396                 kernel[3] = kernel[1];
00397                 kernel[1] = tmpVal;
00398 
00399                 tmpVal = kernel[6];
00400                 kernel[6] = kernel[11];
00401                 kernel[11] = kernel[16];
00402                 kernel[16] = kernel[17];
00403                 kernel[17] = kernel[18];
00404                 kernel[18] = kernel[13];
00405                 kernel[13] = kernel[8];
00406                 kernel[8] = kernel[7];
00407                 kernel[7] = tmpVal;
00408          }
00409         else if (kernel.getDim() == 3)
00410          {
00411                 tmpVal = kernel[2];
00412                 kernel[2] = kernel[7];
00413                 kernel[7] = kernel[28];
00414                 kernel[28] = kernel[43];
00415                 kernel[43] = kernel[46];
00416                 kernel[46] = kernel[41];
00417                 kernel[41] = kernel[20];
00418                 kernel[20] = kernel[5];
00419                 kernel[5] = tmpVal;
00420 
00421                 tmpVal = kernel[1];
00422                 kernel[1] = kernel[14];
00423                 kernel[14] = kernel[35];
00424                 kernel[35] = kernel[44];
00425                 kernel[44] = kernel[47];
00426                 kernel[47] = kernel[34];
00427                 kernel[34] = kernel[13];
00428                 kernel[13] = kernel[4];
00429                 kernel[4] = tmpVal;
00430 
00431                 tmpVal = kernel[0];
00432                 kernel[0] = kernel[21];
00433                 kernel[21] = kernel[42];
00434                 kernel[42] = kernel[45];
00435                 kernel[45] = kernel[48];
00436                 kernel[48] = kernel[27];
00437                 kernel[27] = kernel[6];
00438                 kernel[6] = kernel[3];
00439                 kernel[3] = tmpVal;
00440 
00441                 tmpVal = kernel[9];
00442                 kernel[9] = kernel[15];
00443                 kernel[15] = kernel[29];
00444                 kernel[29] = kernel[37];
00445                 kernel[37] = kernel[39];
00446                 kernel[39] = kernel[33];
00447                 kernel[33] = kernel[19];
00448                 kernel[19] = kernel[11];
00449                 kernel[11] = tmpVal;
00450 
00451                 tmpVal = kernel[8];
00452                 kernel[8] = kernel[22];
00453                 kernel[22] = kernel[36];
00454                 kernel[36] = kernel[38];
00455                 kernel[38] = kernel[40];
00456                 kernel[40] = kernel[26];
00457                 kernel[26] = kernel[12];
00458                 kernel[12] = kernel[10];
00459                 kernel[10] = tmpVal;
00460 
00461                 tmpVal = kernel[16];
00462                 kernel[16] = kernel[23];
00463                 kernel[23] = kernel[30];
00464                 kernel[30] = kernel[31];
00465                 kernel[31] = kernel[32];
00466                 kernel[32] = kernel[25];
00467                 kernel[25] = kernel[18];
00468                 kernel[18] = kernel[17];
00469                 kernel[17] = tmpVal;
00470     }
00471    else
00472                 return VETRET_NOT_IMPLEMENTED;
00473    return VETRET_OK;
00474  }
00475 
00476 
00477 
00481 
00482 
00483 
00484 
00485 
00486 
00487 
00488 vetDigitalFilterParameters::vetDigitalFilterParameters()
00489  {
00490         currentKernel = NULL;
00491         reset();
00492  }
00493 
00494 void vetDigitalFilterParameters::reset()
00495  {
00496         currentBuffer = vetFilterParameters::NONE;
00497         clampNegative = true;
00498 //... BUG
00499  }
00500 
00501 void vetDigitalFilterParameters::setCurrentKernel(vetDFMatrix* data)
00502  {
00503         currentKernel = data;
00504  }
00505 
00506 void vetDigitalFilterParameters::setClampNegative(bool value)
00507  {
00508         clampNegative = value;
00509  }
00510 
00511 
00512 int vetDigitalFilterParameters::saveToStreamXML(FILE *fp)
00513  {
00514         int ret = VETRET_OK;
00515 
00516         if ( fp == NULL )
00517                 return VETRET_PARAM_ERR;
00518 
00519         if( fprintf(fp, "<vetDigitalFilterParameters>\n") == EOF )
00520                 return VETRET_INTERNAL_ERR;
00521 
00522         if ( fprintf(fp, "  <internalBufferType value=\"%u\" />\n", (int)currentBuffer) == EOF)
00523                 return VETRET_INTERNAL_ERR;
00524 
00525 
00526         if (currentKernel != NULL)
00527          {
00528                 if( fprintf(fp, " <KernelData>\n") == EOF )
00529                         return VETRET_INTERNAL_ERR;
00530 
00531                 ret = currentKernel->saveToStream(fp);
00532 
00533                 if( fprintf(fp, " </KernelData>\n") == EOF )
00534                         return VETRET_INTERNAL_ERR;
00535          }
00536 
00537         if( fprintf(fp, "</vetDigitalFilterParameters>\n") == EOF )
00538                 return VETRET_INTERNAL_ERR;
00539 
00540         return ret;
00541  }
00542 
00543 
00544 int vetDigitalFilterParameters::loadFromStreamXML(FILE *fp)
00545  {
00546         if ( fscanf(fp, "<vetDigitalFilterParameters>\n") == EOF )
00547                 throw "error in XML file, unable to import data.";
00548 
00549         int cB = (int)currentBuffer;
00550         if ( fscanf(fp, "  <internalBufferType value=\"%u\" />\n", &cB) == EOF )
00551                 throw "error in XML file, unable to import data.";
00552         currentBuffer = (BUFFER_TYPE)cB;
00553 
00554         int ret = VETRET_OK;
00555 
00556         if ( fscanf(fp, " <KernelData>\n") != EOF )
00557          {
00558                 if (currentKernel == NULL)
00559                         currentKernel = new vetDFMatrix();
00560 
00561                 ret = currentKernel->loadFromStream(fp);
00562          }
00563 
00564 
00565 
00566         return ret;
00567  }
00568 
00569 
00570 
00571 

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