source: proiecte/PPPP/eigenface/new/test.c @ 89

Last change on this file since 89 was 89, checked in by (none), 14 years ago

added new

File size: 5.7 KB
Line 
1#include <stdio.h>
2#include <string.h>
3#include "cv.h"
4#include "cvaux.h"
5#include "highgui.h"
6
7IplImage ** faceImgArr          = 0; // array of face images
8IplImage * pAvgTrainImg         = 0;
9int nTrainFaces                         = 0;
10char win_name[20];
11
12int loadFaceImgArray(char * filename)
13{
14        FILE * imgListFile = 0;
15        char imgFilename[512];
16        int iFace, nFaces=0;
17
18
19        // open the input file
20        if( !(imgListFile = fopen(filename, "r")) )
21        {
22                fprintf(stderr, "Can\'t open file %s\n", filename);
23                return 0;
24        }
25
26        // count the number of faces
27        while( fgets(imgFilename, 512, imgListFile) ) ++nFaces;
28        rewind(imgListFile);
29
30        // allocate the face-image array and person number matrix
31        faceImgArr        = (IplImage **)cvAlloc( nFaces*sizeof(IplImage *) );
32       
33        // store the face images in an array
34        for(iFace=0; iFace<nFaces; iFace++)
35        {
36                int aux = 0;
37                // read person number and name of image file
38                fscanf(imgListFile, "%d %s", &aux, imgFilename);
39                // load the face image
40                faceImgArr[iFace] = cvLoadImage(imgFilename, CV_LOAD_IMAGE_GRAYSCALE);
41
42                if( !faceImgArr[iFace] )
43                {
44                        fprintf(stderr, "Can\'t load image from %s\n", imgFilename);
45                        return 0;
46                }
47        }
48
49        fclose(imgListFile);
50
51        return nFaces;
52}
53
54void calcMeanImage(int nrFaces, IplImage** imgArray, int faceStep, 
55                                        CvSize size, float *avg, int avgStep) 
56{
57        int i,j,k;
58        float m = 1.0f / (float) nrFaces;
59        float* bf = avg;
60       
61        for( i = 0; i < size.height; i++, bf += avgStep)
62                for( j = 0; j < size.width; j++ )
63                        bf[j] = 0.f;
64       
65        for( i = 0; i < nrFaces; i++ )
66        {
67                uchar* bu    = (uchar *)imgArray[i]->imageData;
68                bf  = avg;
69                for( k = 0; k < size.height; k++, bf += avgStep, bu += faceStep )
70                        for( j = 0; j < size.width; j++ )
71                                bf[j] += bu[j];
72        }
73       
74        bf = avg;
75        for( i = 0; i < size.height; i++, bf += avgStep)
76                for( j = 0; j < size.width; j++ ) {
77                        bf[j] *= m;
78                }
79}
80
81void calcCovarMatrix(int nrFaces, IplImage** imgArray, int faceStep, 
82                                CvSize size, float *avg, int avgStep, float *covarMatrix) 
83{
84        int i,j,k,l;
85       
86        for( i = 0; i < nrFaces; i++ )
87        {
88            uchar *bu = (uchar *)imgArray[i]->imageData;
89
90            for( j = i; j < nrFaces; j++ )
91            {
92                int k, l;
93                float w = 0.f;
94                float *a = avg;
95                uchar *bu1 = bu;
96                uchar *bu2 = (uchar *)imgArray[j]->imageData;
97
98                for( k = 0; k < size.height;
99                     k++, bu1 += faceStep, bu2 += faceStep, a += avgStep )
100                {
101                    for( l = 0; l < size.width - 3; l += 4 )
102                    {
103                        float f = a[l];
104                        uchar u1 = bu1[l];
105                        uchar u2 = bu2[l];
106
107                        w += (u1 - f) * (u2 - f);
108                        f = a[l + 1];
109                        u1 = bu1[l + 1];
110                        u2 = bu2[l + 1];
111                        w += (u1 - f) * (u2 - f);
112                        f = a[l + 2];
113                        u1 = bu1[l + 2];
114                        u2 = bu2[l + 2];
115                        w += (u1 - f) * (u2 - f);
116                        f = a[l + 3];
117                        u1 = bu1[l + 3];
118                        u2 = bu2[l + 3];
119                        w += (u1 - f) * (u2 - f);
120                    }
121                    for( ; l < size.width; l++ )
122                    {
123                        float f = a[l];
124                        uchar u1 = bu1[l];
125                        uchar u2 = bu2[l];
126
127                        w += (u1 - f) * (u2 - f);
128                    }
129                }
130
131                covarMatrix[i * nrFaces + j] = covarMatrix[j * nrFaces + i] = w;
132            }
133        }
134}
135
136int main(int argc, char *argv[]) {
137        int faceImgStep, avgStep;
138        CvSize faceImgSize;
139        float *covarMat;
140        float *eigVect;
141        float *eigValue;
142       
143        // load training data
144        nTrainFaces = loadFaceImgArray("train.txt");
145        if( nTrainFaces < 2 )
146        {
147                fprintf(stderr,
148                        "Need 2 or more training faces\n"
149                        "Input file contains only %d\n", nTrainFaces);
150                return;
151        }
152       
153        faceImgSize.width  = faceImgArr[0]->width;
154        faceImgSize.height = faceImgArr[0]->height;
155        faceImgStep = faceImgArr[0]->widthStep/sizeof(uchar);
156        pAvgTrainImg = cvCreateImage(faceImgSize, IPL_DEPTH_32F, 1);
157        avgStep = pAvgTrainImg->widthStep/sizeof(float);
158       
159        calcMeanImage( nTrainFaces, 
160                                faceImgArr, 
161                                faceImgStep, 
162                                faceImgSize, 
163                                (float *)pAvgTrainImg->imageData, 
164                                avgStep );
165       
166        covarMat = (float *) cvAlloc( sizeof( float ) * nTrainFaces * nTrainFaces );
167       
168        calcCovarMatrix( nTrainFaces, 
169                                faceImgArr, 
170                                faceImgStep, 
171                                faceImgSize, 
172                                (float *)pAvgTrainImg->imageData, 
173                                avgStep,
174                                covarMat );
175       
176        eigVect = (float *) cvAlloc( sizeof( float ) * nTrainFaces * nTrainFaces);
177        eigVals = (float *) cvAlloc( sizeof( float ) * nTrainFaces );
178       
179        // jacobi call
180       
181       
182        //~ /* Eigen objects number determination */
183        //~ if( calcLimit->type != CV_TERMCRIT_NUMBER )
184        //~ {
185                //~ for( i = 0; i < m1; i++ )
186                        //~ if( fabs( eigVals[i] / eigVals[0] ) < calcLimit->epsilon )
187                                //~ break;
188                //~ m1 = calcLimit->max_iter = i;
189        //~ }
190        //~ else
191                //~ m1 = calcLimit->max_iter;
192        //~ calcLimit->epsilon = (float) fabs( eigVals[m1 - 1] / eigVals[0] );
193
194        //~ for( i = 0; i < m1; i++ )
195                //~ eigVals[i] = (float) (1.0 / sqrt( (double)eigVals[i] ));
196       
197        //~ for(i=0; i<nTrainFaces; i++)
198        //~ {   
199                //~ sprintf(win_name,"win %d", i);
200                //~ cvNamedWindow(win_name, CV_WINDOW_AUTOSIZE);
201                //~ cvMoveWindow(win_name, i*100, i*100); // offset from the UL corner of the screen
202                //~ cvShowImage(win_name,faceImgArr[i]);
203        //~ }
204        sprintf(win_name,"win1");
205        cvNamedWindow(win_name, CV_WINDOW_AUTOSIZE); 
206        cvShowImage(win_name,pAvgTrainImg);
207        while(1) {
208                if( (char)27==cvWaitKey(20) ) break;
209        }
210        cvDestroyWindow(win_name);
211       
212        //~ for(i=0; i<nTrainFaces; i++)
213        //~ {   
214                //~ sprintf(win_name,"win %d", i);
215                //~ cvDestroyWindow(win_name);
216        //~ }
217       
218        return 0;
219}
Note: See TracBrowser for help on using the repository browser.