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

Revision 93, 7.2 KB checked in by dave, 10 years ago (diff)

more moving around things

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