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

vetFrameHSV.cpp

Go to the documentation of this file.
00001 
00017 #include "vetFrameHSV.h"
00018 #include <math.h>
00019 
00020 vetFrameHSV::vetFrameHSV() : vetFrame()
00021  {
00022         INFO("vetFrameHSV::vetFrameHSV() : vetFrame() [CONTRUCTOR]")
00023         data = NULL;
00024         width = 0;
00025         height = 0;
00026  }
00027 
00028 vetFrameHSV::vetFrameHSV(vetFrameHSV& img)
00034  {
00035         data = NULL;
00036         reAllocCanvas(img.width, img.height);
00037 
00038         if ( width != 0 && height != 0 )
00039                 memcpy(data, img.data, width * height * sizeof(PixelHSV));
00040 
00041         INFO("vetFrameHSV::vetFrameHSV(vetFrameHSV& img) [CONTRUCTOR]")
00042         DEBUG(width)
00043         DEBUG(height)
00044  }
00045 
00046 
00047 vetFrameHSV::vetFrameHSV(vetFrameRGB96& img)
00053  {
00054         data = NULL;
00055         reAllocCanvas(img.width, img.height);
00056 
00057         *this << img;
00058 
00059         INFO("vetFrameHSV::vetFrameHSV(vetFrameRGB96& img) [CONTRUCTOR]")
00060         DEBUG(width)
00061         DEBUG(height)
00062  }
00063 
00064 vetFrameHSV::vetFrameHSV(vetFrameGrey & img)
00070  {
00071         data = NULL;
00072         reAllocCanvas(img.width, img.height);
00073 
00074         *this << img;
00075 
00076         INFO("vetFrameHSV::vetFrameHSV(vetFrameRGB96& img) [CONTRUCTOR]")
00077         DEBUG(width)
00078         DEBUG(height)
00079  }
00080 
00081 
00082 vetFrameHSV::vetFrameHSV(unsigned int w, unsigned int h)
00091  {
00092         data = NULL;
00093         reAllocCanvas(w, h);
00094 
00095         INFO("vetFrameHSV::vetFrameHSV(unsigned int w, unsigned int h) [CONTRUCTOR]")
00096         DEBUG(width)
00097         DEBUG(height)
00098  }
00099 
00100 
00101 vetFrameHSV::~vetFrameHSV()
00105 {
00106         if ( data != NULL )
00107             delete [] data;
00108 
00109         INFO("vetFrameHSV::~vetFrameHSV() [DESTRUCTOR]")
00110 }
00111 
00112 VETRESULT vetFrameHSV::reAllocCanvas(unsigned int w, unsigned int h)
00113  {
00114         if (data != NULL)
00115                 delete [] data;
00116 
00117         height = h;
00118         width = w;
00119         data = NULL;
00120 
00121         if ( width == 0 || height == 0)
00122                 return VETRET_PARAM_ERR;
00123 
00124         data = new PixelHSV[width * height];
00125 
00126         return VETRET_OK;
00127  }
00128 
00129 VETRESULT vetFrameHSV::setBlack()
00130  {
00131         if (width == 0 || height == 0 || data == NULL)
00132                 return VETRET_ILLEGAL_USE;
00133 
00134         memset(data, '\0', width * height * sizeof(PixelHSV) );
00135 
00136         return VETRET_OK;
00137  }
00138 
00139 VETRESULT vetFrameHSV::setWhite()
00140  {
00141         if (width == 0 || height == 0 || data == NULL)
00142                 return VETRET_ILLEGAL_USE;
00143 
00144         memset(data, 255, width * height  * sizeof(PixelHSV) );
00145 
00146         return VETRET_OK;
00147  }
00148 
00149 
00150 VETRESULT vetFrameHSV::extractBrightness(unsigned char* buffer, unsigned int* size)
00151  {
00152         if (width == 0 || height == 0 || data == NULL)
00153                 return VETRET_ILLEGAL_USE;
00154 
00155         if (buffer == NULL)
00156          {
00157                  if ( size == NULL)
00158                         return VETRET_PARAM_ERR;
00159 
00160                  *size = width*height;
00161                  return VETRET_OK;
00162          }
00163 
00164         return VETRET_NOT_IMPLEMENTED;
00165  }
00166 
00167 VETRESULT vetFrameHSV::setPixel(unsigned int x, unsigned int y, PixelHSV p)
00174 {
00175         // Check that co-ords are valid.
00176         if ( x >= width || y >= height )
00177                 throw "Invalid Coordinates in method vetFrameHSV::setPixel(unsigned int x, unsigned int y, PixelHSV p)";
00178 
00179         data[y * width + x] = p;
00180 
00181         return VETRET_OK;
00182 }
00183 
00184 
00185 VETRESULT vetFrameHSV::setHSV(unsigned int x, unsigned int y, unsigned short int hue, unsigned char sat, unsigned char val)
00195 {
00196         // Check that co-ords are valid.
00197         if ( x >= width || y >= height )
00198                 throw "Invalid Coordinates in method vetFrameHSV::setHSV(unsigned int x, unsigned int y, int hue, int sat, int val)";
00199 
00200         unsigned int offset = y * width + x;
00201 
00202         data[offset].hue = hue;
00203         data[offset].sat = sat;
00204         data[offset].val = val;
00205 
00206         return VETRET_OK;
00207 }
00208 
00209 
00210 VETRESULT vetFrameHSV::setChannel(unsigned int x, unsigned int y, ChannelHSV fs, unsigned int value)
00219 {
00220         // Check that co-ords are valid.
00221         if ( x >= width || y >= height )
00222                 throw "Invalid Coordinates in method vetFrameHSV::setChannel(unsigned int x, unsigned int y, ChannelHSV fs, int value)";
00223 
00224 
00225         if (fs == HUE)
00226                 data[y * width + x].hue = value;
00227         else if (fs == SAT)
00228                 data[y * width + x].sat = (unsigned char)value;
00229         else if (fs == VAL)
00230                 data[y * width + x].val = (unsigned char)value;
00231         else
00232                 return VETRET_PARAM_ERR;
00233 
00234         return VETRET_OK;
00235 }
00236 
00237 
00238 VETRESULT vetFrameHSV::getPixel(unsigned int x, unsigned int y, PixelHSV& p)
00247 {
00248         // Check that co-ords are valid.
00249         if ( x >= width || y >= height )
00250                 throw "Invalid Coordinates in method vetFrameHSV::setChannel(unsigned int x, unsigned int y, ChannelHSV fs, int value)";
00251 
00252         p = data[y * width + x];
00253 
00254         return VETRET_OK;
00255 }
00256 
00257 
00258 unsigned int vetFrameHSV::getChannel(unsigned int x, unsigned int y, ChannelHSV fs)
00267 {
00268         // Check that co-ords are valid.
00269         if ( x >= width || y >= height )
00270                 throw "Invalid Coordinates in method vetFrameHSV::setChannel(unsigned int x, unsigned int y, ChannelHSV fs, int value)";
00271 
00272         if (fs == HUE)
00273                 return (unsigned int)data[y * width + x].hue;
00274         else if (fs == SAT)
00275                 return (unsigned int)data[y * width + x].sat;
00276         else if (fs == VAL)
00277                 return (unsigned int)data[y * width + x].val;
00278 
00279         throw "Unknown Channel in method vetFrameHSV::setChannel(unsigned int x, unsigned int y, ChannelHSV fs, int value)";
00280 }
00281 
00282 
00283 vetFrameHSV& vetFrameHSV::clearWith(PixelHSV& p)
00289 {
00290         DEBUGMSG("vetFrameHSV& vetFrameHSV::clearWith(PixelHSV& p)", p)
00291 
00292         for (unsigned int i=0; i < width * height; i++)
00293                 data[i] = p;
00294 
00295         return *this;
00296 }
00297 
00298 
00299 vetFrameHSV& vetFrameHSV::clearChannel(ChannelHSV fs, unsigned int value)
00306 {
00307         INFO("vetFrameHSV& vetFrameHSV::clearChannel(ChannelHSV channel, unsigned int value)")
00308         DEBUG(channel)
00309         DEBUG(color)
00310 
00311 
00312         if (fs == HUE)
00313         {
00314                 for (unsigned int i = 0; i<width*height; i++)
00315                         data[i].hue = value;
00316         }
00317         else if (fs == SAT)
00318         {
00319                 for (unsigned int i = 0; i<width*height; i++)
00320                         data[i].sat = (unsigned char)value;
00321         }
00322         else if (fs == VAL)
00323         {
00324                 for (unsigned int i = 0; i<width*height; i++)
00325                         data[i].val = (unsigned char)value;
00326         }
00327 
00328         return *this;
00329 }
00330 
00331 
00332 
00333 int vetFrameHSV::setWidth(unsigned int newWidth)
00334  {
00335         if ( width != 0)
00336                 return VETRET_ILLEGAL_USE;
00337 
00338         width = newWidth;
00339 
00340         return VETRET_OK;
00341  }
00342 
00343 int vetFrameHSV::setHeight(unsigned int newHeight)
00344  {
00345         if ( height != 0)
00346                 return VETRET_ILLEGAL_USE;
00347 
00348         height = newHeight;
00349 
00350         return VETRET_OK;
00351  }
00352 
00353 
00354 vetFrameHSV& vetFrameHSV::copy(vetFrameHSV& img)
00361 {
00362         INFO("vetFrameHSV& vetFrameHSV::copy(vetFrameHSV& img)")
00363 
00364         /* check we're not trying to copy ourself */
00365         if (this == &img)
00366                 throw "Source and Destination are same Image";
00367 
00368         /* First check images are the same size and valid */
00369         if (width != img.width || height != img.height)
00370                 throw "Difference in vetFrameHSV Dimensions";
00371 
00372         /* Perform copy */
00373         memcpy(data, img.data, width * height * sizeof(PixelHSV));
00374 
00375         return *this;
00376 }
00377 
00378 
00379 vetFrameHSV& vetFrameHSV::operator += (vetFrameHSV& img)
00380 {
00381         INFO("vetFrameHSV& vetFrameHSV::operator += (vetFrameHSV& img)")
00382 
00383         if (width != img.width || height != img.height)
00384                 throw "Difference in vetFrameHSV Dimensions";
00385 
00386     for(unsigned int i=0; i < width * height; i++)
00387         data[i] += img.data[i];
00388 
00389     return *this;
00390 }
00391 
00392 
00393 vetFrameHSV& vetFrameHSV::operator -= (vetFrameHSV& img)
00394 {
00395         INFO("vetFrameHSV& vetFrameHSV::operator -= (vetFrameHSV& img)")
00396 
00397         if (width != img.width || height != img.height)
00398                 throw "Difference in vetFrameHSV Dimensions";
00399 
00400     for(unsigned int i=0; i < width * height; i++)
00401         data[i] -= img.data[i];
00402 
00403     return *this;
00404 }
00405 
00406 
00407 vetFrameHSV& vetFrameHSV::operator /= (vetFrameHSV& img)
00408 {
00409         INFO("vetFrameHSV& vetFrameHSV::operator /= (vetFrameHSV& img)")
00410 
00411         if (width != img.width || height != img.height)
00412                 throw "Difference in vetFrameHSV Dimensions";
00413 
00414     for(unsigned int i=0; i < width * height; i++)
00415         data[i] /= img.data[i];
00416 
00417     return *this;
00418 }
00419 
00420 
00421 vetFrameHSV& vetFrameHSV::operator *= (vetFrameHSV& img)
00422 {
00423         INFO("vetFrameHSV& vetFrameHSV::operator *= (vetFrameHSV& img)")
00424 
00425         if (width != img.width || height != img.height)
00426                 throw "Difference in vetFrameHSV Dimensions";
00427 
00428     for(unsigned int i=0; i < width * height; i++)
00429         data[i] *= img.data[i];
00430 
00431     return *this;
00432 }
00433 
00434 
00435 
00436 vetFrameHSV& vetFrameHSV::operator >> (vetFrameRGB24& img)
00443 {
00444         INFO("vetFrameHSV& vetFrameHSV::operator >> (vetFrameRGB24& img) [pushing data]")
00445 
00446         if ( width == 0 || height == 0 )
00447                 throw "Cannot do that with empty image (no size)";
00448 
00449 
00450         if ( width != img.width || height != img.height )
00451                 img.reAllocCanvas(width, height);
00452 
00453     for(unsigned int cnt=0 ; cnt<width*height ; cnt++)
00454                 convPixel_HSVtoRGB24(data[cnt], img.data[cnt]);
00455 //CHECKBUGS
00456 
00457 
00458         return *this;
00459 }
00460 
00461 vetFrameHSV& vetFrameHSV::operator >> (vetFrameHSV& img)
00468 {
00469         INFO("vetFrameHSV& vetFrameHSV::operator >> (vetFrameHSV& img) [pushing data]")
00470 
00471         /* check we're not trying to copy ourself */
00472         if (this == &img)
00473                 throw "Source and Destination are same Image";
00474 
00475         if ( width == 0 || height == 0 )
00476                 throw "Cannot do that with empty image (no size)";
00477 
00478 
00479         if ( width != img.width || height != img.height )
00480                 img.reAllocCanvas(width, height);
00481 
00482         memcpy(img.data, data, width * height * sizeof(PixelHSV));
00483 
00484         return *this;
00485 }
00486 
00494 vetFrameHSV& vetFrameHSV::operator >> (vetFrameRGB96& img)
00495 {
00496         INFO("vetFrameHSV& vetFrameHSV::operator >> (vetFrameRGB96& img) [pushing data]")
00497 
00498         if ( width == 0 || height == 0 )
00499                 throw "Cannot do that with empty image (no size)";
00500 
00501         if ( width != img.width || height != img.height )
00502                 img.reAllocCanvas(width, height);
00503 
00504 
00505         const unsigned int size= height*width;
00506         for (unsigned int i=0; i < size; i++)
00507         convPixel_HSVtoRGB32(data[i], img.data[i]);
00508 
00509         return *this;
00510 }
00511 
00519 vetFrameHSV& vetFrameHSV::operator >> (vetFrameGrey& img)
00520 {
00521         INFO("vetFrameHSV& vetFrameHSV::operator >> (vetFrameGrey& img) [pushing data]")
00522 
00523         if ( width == 0 || height == 0 )
00524                 throw "Cannot do that with empty image (no size)";
00525 
00526         if ( width != img.width || height != img.height )
00527                 img.reAllocCanvas(width, height);
00528 
00529         const unsigned int size= height*width;
00530         for (unsigned int i=0; i < size; i++)
00531         convPixel_HSVtoGREY( data[i], img.data[i] );
00532 
00533         return *this;
00534 }
00535 
00536 
00537 
00538 void vetFrameHSV::operator << (const vetFrameRGB24& img)
00545 {
00546         INFO("void vetFrameHSV::operator << (const vetFrameRGB24& img) [importing data]")
00547 
00548         if ( img.width == 0 || img.height == 0 )
00549                 throw "Cannot do that with empty image (no size)";
00550 
00551         if ( width != img.width || height != img.height )
00552                 reAllocCanvas(img.width, img.height);
00553 
00554         const unsigned int size= height*width;
00555         for (unsigned int i=0; i < size; i++)
00556         convPixel_RGB24toHSV(img.data[i], data[i]);
00557 
00558 }
00559 
00560 
00561 void vetFrameHSV::operator << (const vetFrameHSV& img)
00568 {
00569         INFO("void vetFrameHSV::operator << (const vetFrameHSV& img) [importing data]")
00570 
00571         /* check we're not trying to copy ourself */
00572         if (this == &img)
00573                 throw "Source and Destination are same Image";
00574 
00575         if ( img.width == 0 || img.height == 0 )
00576                 throw "Cannot do that with empty image (no size)";
00577 
00578         if ( width != img.width || height != img.height )
00579                 reAllocCanvas(img.width, img.height);
00580 
00581         memcpy(data, img.data, width * height * sizeof(PixelHSV));
00582 }
00583 
00591 void vetFrameHSV::operator << (const vetFrameRGB96& img)
00592 {
00593         INFO("void vetFrameHSV::operator << (const vetFrameRGB96& img) [importing data]")
00594 
00595         if ( img.width == 0 || img.height == 0 )
00596                 throw "Cannot do that with empty image (no size)";
00597 
00598         if ( width != img.width || height != img.height )
00599                 reAllocCanvas(img.width, img.height);
00600 
00601 
00602         const unsigned int size= height*width;
00603         for (unsigned int i=0; i < size; i++)
00604         convPixel_RGB32toHSV(img.data[i], data[i]);
00605 
00606  }
00607 
00615 void vetFrameHSV::operator << (const vetFrameGrey& img)
00616 {
00617         INFO("void vetFrameHSV::operator << (const vetFrameGrey& img) [importing data]")
00618 
00619         if ( width == 0 || height == 0 || width != img.width || height != img.height )
00620          {
00621                 reAllocCanvas(img.width, img.height);
00622          }
00623 
00624 
00625         const unsigned int size= height*width;
00626         for (unsigned int i=0; i < size; i++)
00627         convPixel_GREYtoHSV( img.data[i], data[i] );
00628 
00629  }
00630 
00631 
00632 
00633 
00634 
00635 
00636 
00637 
00638 
00639 
00640 
00641 
00642 
00643 
00644 
00645 
00646 
00647 void vetFrameHSV::convPixel_RGB32toHSV (const PixelRGB96& rgb, PixelHSV& hsv)
00651 {
00652     float r = rgb[vetFrameRGB96::RED  ] / 255.0;
00653     float g = rgb[vetFrameRGB96::GREEN] / 255.0;
00654     float b = rgb[vetFrameRGB96::BLUE ] / 255.0;
00655 
00656     float h, s, v;
00657 
00658     float mn = r, mx = r;
00659     int maxVal = 0;
00660 
00661     if (g > mx) { mx = g; maxVal = 1; }
00662     if (b > mx) { mx = b; maxVal = 2; }
00663     if (g < mn) mn = g;
00664     if (b < mn) mn = b;
00665 
00666     float  delta = mx - mn;
00667 
00668     v = mx;
00669     if (mx != 0)
00670         s = delta / mx;
00671     else {
00672         s = 0;
00673         h = 0;
00674         goto ass_end;
00675     }
00676 
00677     if (s == 0.0f) {
00678         h = 0; // Arbritrary
00679         goto ass_end;
00680     } else {
00681         switch (maxVal)
00682         {
00683             case 0: h = 0 + ( g - b ) / delta; break;     // yel  < h < mag
00684             case 1: h = 2 + ( b - r ) / delta; break;     // cyan < h < yel
00685             case 2: h = 4 + ( r - g ) / delta; break;     // mag  < h < cyan
00686             default: h = 0 ; break ; // Should never occur
00687         }
00688     }
00689 
00690     h *= 60;
00691     if (h < 0) h += 360;
00692 
00693 ass_end:    // the assignments at the end of the function ;-)
00694 
00695     hsv.hue = int (h);
00696     hsv.sat = int (s * 255);
00697     hsv.val = int (v * 255);
00698 
00699 }
00700 
00701 void vetFrameHSV::convPixel_HSVtoRGB32 (const PixelHSV& hsv, PixelRGB96& rgb)
00705 {
00706     int i;
00707     float f, p, q, t, hTemp;
00708 
00709     float h = hsv.hue;
00710     float s = hsv.sat / 255.0;
00711     float v = hsv.val / 255.0;
00712 
00713     float r, g, b;
00714 
00715     if (s == 0.0 || h == -1.0) { // s==0? Totally unsaturated = grey
00716         rgb[0] = rgb[1] = rgb[2] = (int) v * 255;
00717     }
00718     hTemp = h / 60.0f;
00719     i = (int) floor(hTemp);                 // which sector
00720     f = hTemp - i;                      // how far through sector
00721     p = v * ( 1 - s );
00722     q = v * ( 1 - s * f );
00723     t = v * ( 1 - s * ( 1 - f ) );
00724 
00725     switch (i) {
00726         case 0: r = v; g = t; b = p; break;
00727         case 1: r = q; g = v; b = p; break;
00728         case 2: r = p; g = v; b = t; break;
00729         case 3: r = p; g = q; b = v; break;
00730         case 4: r = t; g = p; b = v; break;
00731         case 5: r = v; g = p; b = q; break;
00732         default: r=0 ; g=0 ; b=0 ; break ; // Should never occur
00733     }
00734 
00735     rgb[0] = int (r * 255);
00736     rgb[1] = int (g * 255);
00737     rgb[2] = int (b * 255);
00738 
00739 }
00740 
00741 
00742 
00743 
00744 void vetFrameHSV::convPixel_RGB24toHSV (const PixelRGB24& rgb, PixelHSV& hsv)
00748 {
00749     float r = (int)rgb[vetFrameRGB96::RED  ] / 255.0;
00750     float g = (int)rgb[vetFrameRGB96::GREEN] / 255.0;
00751     float b = (int)rgb[vetFrameRGB96::BLUE ] / 255.0;
00752 
00753     float h, s, v;
00754 
00755     float mn = r, mx = r;
00756     int maxVal = 0;
00757 
00758     if (g > mx) { mx = g; maxVal = 1; }
00759     if (b > mx) { mx = b; maxVal = 2; }
00760     if (g < mn) mn = g;
00761     if (b < mn) mn = b;
00762 
00763     float  delta = mx - mn;
00764 
00765     v = mx;
00766     if (mx != 0)
00767         s = delta / mx;
00768     else {
00769         s = 0;
00770         h = 0;
00771         goto ass_end;
00772     }
00773 
00774     if (s == 0.0f) {
00775         h = 0; // Arbritrary
00776         goto ass_end;
00777     } else {
00778         switch (maxVal)
00779         {
00780             case 0: h = 0 + ( g - b ) / delta; break;     // yel  < h < mag
00781             case 1: h = 2 + ( b - r ) / delta; break;     // cyan < h < yel
00782             case 2: h = 4 + ( r - g ) / delta; break;     // mag  < h < cyan
00783             default: h = 0 ; break ; // Should never occur
00784         }
00785     }
00786 
00787     h *= 60;
00788     if (h < 0) h += 360;
00789 
00790 ass_end:    // the assignments at the end of the function ;-)
00791 
00792     hsv.hue = int (h);
00793     hsv.sat = int (s * 255);
00794     hsv.val = int (v * 255);
00795 
00796 }
00797 
00798 void vetFrameHSV::convPixel_HSVtoRGB24 (const PixelHSV& hsv, PixelRGB24& rgb)
00802 {
00803     int i;
00804     float f, p, q, t, hTemp;
00805 
00806     float h = hsv.hue;
00807     float s = hsv.sat / 255.0;
00808     float v = hsv.val / 255.0;
00809 
00810     float r, g, b;
00811 
00812     if (s == 0.0 || h == -1.0) { // s==0? Totally unsaturated = grey
00813         rgb[0] = rgb[1] = rgb[2] = (int) v * 255;
00814     }
00815     hTemp = h / 60.0f;
00816     i = (int) floor(hTemp);                 // which sector
00817     f = hTemp - i;                      // how far through sector
00818     p = v * ( 1 - s );
00819     q = v * ( 1 - s * f );
00820     t = v * ( 1 - s * ( 1 - f ) );
00821 
00822     switch (i) {
00823         case 0: r = v; g = t; b = p; break;
00824         case 1: r = q; g = v; b = p; break;
00825         case 2: r = p; g = v; b = t; break;
00826         case 3: r = p; g = q; b = v; break;
00827         case 4: r = t; g = p; b = v; break;
00828         case 5: r = v; g = p; b = q; break;
00829         default: r=0 ; g=0 ; b=0 ; break ; // Should never occur
00830     }
00831 
00832     rgb[0] = (unsigned char)(r * 255);
00833     rgb[1] = (unsigned char)(g * 255);
00834     rgb[2] = (unsigned char)(b * 255);
00835 
00836 }
00837 
00838 
00839 
00840 
00841 
00842 void vetFrameHSV::convPixel_GREYtoHSV (const PixelGrey& grey, PixelHSV& hsv)
00846 {
00847     float r = (int)grey / RED_COEF / 255.0;
00848     float g = (int)grey / GREEN_COEF / 255.0;
00849     float b = (int)grey / BLUE_COEF / 255.0;
00850 //CHECKBUGS
00851     float h, s, v;
00852 
00853     float mn = r, mx = r;
00854     int maxVal = 0;
00855 
00856     if (g > mx) { mx = g; maxVal = 1; }
00857     if (b > mx) { mx = b; maxVal = 2; }
00858     if (g < mn) mn = g;
00859     if (b < mn) mn = b;
00860 
00861     float  delta = mx - mn;
00862 
00863     v = mx;
00864     if (mx != 0)
00865         s = delta / mx;
00866     else {
00867         s = 0;
00868         h = 0;
00869         goto ass_end;
00870     }
00871 
00872     if (s == 0.0f) {
00873         h = 0; // Arbritrary
00874         goto ass_end;
00875     } else {
00876         switch (maxVal)
00877         {
00878             case 0: h = 0 + ( g - b ) / delta; break;     // yel  < h < mag
00879             case 1: h = 2 + ( b - r ) / delta; break;     // cyan < h < yel
00880             case 2: h = 4 + ( r - g ) / delta; break;     // mag  < h < cyan
00881             default: h = 0 ; break ; // Should never occur
00882         }
00883     }
00884 
00885     h *= 60;
00886     if (h < 0) h += 360;
00887 
00888 ass_end:    // the assignments at the end of the function ;-)
00889 
00890     hsv.hue = int (h);
00891     hsv.sat = int (s * 255);
00892     hsv.val = int (v * 255);
00893 
00894 }
00895 
00896 void vetFrameHSV::convPixel_HSVtoGREY (const PixelHSV& hsv, PixelGrey& grey)
00900 {
00901     int i;
00902     float f, p, q, t, hTemp;
00903 
00904     float h = hsv.hue;
00905     float s = hsv.sat / 255.0;
00906     float v = hsv.val / 255.0;
00907 
00908     float r, g, b;
00909 
00910     if (s == 0.0 || h == -1.0) { // s==0? Totally unsaturated = grey
00911         grey = (int) v * 255;
00912     }
00913     hTemp = h / 60.0f;
00914     i = (int) floor(hTemp);                 // which sector
00915     f = hTemp - i;                      // how far through sector
00916     p = v * ( 1 - s );
00917     q = v * ( 1 - s * f );
00918     t = v * ( 1 - s * ( 1 - f ) );
00919 
00920     switch (i) {
00921         case 0: r = v; g = t; b = p; break;
00922         case 1: r = q; g = v; b = p; break;
00923         case 2: r = p; g = v; b = t; break;
00924         case 3: r = p; g = q; b = v; break;
00925         case 4: r = t; g = p; b = v; break;
00926         case 5: r = v; g = p; b = q; break;
00927         default: r=0 ; g=0 ; b=0 ; break ; // Should never occur
00928     }
00929 
00930         grey = (PixelGrey)(r * 255 * RED_COEF + g * 255 * GREEN_COEF + b * 255 * BLUE_COEF);
00931 
00932 }
00933 
00934 
00935 
00936 
00937 
00938 
00939 
00940 
00941 
00942 
00943 
00944 
00945 
00946 
00947 
00948 
00949 
00950 
00951 
00952 
00953 
00954 
00955 /****************************************************************************\
00956  *       Extra doxygen comments and information relating to this file       *
00957 \****************************************************************************/
00958 

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