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

Revision 86, 6.8 KB checked in by dave, 11 years ago (diff)

lots of code added - pca implementation for eigenfaces and lda started

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