/* Programa para captura de imagens com uma camera */ /* Trabalho 1 - Fundamentos da Computacao Grafica */ /* 2004.1 - Marcelo Gattass */ #include #include #include #include "glut.h" #include "imvideocapture.h" /* modulo de captura de imagens de cameras */ #include "filters.h" #include "image.h" /* nosso modulo de imagens */ #include "hide_background.h" #include "find_edges.h" #include "vectorization.h" #define NFRAMES 100 #define N_IMG_AUX 9 /* Variaveis Globais */ int width=640, height=480; /* largura e altura da janela */ imVideoCapture* myVideoCap; /* video capturado */ unsigned char *data=NULL; /* aponta para o buffer RGB da imagem corrente */ unsigned char *displayed_image=NULL; unsigned char showOriginal=1; unsigned char extractionMode=1; Image curr_image=NULL; Image img_aux[N_IMG_AUX]; Image bmask=NULL; objectSet objects_; double pixel2MM; double porcent_found_=0; int porcent_count_=0; int pattern_found_=0; /* funcao (callback) chamada toda vez que ocorre um evendo de display na glut */ /* ou seja, quando a janela e' exibida. */ void display(void) { int i, j, xc, yc; char msg[255]; /* define a projecao ortografica em xy na janela {(0,0), (width,height)} */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D (0.0, (GLdouble)width, 0.0, (GLdouble)height); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); /* Desenha a imagem capturada a partir da posicao (0,0) da janela */ glRasterPos2f(0.f,0.f); displayed_image = data; objects_.clear(); if(!showOriginal) { if(curr_image!=NULL) { switch(extractionMode) { case 1: blackAndWhite(data, imgGetBuffer(img_aux[1]), width, height); gaussiano2(imgGetBuffer(img_aux[1]), imgGetBuffer(img_aux[2]), width, height); displayed_image = imgGetBuffer(img_aux[2]); break; case 2: blackAndWhite(data, data, width, height); canny(data, imgGetBuffer(img_aux[1]), imgGetBuffer(img_aux[2]), width, height); displayed_image = imgGetBuffer(img_aux[1]); break; case 3: blackAndWhite(data, data, width, height); gaussiano3(data, imgGetBuffer(img_aux[1]), width, height); canny(imgGetBuffer(img_aux[1]), imgGetBuffer(img_aux[2]), imgGetBuffer(img_aux[3]), width, height); displayed_image = imgGetBuffer(img_aux[2]); break; case 4: blackAndWhite(data, imgGetBuffer(img_aux[1]), width, height); gaussiano2(imgGetBuffer(img_aux[1]), imgGetBuffer(img_aux[2]), width, height); canny(imgGetBuffer(img_aux[2]), imgGetBuffer(img_aux[3]), imgGetBuffer(img_aux[4]), width, height); dilatation(imgGetBuffer(img_aux[3]), imgGetBuffer(img_aux[4]), width, height); erosion(imgGetBuffer(img_aux[4]), imgGetBuffer(img_aux[5]), width, height); displayed_image = imgGetBuffer(img_aux[5]); break; case 5: blackAndWhite(data, imgGetBuffer(img_aux[1]), width, height); gaussiano2(imgGetBuffer(img_aux[1]), imgGetBuffer(img_aux[2]), width, height); sobel(imgGetBuffer(img_aux[2]), imgGetBuffer(img_aux[3]), width, height); makeMask(imgGetBuffer(img_aux[3]), imgGetBuffer(img_aux[4]), 240, width, height); displayed_image = imgGetBuffer(img_aux[4]); break; case 6: blackAndWhite(data, imgGetBuffer(img_aux[1]), width, height); gaussiano2(imgGetBuffer(img_aux[1]), imgGetBuffer(img_aux[2]), width, height); canny(imgGetBuffer(img_aux[2]), imgGetBuffer(img_aux[3]), imgGetBuffer(img_aux[4]), width, height); dilatation(imgGetBuffer(img_aux[3]), imgGetBuffer(img_aux[4]), width, height); erosion(imgGetBuffer(img_aux[4]), imgGetBuffer(img_aux[5]), width, height); vectorizeMask2(imgGetBuffer(img_aux[5]), imgGetBuffer(img_aux[6]), objects_, width, height); displayed_image = imgGetBuffer(img_aux[6]); break; case 7: blackAndWhite(data, imgGetBuffer(img_aux[1]), width, height); gaussiano2(imgGetBuffer(img_aux[1]), imgGetBuffer(img_aux[2]), width, height); canny(imgGetBuffer(img_aux[2]), imgGetBuffer(img_aux[3]), imgGetBuffer(img_aux[4]), width, height); vectorizeMask2(imgGetBuffer(img_aux[3]), imgGetBuffer(img_aux[6]), objects_, width, height); displayed_image = data;//imgGetBuffer(img_aux[7]); break; case 8: blackAndWhite(data, imgGetBuffer(img_aux[1]), width, height); gaussiano2(imgGetBuffer(img_aux[1]), imgGetBuffer(img_aux[2]), width, height); canny(imgGetBuffer(img_aux[2]), imgGetBuffer(img_aux[3]), imgGetBuffer(img_aux[4]), width, height); dilatation(imgGetBuffer(img_aux[3]), imgGetBuffer(img_aux[4]), width, height); erosion(imgGetBuffer(img_aux[4]), imgGetBuffer(img_aux[5]), width, height); vectorizeMask2(imgGetBuffer(img_aux[5]), imgGetBuffer(img_aux[6]), objects_, width, height); getCriticalPoints(objects_, data, width, height); displayed_image = data;//imgGetBuffer(img_aux[7]); break; case 9: blackAndWhite(data, data, width, height); gaussiano1(data, imgGetBuffer(img_aux[1]), width, height); laplaciano(imgGetBuffer(img_aux[1]), imgGetBuffer(img_aux[2]), width, height); displayed_image = imgGetBuffer(img_aux[2]); break; } } } drawObjects(objects_, displayed_image, width, height); if(displayed_image) glDrawPixels (width, height, GL_BGR_EXT, GL_UNSIGNED_BYTE, (GLubyte *) displayed_image); /* Desenha o numero do frame na imagem */ glColor3f(1.0f,0.0f,0.0f); porcent_count_++; if(porcent_count_==100) { porcent_count_ = 0; porcent_found_ = pattern_found_; pattern_found_ = 0; } pixel2MM = 1; for(i=0; i