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

Revision 85, 5.9 KB checked in by dave, 11 years ago (diff)

started writing the LDA classifier

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