Changeset 59


Ignore:
Timestamp:
04/15/2009 11:04:48 AM (11 years ago)
Author:
dave
Message:

added load/save

Location:
foam/trunk/simple-faceident
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • foam/trunk/simple-faceident/README

    r36 r59  
    1616mode the program sends the following YARP messages: 
    1717 
    18 Port         Bottle contents                Meaning 
    19 /faceident      "user appeared" ID confidence   A user has entered the view of the camera 
    20 /faceident      "user disappeared" ID           The user has left the camera view 
     18Output port     Bottle contents                 Meaning 
     19/faceident          "user appeared" ID confidence   A user has entered the view of the camera 
     20/faceident          "user disappeared" ID           The user has left the camera view 
     21 
     22You can also drive the program via yarp with the following input messages: 
     23 
     24Input port      Bottle contents                 Meaning 
     25/faceident-ctrl "train" ID                      Train for this user 
     26/faceident-ctrl "detect"                        Switch out of training mode 
     27/faceident-ctrl "save" sessionname              Save the detected faces  
     28/faceident-ctrl "load" sessionname              Load previously detected faces  
     29/faceident-ctrl "clear"                         Clears all faces 
     30 
     31Faces are saved in png format along with a text file to map them to id numbers. The sessionname  
     32will be prepended onto the filenames for the text file and the image files, so you can save  
     33multiple sessions. 
    2134 
    2235Key                 Meaning 
     
    3750Todo: 
    3851* Try normalised cross correlation instead of image differencing 
     52* Expose image size and error threshold via yarp 
     53* Use tinyxml or something better for the serialisation 
    3954 
    4055Questions to: 
  • foam/trunk/simple-faceident/src/FaceBank.cpp

    r14 r59  
    1717#include "FaceBank.h" 
    1818#include "ImageUtils.h" 
     19#include "highgui.h" 
     20 
     21#include <vector> 
    1922 
    2023using namespace std; 
     24 
     25///////////////////////////////////////////////////////////////////////////////// 
     26// util for loading 
     27 
     28int SplitString(const string& input, const string& delimiter, vector<string>& results, bool includeEmpties) 
     29{ 
     30    int iPos = 0; 
     31    int newPos = -1; 
     32    int sizeS2 = (int)delimiter.size(); 
     33    int isize = (int)input.size(); 
     34 
     35    if(isize == 0 || sizeS2 == 0) 
     36    { 
     37        return 0; 
     38    } 
     39 
     40    vector<int> positions; 
     41    newPos = input.find (delimiter, 0); 
     42 
     43    if( newPos < 0 ) return 0;  
     44 
     45    int numFound = 0; 
     46 
     47    while( newPos >= iPos ) 
     48    { 
     49        numFound++; 
     50        positions.push_back(newPos); 
     51        iPos = newPos; 
     52        newPos = input.find (delimiter, iPos+sizeS2); 
     53    } 
     54 
     55    if( numFound == 0 ) return 0; 
     56 
     57    for( int i=0; i <= (int)positions.size(); ++i ) 
     58    { 
     59        string s(""); 
     60        if( i == 0 )  
     61        {  
     62            s = input.substr( i, positions[i] );  
     63        } 
     64        int offset = positions[i-1] + sizeS2; 
     65        if( offset < isize ) 
     66        { 
     67            if( i == (int)positions.size() ) 
     68            { 
     69                s = input.substr(offset); 
     70            } 
     71            else if( i > 0 ) 
     72            { 
     73                s = input.substr( positions[i-1] + sizeS2,  
     74                      positions[i] - positions[i-1] - sizeS2 ); 
     75            } 
     76        } 
     77        if( includeEmpties || ( s.size() > 0 ) ) 
     78        { 
     79            results.push_back(s); 
     80        } 
     81    } 
     82    return numFound; 
     83} 
    2184 
    2285///////////////////////////////////////////////////////////////////////////////// 
     
    75138        } 
    76139        m_FaceMap.clear(); 
     140} 
     141 
     142void FaceBank::Save(const std::string &filename) const 
     143{ 
     144        char fn[256]; 
     145        snprintf(fn,256,"%s.dat",filename.c_str()); 
     146        FILE *f=fopen(fn,"w"); 
     147         
     148        if (f==NULL) 
     149        { 
     150                cerr<<"could not open file for saving: "<<filename<<endl; 
     151                return; 
     152        } 
     153 
     154        char header[1024]; 
     155        snprintf(header,1024,"%d\n%d\n",0,m_FaceMap.size()); 
     156        fwrite(header,strlen(header),1,f); 
     157         
     158        for(map<unsigned int,Face*>::const_iterator i=m_FaceMap.begin(); i!=m_FaceMap.end(); ++i) 
     159        { 
     160                char fn[256]; 
     161                snprintf(fn,256,"%d\n%s-%d.png\n",i->first,filename.c_str(),i->first); 
     162                fwrite(fn,strlen(fn),1,f); 
     163        } 
     164        fclose(f); 
     165         
     166        for(map<unsigned int,Face*>::const_iterator i=m_FaceMap.begin(); i!=m_FaceMap.end(); ++i) 
     167        { 
     168                char fn[256]; 
     169                snprintf(fn,256,"%s-%d.png",filename.c_str(),i->first); 
     170                cvSaveImage(fn,i->second->m_Image); 
     171        } 
     172} 
     173 
     174void FaceBank::Load(const std::string &filename) 
     175{ 
     176        Clear(); 
     177 
     178        char fn[256]; 
     179        snprintf(fn,256,"%s.dat",filename.c_str()); 
     180        FILE *f=fopen(fn,"r"); 
     181         
     182        if (f==NULL) 
     183        { 
     184                cerr<<"file not found: "<<filename<<endl; 
     185                return; 
     186        } 
     187         
     188        fseek(f,0,SEEK_END); 
     189        unsigned int size=ftell(f); 
     190        fseek(f,0,SEEK_SET); 
     191         
     192        if (size==0) 
     193        { 
     194                fclose(f); 
     195                cerr<<"empty file: "<<filename<<endl; 
     196                return; 
     197        } 
     198 
     199        if (size<0) 
     200        { 
     201                fclose(f); 
     202                cerr<<"error loading file: "<<filename<<" size: "<<size<<"??"<<endl; 
     203                return; 
     204        } 
     205 
     206        char *data=new char[size+1];             
     207        fread(data,1,size,f); 
     208        data[size]='\0'; 
     209        fclose(f); 
     210         
     211        vector<string> items; 
     212        SplitString(data,"\n",items,true); 
     213 
     214        if (items.size()>3) 
     215        { 
     216                int version=(int)atoi(items[0].c_str()); 
     217                int count=(int)atoi(items[1].c_str()); 
     218                for (int i=2; i<count*2+2; i+=2) 
     219                { 
     220                        int ID=(int)atoi(items[i].c_str()); 
     221                        m_FaceMap[ID]=new Face(cvLoadImage(items[i+1].c_str())); 
     222                } 
     223        } 
    77224} 
    78225 
  • foam/trunk/simple-faceident/src/FaceBank.h

    r58 r59  
    6666        unsigned int GetFaceHeight() { return m_FaceHeight; } 
    6767 
     68        void Save(const std::string &filename) const; 
     69        void Load(const std::string &filename); 
     70 
    6871private:         
    6972 
  • foam/trunk/simple-faceident/src/main.cpp

    r58 r59  
    297297                if (b!=NULL) 
    298298                { 
    299                         cerr<<"got bottle "<<b->toString().c_str()<<endl; 
    300299                        if (b->get(0).asString()=="train") 
    301300                        { 
     
    310309                        { 
    311310                                learn=false; 
     311                        } 
     312                        else if (b->get(0).asString()=="load") 
     313                        { 
     314                                facebank.Load(b->get(1).asString().c_str()); 
     315                        } 
     316                        else if (b->get(0).asString()=="save") 
     317                        { 
     318                                facebank.Save(b->get(1).asString().c_str()); 
    312319                        } 
    313320                } 
Note: See TracChangeset for help on using the changeset viewer.