source: libs/magicsquares/eigentools/src/main.cpp @ 205

Revision 113, 9.6 KB checked in by dave, 11 years ago (diff)

first pass expression recgn

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 "FileTools.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 Generate(PCA &pca, const string &imagepath)
61{
62        vector<string> images=Glob(imagepath);
63        for (vector<string>::iterator i=images.begin(); i!=images.end(); i++)
64        {
65                cerr<<*i<<endl;
66                Image im(*i);
67                Vector<float> v(im.Scale(w,h).RGB2GRAY().ToFloatVector());
68                v-=v.Mean();
69                pca.AddFeature(v);
70        }       
71        pca.Calculate();
72}
73
74PCA MakeSubspace(const PCA &space, const string &imagepath)
75{
76        PCA subspace(space.GetFeatureSize());
77       
78        // find the transform based on the parameters
79        vector<string> images=Glob(imagepath);
80        for (vector<string>::iterator i=images.begin(); i!=images.end(); i++)
81        {
82                cerr<<*i<<endl;
83                Image im(*i);
84                Vector<float> v(im.Scale(w,h).RGB2GRAY().ToFloatVector());
85                v-=v.Mean();
86                subspace.AddFeature(space.Project(v));
87        }
88       
89        subspace.Calculate();
90
91        // project back each row
92        // think there must be a much much better way to do this...
93        for (int i=0; i<subspace.EigenTransform().GetRows(); i++)
94        {
95                cerr<<"row: "<<i<<endl;
96                Vector<float> row = subspace.EigenTransform().GetRowVector(i);
97                subspace.EigenTransform().SetRowVector(i,
98                        pca.Synth(row));
99        }
100
101        return subspace;
102}
103
104PCA LoadPCA(string filename)
105{
106        PCA pca(1);
107        FILE *f=fopen(filename.c_str(), "rb");
108        pca.Load(f);
109        fclose(f);
110        return pca;
111}
112
113void SavePCA(const PCA &pca, string filename)
114{
115        FILE *f=fopen(filename.c_str(), "wb");
116        pca.Save(f);
117        fclose(f);
118}
119
120void TestPCA()
121{
122        //Recalc();
123        //FILE *f=fopen("davelight-20x30.pca", "wb");
124        //pca.Save(f);
125        //pca = LoadPCA("../no-redist/eigenspaces/spacek-50x80.pca");
126        pca = LoadPCA("../no-redist/eigenspaces/yalefaces-expression-20x30.pca");
127        //PCA subspace = LoadPCA("../data/eigenspaces/davelight-spacek-20x30.pca");
128               
129        //pca.EigenTransform() *= subspace.EigenTransform().Transposed();
130       
131        //PCA davesubspace = MakeSubspace(pca,"../data/images/faces/dave/*.png");
132        //SavePCA(davesubspace,"davelight-spacek-20x30.pca");
133               
134        pca.Compress(0,100);
135       
136        src = src.Scale(w,h).RGB2GRAY();
137        Vector<float> d(src.ToFloatVector());   
138        params=pca.Project(d); 
139        params[0]=1;
140
141}
142
143
144
145int main( int argc, char** argv )
146{
147
148        PCA::RunTests();
149        TestPCA();
150
151    CvCapture* capture = 0;
152    IplImage *frame, *frame_copy = 0;
153    IplImage *image = 0;
154    const char* scale_opt = "--scale=";
155    int scale_opt_len = (int)strlen(scale_opt);
156    int i;
157    const char* input_name = 0;
158
159    for( i = 1; i < argc; i++ )
160    {
161        if( strncmp( argv[i], scale_opt, scale_opt_len ) == 0 )
162        {
163            if( !sscanf( argv[i] + scale_opt_len, "%lf", &scale ) || scale < 1 )
164                scale = 1;
165        }
166        else if( argv[i][0] == '-' )
167        {
168            fprintf( stderr, "WARNING: Unknown option %s\n", argv[i] );
169        }
170        else
171            input_name = argv[i];
172    }
173
174    storage = cvCreateMemStorage(0);
175
176    if( !input_name || (isdigit(input_name[0]) && input_name[1] == '\0') )
177        capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );
178    else if( input_name )
179    {
180        image = cvLoadImage( input_name, 1 );
181        if( !image )
182            capture = cvCaptureFromAVI( input_name );
183    }
184    else
185        image = cvLoadImage( "lena.jpg", 1 );
186
187    cvNamedWindow( "result", 1 );
188
189    if( capture )
190    {
191        for(;;)
192        {
193            frame = cvQueryFrame( capture );
194            if( !frame )
195                break;
196            if( !frame_copy )
197                frame_copy = cvCreateImage( cvSize(frame->width,frame->height),
198                                            IPL_DEPTH_8U, frame->nChannels );
199            if( frame->origin == IPL_ORIGIN_TL )
200                cvCopy( frame, frame_copy, 0 );
201            else
202                cvFlip( frame, frame_copy, 0 );
203
204            detect_and_draw( frame_copy );
205
206            if( cvWaitKey( 10 ) >= 0 )
207                goto _cleanup_;
208        }
209
210        cvWaitKey(0);
211_cleanup_:
212        cvReleaseImage( &frame_copy );
213        cvReleaseCapture( &capture );
214    }
215    else
216    {
217        if( image )
218        {
219            detect_and_draw( image );
220            cvWaitKey(0);
221            cvReleaseImage( &image );
222        }
223        else if( input_name )
224        {
225            /* assume it is a text file containing the
226               list of the image filenames to be processed - one per line */
227            FILE* f = fopen( input_name, "rt" );
228            if( f )
229            {
230                char buf[1000+1];
231                while( fgets( buf, 1000, f ) )
232                {
233                    int len = (int)strlen(buf), c;
234                    while( len > 0 && isspace(buf[len-1]) )
235                        len--;
236                    buf[len] = '\0';
237                    printf( "file %s\n", buf );
238                    image = cvLoadImage( buf, 1 );
239                    if( image )
240                    {
241                        detect_and_draw( image );
242                        c = cvWaitKey(0);
243                        if( c == 27 || c == 'q' || c == 'Q' )
244                            break;
245                        cvReleaseImage( &image );
246                    }
247                }
248                fclose(f);
249            }
250        }
251    }
252
253    cvDestroyWindow("result");
254
255    if (storage)
256    {
257        cvReleaseMemStorage(&storage);
258    }
259
260    return 0;
261}
262static CvScalar colors[] =
263    {
264        {{255,255,255}},
265        {{0,128,255}},
266        {{0,255,255}},
267        {{0,255,0}},
268        {{255,128,0}},
269        {{255,255,0}},
270        {{255,0,0}},
271        {{255,0,255}}
272    };
273/*
274void lpbhist(int x, int y, IplImage* img, IplImage* mainimg)
275{
276        IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );
277    cvCvtColor( img, gray, CV_BGR2GRAY );
278    IplImage *lbp = cvCreateImage( cvSize(img->width,img->height), 8, 1 );
279        LBPImage(gray, lbp);
280        unsigned int *h=HistMono8Bit(lbp);
281        BlitImage(lbp,mainimg,cvPoint(x,y));
282        DrawHistogram8(x+img->width, y, -0.1, colors[0], h, lbp);
283        delete[] h;
284        cvReleaseImage( &lbp );
285        cvReleaseImage( &gray );
286}
287*/
288void detect_and_draw( IplImage* img )
289{
290        Image camera(img);
291        CvFont font;
292        cvInitFont( &font, CV_FONT_HERSHEY_PLAIN, 0.5, 0.5, 0, 1, CV_AA );
293
294        //////////////////////////////////
295        // Matrix tests
296        //Matrix<float>::RunTests();
297
298        //////////////////////////////////
299        // test the debayering
300        /*Image im("../data/images/bayer.pgm");
301        im.Crop(300,300,320,240);
302        im.RGB2GRAY();
303        im.BayerGB2RGB();*/
304       
305        //////////////////////////////////
306        // image differencing
307        /*
308        vector<Image> imagevec;
309        //imagevec.push_back(Image("../data/audrey.png"));
310        imagevec.push_back(Image("../data/dave-1.png"));
311        imagevec.push_back(Image("../data/dave-2.png"));
312        imagevec.push_back(Image("../data/amber-1.png"));
313        imagevec.push_back(Image("../data/amber-2.png"));
314        //imagevec.push_back(Image("../data/false.png"));
315
316        for(unsigned int x=0; x<imagevec.size(); x++)
317        {
318                //cvSobel(imagevec[x].m_Image, imagevec[x].m_Image, 2, 2);
319                //cvSmooth(imagevec[x].m_Image, imagevec[x].m_Image, CV_GAUSSIAN, 7);
320                //imagevec[x].SubMean();
321        }
322
323        camera.Clear();
324
325        for(unsigned int x=0; x<imagevec.size(); x++)
326        {
327                camera.Blit(imagevec[x],100+50*x,50);
328        }
329
330        for(unsigned int x=0; x<imagevec.size(); x++)
331        {
332                camera.Blit(imagevec[x],50, 100+50*x);
333        }
334       
335        for(unsigned int x=0; x<imagevec.size(); x++)
336        {
337                for(unsigned int y=0; y<imagevec.size(); y++)
338                {
339                        Image diff=imagevec[x]-imagevec[y];
340                        camera.Blit(diff,100+50*x,100+50*y);
341                        char s[32];
342                        sprintf(s,"%0.5f",1-imagevec[x].SSD(imagevec[y]));
343                        cvPutText(camera.m_Image, s, cvPoint(100+50*x,150+50*y), &font, colors[0]);             
344                }
345        }
346       
347        //camera.Blit(dave1,100,100);
348        //camera.Blit(dave2,140,100);
349        //camera.Blit(other,180,100);
350        */
351       
352        ///////////////////////////////////
353        // PCA display
354        camera.Clear();
355
356        //for (unsigned int i=0; i<pca.GetFeatures().size(); i++)
357        //{
358        //      camera.Blit(Image(30,40,1,pca.GetFeatures()[i]),(i%20)*32,(i/20)*42);
359        //}
360       
361        static float t=0;
362
363        for (unsigned int i=0; i<100; i++)
364        {
365                camera.Blit(Image(w,h,1,(pca.GetEigenTransform().GetRowVector(i)*100*sin(t))/((i+1) * 0.5)+pca.GetMean()
366                        ),(i%12)*(w+2),0+(i/12)*(h+2));
367                //camera.Blit(Image(w,h,1,pca.GetEigenTransform().GetRowVector(i)*5+pca.GetMean()
368                //      ),(i%10)*(w+2),0+(i/10)*(h+2));
369        }
370       
371        t+=0.05;
372       
373        static int frame=0;
374        char fn[256];
375        snprintf(fn,256,"out-%06d.jpg",frame);
376        cvSaveImage(fn,camera.m_Image);
377        frame++;
378       
379        //camera.Blit(Image(w,h,1,pca.GetMean()),0,300);
380        //camera.Blit(src,60,300);
381        //camera.Blit(Image(w,h,1,pca.Synth(params)),120,300);
382
383    cvShowImage("result", camera.m_Image);
384 
385}
386
Note: See TracBrowser for help on using the repository browser.