#include // Header File For The GLUT Library #include // Header File For The OpenGL32 Library #include // Header File For The GLu32 Library #include #include #include #include #include #include #include #include "adjust.hh" #include "live.hh" using namespace std; #define IMG_WIDTH 360 #define IMG_HEIGHT 296 #define WIDTH 718 #define HEIGHT 592 int window; Live *live; int width=538; int height=395; static const unsigned nbImg = 4; std::vector *fileList; Live::ImageInput ii; unsigned iFileList; unsigned nnNbColor; Image::PixelFormat pf; int colorToFind; int numSavedImg; /// Chargement d'une texture a partir de donnees RGB unsigned int loadImage(int width, int height, unsigned char *data, unsigned int lastTex) { GLuint tex; if (glIsTexture(lastTex)) glDeleteTextures(1, &lastTex); // Mode de chargement des donnees glPixelStorei (GL_UNPACK_ALIGNMENT, 1); // Creer une id pour stocker l'image glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); // Stocke l'image //glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, data); // Config des parametres glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Retourne l'id de l'image return tex; } /// Initialisation des fonctions OpenGL void initGL(int width, int height) { // Initialisation du mode d'affichage glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Mode de chargement des donnees glPixelStorei (GL_UNPACK_ALIGNMENT, 1); glShadeModel(GL_FLAT); glEnable(GL_TEXTURE_2D); // Remise a zero de la matrice de projection glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Plan de projection en 2D glOrtho(0.0, WIDTH, 0.0, HEIGHT, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); } /// Redimenssionement d'une fenetre void reSizeGLScene(int w, int h) { // Evite div par 0 if (height==0) h=1; height = h; width = w; // Initialise le point de vue glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); // Remise a zero et mode 2D glLoadIdentity(); glOrtho(0.0, WIDTH, 0.0, HEIGHT, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); } /// Affiche une image /// @param texId numero de la texture a afficher void drawImage(GLuint texId) { int wMin, wMax; int hMin, hMax; // Selection de l'image glBindTexture(GL_TEXTURE_2D, live->tex[texId]); // Calcul des coordonnees de l'image wMin = BORDER+(texId%3)*(352+BORDER); wMax = 352+BORDER+(texId%3)*(352+BORDER); hMin = HEIGHT-288-BORDER-(int)(texId/3)*(288+BORDER); hMax = HEIGHT-BORDER-(int)(texId/3)*(288+BORDER); // Dessine un carre contenant l'image glBegin(GL_QUADS); glNormal3f( 0.0f, 0.0f, 1.0f); glColor3f(1.0f,1.0f,1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(wMax, hMax, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(wMin, hMax, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(wMin, hMin, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(wMax, hMin, -1.0f); glEnd(); } /// Dessine les images a l'ecran void drawGLScene() { // Efface le buffer glClear(GL_COLOR_BUFFER_BIT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Affiche toutes les images for (unsigned i=0; isize ()-1)) { ++iFileList; live->updateImg (pf, (*fileList)[iFileList].c_str ()); } } else if (key == 8) { if (iFileList > 0) { --iFileList; live->updateImg (pf, (*fileList)[iFileList].c_str ()); } } else if (key == 'b') { if (colorToFind > -1) { --colorToFind; live->setColorToFind (colorToFind); live->updateImg (pf, (*fileList)[iFileList].c_str ()); std::cout << "Couleur sélectionnée " << colorToFind << std::endl; } } else if (key == 'n') { if (live->oconfig->nnNbColor > colorToFind) { ++colorToFind; live->setColorToFind (colorToFind); live->updateImg (pf, (*fileList)[iFileList].c_str ()); std::cout << "Couleur sélectionnée " << colorToFind << std::endl; } } else if (key == 13) { { live->segm->setMode (pf); live->segm->buildNN (nnNbColor, Segm::generate); live->segm->trainNN (live->img); live->updateImg (pf, (*fileList)[iFileList].c_str ()); } } } else if (ii == Live::cam) { if (key == ' ') live->updateImg (); else if (key == 13) { live->segm->setMode (pf); live->segm->buildNN (nnNbColor, Segm::generate); live->segm->trainNN (live->img); live->updateImg (pf); } else if (key == 's') { std::string f; std::ostringstream n; n << numSavedImg++; f = "cam" + n.str (); if (pf == Image::rgb) f += ".rgb"; else if (pf == Image::yuv) f+= ".yuv"; live->img->writeRaw (f.c_str ()); std::cout << "Image sauvée dans " << f << std::endl; } } if (key == 'r') live->reloadConfig ("rc/vision.conf"); else if (key == 'm') std::cout << "Nombre de couleurs du prochain réseau de neurones : " << ++nnNbColor << std::endl; else if (key == 'l') std::cout << "Nombre de couleurs du prochain réseau de neurones : " << --nnNbColor << std::endl; drawGLScene (); } /// Gestion souris void mouseFunc(int button, int state, int x, int y) { } /// Usage void usage () { std::cerr << "Usage : ./liveView {file, cam, socket} format_image [liste d'images]" << std::endl; exit (1); } /// Analyse la ligne de commande void parseCommandLine (int argc, char **argv, Live::ImageInput &ii, std::vector &list) { if (argc < 3) usage (); std::string str (argv[1]); if (str == "file") ii = Live::file; else if (str == "cam") ii = Live::cam; else if (str == "socket") ii = Live::socket; else usage (); if ((argc < 4) && (ii == Live::file)) usage (); std::string str2 (argv[2]); if (str2 == "rgb") pf = Image::rgb; else if (str2 == "yuv") pf = Image::yuv; else usage (); while (--argc > 2) { std::string *str = new std::string (argv[argc]); list.push_back (*str); std::cout << *str << std::endl; } } /// Fonction principale int main(int argc, char **argv) { fileList = new std::vector; parseCommandLine (argc, argv, ii, *fileList); // Initialisation de l'OpenGL glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowSize(width, height); glutInitWindowPosition(0, 0); window = glutCreateWindow("liveView - APBteam"); glutDisplayFunc(&drawGLScene); glutReshapeFunc(&reSizeGLScene); glutKeyboardFunc(&keyPressed); glutMouseFunc(&mouseFunc); initGL(WIDTH, HEIGHT); iFileList = 0; nnNbColor = 6; colorToFind = -1; numSavedImg = 0; live = new Live (nbImg, ii); if (ii == Live::file) live->init (pf, (*fileList)[0].c_str ()); else live->init (pf); // Boucle principale glutMainLoop(); delete live; delete fileList; return 1; }