Changeset 95


Ignore:
Timestamp:
07/24/2009 03:33:27 PM (10 years ago)
Author:
dave
Message:

eigenface user classification seems to work on the test video

Location:
foam/trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • foam/trunk/faceclassifier/src/App.cpp

    r94 r95  
    1919#include "PCAClassifier.h" 
    2020 
     21//#define SAVE_FRAMES 
     22 
    2123using namespace std; 
    2224 
     25int w=20; 
     26int h=30; 
     27 
    2328App::App(const string &filename) : 
     29m_Capture(NULL), 
     30m_Cascade(NULL), 
     31m_Storage(NULL), 
     32m_Classifier(NULL), 
     33m_FaceBank(NULL), 
     34m_FaceNum(1), 
     35m_Learn(true), 
    2436frame(NULL), 
    25 frame_copy(NULL) 
     37frame_copy(NULL), 
     38m_FrameNum(0) 
    2639{ 
    2740        m_CtrlPort.open("/faceident-ctrl");  
     
    4154        assert(m_Capture); 
    4255         
    43         int w=50; 
    44         int h=80; 
    45          
    4656        PCA pca(w*h); 
    47         FILE *f=fopen("../data/eigenspaces/spacek-50x80.pca", "rb"); 
     57        //FILE *f=fopen("../data/eigenspaces/spacek-50x80.pca", "rb"); 
     58        FILE *f=fopen("../data/eigenspaces/spacek-20x30.pca", "rb"); 
    4859        pca.Load(f); 
    4960        fclose(f); 
    50         pca.Compress(0,100); 
     61        pca.Compress(3,30); 
    5162         
    5263        m_Classifier = new PCAClassifier(pca); 
     
    136147                // get the face area as a sub image 
    137148                Image face = camera.SubImage(r->x, r->y, r->width, r->height); 
     149                 
     150                //face.SubMean(); 
     151                //camera.Blit(face.Scale(w,h).RGB2GRAY(),100,100); 
     152                 
    138153                // pass it into the face bank  
    139154                if (m_Learn) 
     
    163178        } 
    164179 
     180        char info[256]; 
     181        if (m_Learn) 
     182        { 
     183                snprintf(info,256,"Learning user :%d",m_FaceNum); 
     184                 
     185                PCAClassifier *c = static_cast<PCAClassifier*>(m_FaceBank->GetClassifier()); 
     186                if (c->GroupExists(m_FaceNum)) 
     187                { 
     188                        Vector<float> p = c->GetGroupMean(m_FaceNum); 
     189                        cerr<<p.Magnitude()<<endl; 
     190                        Vector<float> r = c->GetPCA().Synth(p); 
     191                        camera.Blit(Image(w,h,1,r),0,100); 
     192                } 
     193        } 
     194        else 
     195        { 
     196                snprintf(info,256,"Detecting users"); 
     197        } 
     198         
     199        cvPutText(camera.m_Image, info, cvPoint(10,10), &m_Font, colors[0]); 
     200 
    165201        m_SceneState.Update(); 
    166      
     202         
     203    m_FrameNum++; 
     204#ifdef SAVE_FRAMES 
     205        char name[256]; 
     206        sprintf(name,"out-%0.4d.jpg",m_FrameNum); 
     207        cerr<<"saving "<<name<<endl; 
     208        cvSaveImage(name,camera.m_Image); 
     209#endif 
     210 
    167211        cvShowImage("face classifier", camera.m_Image); 
    168212 
  • foam/trunk/faceclassifier/src/App.h

    r94 r95  
    5151        IplImage *frame; 
    5252        IplImage *frame_copy; 
     53         
     54        int m_FrameNum; 
    5355}; 
  • foam/trunk/faceclassifier/src/FaceBank.cpp

    r94 r95  
    5151{ 
    5252        // Subtract the mean as an attempt to deal with global lighting changes 
    53         face.SubMean(); 
     53        //face.SubMean(); 
    5454         
    5555        m_Classifier->AddFeature(ID,face.Scale(m_FaceWidth,m_FaceHeight).RGB2GRAY().ToFloatVector()); 
     
    6262{ 
    6363        // Subtract the mean as an attempt to deal with global lighting changes 
    64         face.SubMean(); 
     64        //face.SubMean(); 
    6565         
    6666        float error; 
     
    6868 
    6969        // if the error is less than the threshold, return the id 
    70         if (error<m_ErrorThresh) 
     70        //if (error<m_ErrorThresh) 
    7171        { 
    7272                return 1-error; 
  • foam/trunk/faceclassifier/src/FaceBank.h

    r94 r95  
    5555        void Save(const std::string &filename) const; 
    5656        void Load(const std::string &filename); 
     57         
     58        Classifier *GetClassifier() { return m_Classifier; } 
    5759 
    5860private:         
  • foam/trunk/vision/src/Classifier.cpp

    r94 r95  
    3535        // possibly overkill to do this each time we add a new feature... 
    3636        CalcGroupMeans(); 
     37        //m_GroupMeans[group]=v; 
    3738} 
    3839 
     
    5859                i!=m_Features.end(); ++i) 
    5960        { 
    60                 Vector<float> mean; 
     61                Vector<float> mean(m_FeatureSize); 
     62                mean.Zero(); 
    6163                for (FeatureVec::iterator vi = i->second.begin(); vi!=i->second.end(); ++vi) 
    6264                { 
    6365                        mean+=*vi; 
    6466                } 
    65                 mean/=i->second.size(); 
     67                mean/=i->second.size();          
    6668                m_GroupMeans[i->first]=mean; 
    6769        } 
  • foam/trunk/vision/src/Classifier.h

    r94 r95  
    3535        virtual int Classify(const Vector<float> &f, float &error) = 0; 
    3636         
     37        bool GroupExists(int g) { return m_GroupMeans.find(g)!=m_GroupMeans.end(); } 
     38        Vector<float> GetGroupMean(int g) { return m_GroupMeans[g]; } 
     39         
    3740protected: 
    3841         
  • foam/trunk/vision/src/Image.cpp

    r94 r95  
    183183        cvSetImageROI(m_Image,roi); 
    184184        newimage = cvCreateImage( cvSize(roi.width, roi.height), m_Image->depth, m_Image->nChannels ); 
    185         cvCopy(m_Image,newimage); 
    186         cvReleaseImage(&m_Image); 
     185        cvCopy(m_Image,newimage);        
     186        cvResetImageROI(m_Image); 
    187187        return newimage; 
    188188} 
  • foam/trunk/vision/src/PCA.h

    r94 r95  
    5151        const Vector<float> &GetMean() const { return m_Mean; } 
    5252        unsigned int GetFeatureSize() const { return m_FeatureSize; } 
     53        unsigned int GetParamsSize() const { return m_EigenTransform.GetRows(); } 
    5354         
    5455         
  • foam/trunk/vision/src/PCAClassifier.cpp

    r94 r95  
    2121 
    2222PCAClassifier::PCAClassifier(const PCA &pca) : 
    23 Classifier(pca.GetFeatureSize()), 
     23Classifier(pca.GetParamsSize()), 
    2424m_PCA(pca) 
    2525{ 
     
    3232void PCAClassifier::AddFeature(int group, const Vector<float> &f) 
    3333{ 
    34         AddFeatureToGroup(group, m_PCA.Project(f)); 
     34        Vector<float> p=m_PCA.Project(f); 
     35        AddFeatureToGroup(group, p); 
    3536} 
    3637 
  • foam/trunk/vision/src/PCAClassifier.h

    r94 r95  
    3636        virtual int Classify(const Vector<float> &f, float &error); 
    3737 
     38        PCA &GetPCA() { return m_PCA; } 
     39 
    3840private: 
    3941        void Refresh(); 
Note: See TracChangeset for help on using the changeset viewer.