source: foam/trunk/vision/src/main.cpp @ 89

Revision 89, 6.7 KB checked in by dave, 11 years ago (diff)

renamed faceident as it's not so simple these days

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