source: foam/trunk/faceclassifier/src/App.cpp @ 94

Revision 94, 4.1 KB checked in by dave, 10 years ago (diff)

added face classifier application, not working yet

Line 
1// Copyright (C) 2009 foam
2//
3// This program is free software; you can redistribute it and/or modify
4// it under the terms of the GNU General Public License as published by
5// the Free Software Foundation; either version 2 of the License, or
6// (at your option) any later version.
7//
8// This program is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11// GNU General Public License for more details.
12//
13// You should have received a copy of the GNU General Public License
14// along with this program; if not, write to the Free Software
15// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16
17#include <assert.h>
18#include "App.h"
19#include "PCAClassifier.h"
20
21using namespace std;
22
23App::App(const string &filename) :
24frame(NULL),
25frame_copy(NULL)
26{
27        m_CtrlPort.open("/faceident-ctrl");
28        m_Cascade = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt.xml", 0, 0, 0);
29        assert(m_Cascade);
30        m_Storage = cvCreateMemStorage(0);
31       
32        if (filename=="")
33        {
34                m_Capture = cvCaptureFromCAM(0);
35        }
36        else
37        {
38                m_Capture = cvCaptureFromAVI(filename.c_str());
39        }
40       
41        assert(m_Capture);
42       
43        int w=50;
44        int h=80;
45       
46        PCA pca(w*h);
47        FILE *f=fopen("../data/eigenspaces/spacek-50x80.pca", "rb");
48        pca.Load(f);
49        fclose(f);
50        pca.Compress(0,100);
51       
52        m_Classifier = new PCAClassifier(pca);
53        m_FaceBank = new FaceBank(w,h,0.2,0.1,m_Classifier);
54        cvInitFont( &m_Font, CV_FONT_HERSHEY_PLAIN, 0.5, 0.5, 0, 1, CV_AA );
55   
56        cvNamedWindow( "face classifier", 1 );
57}
58
59App::~App()
60{
61}
62
63static CvScalar colors[] =
64    {
65        {{255,255,255}},
66        {{0,128,255}},
67        {{0,255,255}},
68        {{0,255,0}},
69        {{255,128,0}},
70        {{255,255,0}},
71        {{255,0,0}},
72        {{255,0,255}}
73    };
74
75void App::Update()
76{       
77        frame = cvQueryFrame( m_Capture );
78    if( !frame )
79        {
80                cerr<<"no frame captured"<<endl;
81                return;
82        }
83       
84    if( !frame_copy )
85        frame_copy = cvCreateImage( cvSize(frame->width,frame->height),
86                                    IPL_DEPTH_8U, frame->nChannels );
87    if( frame->origin == IPL_ORIGIN_TL )
88        cvCopy( frame, frame_copy, 0 );
89    else
90        cvFlip( frame, frame_copy, 0 );
91       
92        /////////////////////////
93       
94        Image camera(frame_copy);
95       
96        cvClearMemStorage(m_Storage);
97
98        CvSeq* faces = cvHaarDetectObjects( camera.m_Image, m_Cascade, m_Storage,
99                        1.1, 2, 0
100                        //|CV_HAAR_FIND_BIGGEST_OBJECT
101                        //|CV_HAAR_DO_ROUGH_SEARCH
102                        //|CV_HAAR_DO_CANNY_PRUNING
103                        //|CV_HAAR_SCALE_IMAGE
104                        ,
105                        cvSize(30, 30) );
106               
107        ///////////////////////////////////
108        // dispatch from input
109
110        int key=cvWaitKey(10);
111               
112        switch (key)
113        {
114                case 'd': m_Learn=false; break;
115                case '1': m_FaceNum=1; m_Learn=true; break;
116                case '2': m_FaceNum=2; m_Learn=true; break;
117                case '3': m_FaceNum=3; m_Learn=true; break;
118                case '4': m_FaceNum=4; m_Learn=true; break;
119                case '5': m_FaceNum=5; m_Learn=true; break;
120                case '6': m_FaceNum=6; m_Learn=true; break;
121                case '7': m_FaceNum=7; m_Learn=true; break;
122                case '8': m_FaceNum=8; m_Learn=true; break;
123                case '9': m_FaceNum=9; m_Learn=true; break;
124                case '0': m_FaceNum=0; m_Learn=true; break;
125                case 'c': m_FaceBank->Clear(); break;
126        }
127                       
128        for(int i = 0; i < (faces ? faces->total : 0); i++ )
129        {
130                CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
131                CvMat small_img_roi;
132
133                unsigned int ID=999;
134                int imagenum=-1;
135                float confidence=0;
136                // get the face area as a sub image
137                Image face = camera.SubImage(r->x, r->y, r->width, r->height);
138                // pass it into the face bank
139                if (m_Learn)
140                {
141                        confidence=m_FaceBank->Suggest(face,m_FaceNum);
142                        ID=m_FaceNum;
143                }
144                else
145                {       
146                        confidence=m_FaceBank->Identify(face,ID,imagenum);
147                }                               
148
149                // if it's recognised the face (should really check the confidence)
150                if (ID!=999)
151                {
152                        char s[32];
153                        sprintf(s,"%d %0.2f",ID,confidence);
154                        cvPutText(camera.m_Image, s, cvPoint(r->x,r->y+r->height-5), &m_Font, colors[0]);
155
156                        if (!m_Learn)
157                        {
158                                m_SceneState.AddPresent(ID, SceneState::User(confidence));
159                        }
160                }
161
162                cvRectangle(camera.m_Image, cvPoint(r->x,r->y), cvPoint(r->x+r->width,r->y+r->height), colors[0]);
163        }
164
165        m_SceneState.Update();
166   
167        cvShowImage("face classifier", camera.m_Image);
168
169}
170
Note: See TracBrowser for help on using the repository browser.