Ignore:
Timestamp:
04/23/2009 05:05:31 PM (12 years ago)
Author:
dave
Message:

changed file format to xml, experimental multiple image/face matching, better makefile

File:
1 edited

Legend:

Unmodified
Added
Removed
  • foam/trunk/simple-faceident/src/ImageUtils.cpp

    r72 r76  
    3434 
    3535///////////////////////////////////////////////////////////// 
     36// safe accessor, which returns 0 if out of range 
     37 
     38unsigned char SafeGet2D(const IplImage *image, int y, int x, int c) 
     39{ 
     40        CvSize size = cvGetSize(image); 
     41        if (x<0 || x>=size.width || y<0 || y>=size.height) 
     42        { 
     43                return 0; 
     44        } 
     45         
     46        return cvGet2D(image,y,x).val[c]; 
     47} 
     48 
     49///////////////////////////////////////////////////////////// 
    3650// paste an image over the top of another 
    3751 
    38 void BlitImage(IplImage *srcimage, IplImage *dstimage, CvPoint pos) 
     52void BlitImage(const IplImage *srcimage, IplImage *dstimage, CvPoint pos) 
    3953{ 
    4054        CvSize size = cvGetSize(srcimage); 
     
    95109// return a diff metric between two images (works in RGB) 
    96110 
    97 float Diff(IplImage *imagea, IplImage *imageb) 
     111float Diff(const IplImage *imagea, const IplImage *imageb) 
    98112{ 
    99113        CvSize sizea = cvGetSize(imagea); 
     
    123137// return a local binary patterns image of the src image 
    124138 
    125 unsigned char SafeGet2D(IplImage *image, int y, int x, int c) 
    126 { 
    127         CvSize size = cvGetSize(image); 
    128         if (x<0 || x>=size.width || y<0 || y>=size.height) 
    129         { 
    130                 return 0; 
    131         } 
    132          
    133         return cvGet2D(image,y,x).val[c]; 
    134 } 
    135  
    136 void LBPImage(IplImage *srcimage, IplImage *dstimage) 
     139 
     140void LBPImage(const IplImage *srcimage, IplImage *dstimage) 
    137141{ 
    138142        CvSize srcsize = cvGetSize(srcimage); 
     
    143147        assert(srcimage->nChannels == dstimage->nChannels); 
    144148 
     149    // for each pixel 
    145150    for(int y=0; y<srcsize.height; y++) 
    146151        { 
     
    148153                { 
    149154                        CvScalar sc; 
    150  
     155                         
     156                        // for each channel 
    151157                        for(int c=0; c<dstimage->nChannels; c++) 
    152158                        { 
     
    154160                                unsigned char o=cvGet2D(srcimage,y,x).val[c]; 
    155161                                unsigned char b=0; 
     162 
     163                                // loop through a 3x3 kernel 
    156164                                for (int kx=-1; kx<=1; kx++) 
    157165                                { 
     
    161169                                                if (!(kx==0 && ky==0)) 
    162170                                                { 
     171                                                        // threshold 
    163172                                                        if (o>SafeGet2D(srcimage,y+ky,x+kx,c)) 
    164173                                                        { 
    165                                                                 v&=1<<b; 
     174                                                                // bit magic 
     175                                                                v|=(1<<b); 
    166176                                                        } 
    167177                                                        b++; 
     
    175185        } 
    176186} 
     187 
     188///////////////////////////////////////////////////////////// 
     189// calculate a histogram 
     190 
     191unsigned int *HistMono8Bit(const IplImage *image) 
     192{ 
     193        assert(image->nChannels == 1); 
     194        assert(image->depth == 8); 
     195        CvSize size = cvGetSize(image); 
     196 
     197        unsigned int *h=new unsigned int[256]; 
     198 
     199        for(int i=0; i<256; i++) 
     200        { 
     201                h[i]=0; 
     202        } 
     203 
     204    // for each pixel 
     205    for(int y=0; y<size.height; y++) 
     206        { 
     207        for(int x=0; x<size.width; x++) 
     208                { 
     209                        h[(unsigned char)cvGet2D(image,y,x).val[0]]++; 
     210                } 
     211        } 
     212         
     213        return h; 
     214} 
     215 
     216///////////////////////////////////////////////////////////// 
     217// draw a histogram 
     218 
     219void DrawHistogram8(int x, int y, float scale, CvScalar colour, unsigned int *h, IplImage *img) 
     220{ 
     221        for(int i=0; i<256; i++) 
     222        { 
     223                cvLine(img, cvPoint(x+i,y),cvPoint(x+i,y+h[i]*-scale), colour);  
     224        } 
     225} 
Note: See TracChangeset for help on using the changeset viewer.