source: foam/trunk/eigentools/src/main.cpp @ 96

Revision 96, 8.2 KB checked in by dave, 10 years ago (diff)

Benchmark testing added for the eigen face recognition

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#define CV_NO_BACKWARD_COMPATIBILITY
18
19#include "cv.h"
20#include "highgui.h"
21
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25#include <assert.h>
26#include <math.h>
27#include <float.h>
28#include <limits.h>
29#include <time.h>
30#include <ctype.h>
31#include <vector>
32
33#ifdef _EiC
34#define WIN32
35#endif
36
37#include "Image.h"
38#include "Matrix.h"
39#include "Vector.h"
40#include "PCA.h"
41#include <glob.h>
42
43using namespace std;
44
45static CvMemStorage* storage = 0;
46
47void detect_and_draw( IplImage* image );
48
49double scale = 1;
50
51//int w=50;
52//int h=80;
53int w=20;
54int h=30;
55
56PCA pca(w*h);
57Vector<float> params(100);
58Image src("../data/images/faces/dave/dave.png");
59
60void Recalc()
61{
62        glob_t g;
63       
64        glob("../data/images/faces/dave/*.png",GLOB_PERIOD,NULL,&g);
65        for (unsigned int n=0; n<g.gl_pathc; n++)
66        {
67                string path=g.gl_pathv[n];
68                cerr<<path<<endl;
69                Image im(path);
70                //im.SubMean();
71                Vector<float> v(im.Scale(w,h).RGB2GRAY().ToFloatVector());
72                v-=v.Mean();
73                pca.AddFeature(v);
74        }
75        globfree (&g);
76       
77        pca.Calculate();
78}
79
80PCA LoadPCA(string filename)
81{
82        PCA pca(1);
83        FILE *f=fopen(filename.c_str(), "rb");
84        pca.Load(f);
85        fclose(f);
86        return pca;
87}
88
89void TestPCA()
90{
91        //Recalc();
92        //FILE *f=fopen("davelight-20x30.pca", "wb");
93        //pca.Save(f);
94        pca = LoadPCA("../data/eigenspaces/spacek-20x30.pca");
95       
96        PCA davelight = LoadPCA("davelight-20x30.pca");
97        //pca.Mult(davelight);
98        pca = davelight;
99       
100        pca.Compress(0,100);
101        src = src.Scale(w,h).RGB2GRAY();
102        Vector<float> d(src.ToFloatVector());   
103        params=pca.Project(d); 
104        params[0]=1;
105
106}
107
108
109
110int main( int argc, char** argv )
111{
112
113        PCA::RunTests();
114        TestPCA();
115
116    CvCapture* capture = 0;
117    IplImage *frame, *frame_copy = 0;
118    IplImage *image = 0;
119    const char* scale_opt = "--scale=";
120    int scale_opt_len = (int)strlen(scale_opt);
121    int i;
122    const char* input_name = 0;
123
124    for( i = 1; i < argc; i++ )
125    {
126        if( strncmp( argv[i], scale_opt, scale_opt_len ) == 0 )
127        {
128            if( !sscanf( argv[i] + scale_opt_len, "%lf", &scale ) || scale < 1 )
129                scale = 1;
130        }
131        else if( argv[i][0] == '-' )
132        {
133            fprintf( stderr, "WARNING: Unknown option %s\n", argv[i] );
134        }
135        else
136            input_name = argv[i];
137    }
138
139    storage = cvCreateMemStorage(0);
140
141    if( !input_name || (isdigit(input_name[0]) && input_name[1] == '\0') )
142        capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );
143    else if( input_name )
144    {
145        image = cvLoadImage( input_name, 1 );
146        if( !image )
147            capture = cvCaptureFromAVI( input_name );
148    }
149    else
150        image = cvLoadImage( "lena.jpg", 1 );
151
152    cvNamedWindow( "result", 1 );
153
154    if( capture )
155    {
156        for(;;)
157        {
158            frame = cvQueryFrame( capture );
159            if( !frame )
160                break;
161            if( !frame_copy )
162                frame_copy = cvCreateImage( cvSize(frame->width,frame->height),
163                                            IPL_DEPTH_8U, frame->nChannels );
164            if( frame->origin == IPL_ORIGIN_TL )
165                cvCopy( frame, frame_copy, 0 );
166            else
167                cvFlip( frame, frame_copy, 0 );
168
169            detect_and_draw( frame_copy );
170
171            if( cvWaitKey( 10 ) >= 0 )
172                goto _cleanup_;
173        }
174
175        cvWaitKey(0);
176_cleanup_:
177        cvReleaseImage( &frame_copy );
178        cvReleaseCapture( &capture );
179    }
180    else
181    {
182        if( image )
183        {
184            detect_and_draw( image );
185            cvWaitKey(0);
186            cvReleaseImage( &image );
187        }
188        else if( input_name )
189        {
190            /* assume it is a text file containing the
191               list of the image filenames to be processed - one per line */
192            FILE* f = fopen( input_name, "rt" );
193            if( f )
194            {
195                char buf[1000+1];
196                while( fgets( buf, 1000, f ) )
197                {
198                    int len = (int)strlen(buf), c;
199                    while( len > 0 && isspace(buf[len-1]) )
200                        len--;
201                    buf[len] = '\0';
202                    printf( "file %s\n", buf );
203                    image = cvLoadImage( buf, 1 );
204                    if( image )
205                    {
206                        detect_and_draw( image );
207                        c = cvWaitKey(0);
208                        if( c == 27 || c == 'q' || c == 'Q' )
209                            break;
210                        cvReleaseImage( &image );
211                    }
212                }
213                fclose(f);
214            }
215        }
216    }
217
218    cvDestroyWindow("result");
219
220    if (storage)
221    {
222        cvReleaseMemStorage(&storage);
223    }
224
225    return 0;
226}
227static CvScalar colors[] =
228    {
229        {{255,255,255}},
230        {{0,128,255}},
231        {{0,255,255}},
232        {{0,255,0}},
233        {{255,128,0}},
234        {{255,255,0}},
235        {{255,0,0}},
236        {{255,0,255}}
237    };
238/*
239void lpbhist(int x, int y, IplImage* img, IplImage* mainimg)
240{
241        IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );
242    cvCvtColor( img, gray, CV_BGR2GRAY );
243    IplImage *lbp = cvCreateImage( cvSize(img->width,img->height), 8, 1 );
244        LBPImage(gray, lbp);
245        unsigned int *h=HistMono8Bit(lbp);
246        BlitImage(lbp,mainimg,cvPoint(x,y));
247        DrawHistogram8(x+img->width, y, -0.1, colors[0], h, lbp);
248        delete[] h;
249        cvReleaseImage( &lbp );
250        cvReleaseImage( &gray );
251}
252*/
253void detect_and_draw( IplImage* img )
254{
255        Image camera(img);
256        CvFont font;
257        cvInitFont( &font, CV_FONT_HERSHEY_PLAIN, 0.5, 0.5, 0, 1, CV_AA );
258
259        //////////////////////////////////
260        // Matrix tests
261        //Matrix<float>::RunTests();
262
263        //////////////////////////////////
264        // test the debayering
265        /*Image im("../data/images/bayer.pgm");
266        im.Crop(300,300,320,240);
267        im.RGB2GRAY();
268        im.BayerGB2RGB();*/
269       
270        //////////////////////////////////
271        // image differencing
272        /*
273        vector<Image> imagevec;
274        //imagevec.push_back(Image("../data/audrey.png"));
275        imagevec.push_back(Image("../data/dave-1.png"));
276        imagevec.push_back(Image("../data/dave-2.png"));
277        imagevec.push_back(Image("../data/amber-1.png"));
278        imagevec.push_back(Image("../data/amber-2.png"));
279        //imagevec.push_back(Image("../data/false.png"));
280
281        for(unsigned int x=0; x<imagevec.size(); x++)
282        {
283                //cvSobel(imagevec[x].m_Image, imagevec[x].m_Image, 2, 2);
284                //cvSmooth(imagevec[x].m_Image, imagevec[x].m_Image, CV_GAUSSIAN, 7);
285                //imagevec[x].SubMean();
286        }
287
288        camera.Clear();
289
290        for(unsigned int x=0; x<imagevec.size(); x++)
291        {
292                camera.Blit(imagevec[x],100+50*x,50);
293        }
294
295        for(unsigned int x=0; x<imagevec.size(); x++)
296        {
297                camera.Blit(imagevec[x],50, 100+50*x);
298        }
299       
300        for(unsigned int x=0; x<imagevec.size(); x++)
301        {
302                for(unsigned int y=0; y<imagevec.size(); y++)
303                {
304                        Image diff=imagevec[x]-imagevec[y];
305                        camera.Blit(diff,100+50*x,100+50*y);
306                        char s[32];
307                        sprintf(s,"%0.5f",1-imagevec[x].SSD(imagevec[y]));
308                        cvPutText(camera.m_Image, s, cvPoint(100+50*x,150+50*y), &font, colors[0]);             
309                }
310        }
311       
312        //camera.Blit(dave1,100,100);
313        //camera.Blit(dave2,140,100);
314        //camera.Blit(other,180,100);
315        */
316       
317        ///////////////////////////////////
318        // PCA display
319        camera.Clear();
320
321        //for (unsigned int i=0; i<pca.GetFeatures().size(); i++)
322        //{
323        //      camera.Blit(Image(30,40,1,pca.GetFeatures()[i]),(i%20)*32,(i/20)*42);
324        //}
325       
326        static float t=0;
327        cerr<<sin(t)<<endl;
328        for (unsigned int i=0; i<100; i++)
329        {
330                camera.Blit(Image(w,h,1,(pca.GetEigenTransform().GetRowVector(i)*50*sin(t))/((i+1) * 1)+pca.GetMean()
331                        ),(i%30)*(w+2),0+(i/30)*(h+2));
332        }
333       
334        t+=0.1;
335       
336        camera.Blit(Image(w,h,1,pca.GetMean()),0,300);
337        camera.Blit(src,60,300);
338        camera.Blit(Image(w,h,1,pca.Synth(params)),120,300);
339
340    cvShowImage("result", camera.m_Image);
341 
342}
343
Note: See TracBrowser for help on using the repository browser.