From 36ead8cdaae97b3bb3647998582d29800b54155f Mon Sep 17 00:00:00 2001 From: gaillaro Date: Sun, 9 May 2004 21:37:06 +0000 Subject: test des coordonnes --- 2004/i/nono/src/ovision/Makefile.defs | 7 +++- 2004/i/nono/src/ovision/adjust.cc | 43 ++++++++++++++++---- 2004/i/nono/src/ovision/comm.cc | 66 +++++++++++++++++++----------- 2004/i/nono/src/ovision/comm.h | 3 ++ 2004/i/nono/src/ovision/group.cc | 25 ++++++------ 2004/i/nono/src/ovision/group.h | 2 +- 2004/i/nono/src/ovision/img.cc | 41 ++++++++++++++++++- 2004/i/nono/src/ovision/img.h | 7 ++++ 2004/i/nono/src/ovision/mainui.cc | 51 +++++++++++++++++++++++ 2004/i/nono/src/ovision/mainui.h | 4 ++ 2004/i/nono/src/ovision/space.cc | 14 ++----- 2004/i/nono/src/ovision/space.h | 6 +-- 2004/i/nono/src/ovision/test_ovision.cc | 71 +++++++++++++++++++++++++++++++++ 2004/i/nono/src/ovision/testdist.cc | 38 +++++++++++++++--- 2004/i/nono/src/ovision/testmap.cc | 55 ++++++++++++------------- 2004/i/nono/src/ovision/ui.cc | 25 ++++++++---- 2004/i/nono/src/ovision/ui.h | 10 ++--- 17 files changed, 357 insertions(+), 111 deletions(-) create mode 100644 2004/i/nono/src/ovision/mainui.cc create mode 100644 2004/i/nono/src/ovision/mainui.h create mode 100644 2004/i/nono/src/ovision/test_ovision.cc diff --git a/2004/i/nono/src/ovision/Makefile.defs b/2004/i/nono/src/ovision/Makefile.defs index 79dba10..3aa21a9 100644 --- a/2004/i/nono/src/ovision/Makefile.defs +++ b/2004/i/nono/src/ovision/Makefile.defs @@ -2,8 +2,9 @@ TARGETS += test_ovision testimg testmap LIBS += ovision.a testimg_SOURCES = testimg.cc ovision.a video4linux.a -test_ovision_SOURCES = testmap.cc ovision.a -testmap_SOURCES = testmap.cc ovision.a image.a +test_ovision_SOURCES = test_ovision.cc ovision.a image.a video4linux.a +testmap_SOURCES = testmap.cc ovision.a image.a video4linux.a +testdist_SOURCES = testdist.cc ovision.a ovision_a_SOURCES = img.cc group.cc oconfig.cc map.cc segmNN.cc space.cc testimg: $(testimg_SOURCES:%.cc=%.o) @@ -12,5 +13,7 @@ test_ovision: $(test_ovision_SOURCES:%.cc=%.o) testmap: $(testmap_SOURCES:%.cc=%.o) +testdist: $(testdist_SOURCES:%.cc=%.o) + ovision.a: ${ovision_a_SOURCES:%.cc=ovision.a(%.o)} diff --git a/2004/i/nono/src/ovision/adjust.cc b/2004/i/nono/src/ovision/adjust.cc index f4b7b06..fa0b448 100644 --- a/2004/i/nono/src/ovision/adjust.cc +++ b/2004/i/nono/src/ovision/adjust.cc @@ -12,6 +12,9 @@ using namespace std; +#define IMG_WIDTH 360 +#define IMG_HEIGHT 296 + int window; Comm *comm; int point[3][2] = {{-1,-1},{-1,-1},{-1,-1}}; @@ -208,9 +211,17 @@ DrawGLScene() for (int i=0; i<3; i++) { if (point[i][0] >= 0) +/* x = (int)((double)WIDTH/width * x); + y = height - y; + y = (int)((double)HEIGHT/height * y);*/ glBegin(GL_POINTS); - glVertex3f(point[i][0], point[i][1], -0.9f); + glVertex3f(point[i][0] * 352 / IMG_WIDTH + BORDER, + point[i][1] * 288 / IMG_HEIGHT + 3 * BORDER , + -0.9f); glEnd(); + + std::cout << point[i][0] * 352 / IMG_WIDTH + BORDER << " " << + point[i][1] * 288 / IMG_HEIGHT + 3 * BORDER << endl; } glEnable(GL_TEXTURE_2D); @@ -244,10 +255,27 @@ MouseFunc(int button, int state, int x, int y) x = (int)((double)WIDTH/width * x); y = height - y; y = (int)((double)HEIGHT/height * y); + int imgX = -1; + int imgY = -1; + if ((x < 352+BORDER) && (y < BORDER+288) && (x > BORDER) && (y > BORDER)) + { + imgX = x * IMG_WIDTH / 352 - BORDER; + imgY = y * IMG_HEIGHT / 288 - BORDER; + + } + if ((x < 352+BORDER) && (y < HEIGHT-BORDER) && (x > BORDER) && (y > 2*BORDER+288)) { - int i=0; + imgX = x * IMG_WIDTH / 352 - BORDER; + imgY = y * IMG_HEIGHT / 288 - 3 * BORDER - 288; + } + + int i=0; + + cout << "Point ajoute: " << imgX << ", " << imgY << endl; + if (imgX >= 0) + { // Ajout de point if (button == GLUT_LEFT_BUTTON) { @@ -255,10 +283,10 @@ MouseFunc(int button, int state, int x, int y) { if (point[i][0] < 0) { - point[i][0] = x; - point[i][1] = y; + point[i][0] = imgX; + point[i][1] = imgY; i=5; - cout << "Point ajoute: " << x << ", " << y << endl; + cout << "Point ajoute: " << imgX << ", " << imgY << endl; } i++; } @@ -270,7 +298,7 @@ MouseFunc(int button, int state, int x, int y) { while(i<3) { - if ((abs(point[i][0] - x) < 5) && (abs(point[i][1] -y) < 5)) + if ((abs(point[i][0] - imgX) < 5) && (abs(point[i][1] - imgY) < 5)) { point[i][0] = -1; point[i][1] = -1; @@ -282,7 +310,6 @@ MouseFunc(int button, int state, int x, int y) } } DrawGLScene(); - } } @@ -303,7 +330,7 @@ main(int argc, char **argv) InitGL(WIDTH, HEIGHT); // Init de comm - comm = new Comm("im.jpg"); + comm = new Comm("test.rgb"); //Initialisation des signal handlers signal(SIGUSR1, ExecuteUiCmds); diff --git a/2004/i/nono/src/ovision/comm.cc b/2004/i/nono/src/ovision/comm.cc index 47e09fb..526b703 100644 --- a/2004/i/nono/src/ovision/comm.cc +++ b/2004/i/nono/src/ovision/comm.cc @@ -21,6 +21,9 @@ Comm::Comm(char *filename) // Initialisation de IL ilInit(); + // Copie du nom de l'image courante + strcpy(fname, filename); + // Ecriture du PID dans un fichier long pid = getpid(); FILE *file = fopen("adjust.PID", "w+"); @@ -41,22 +44,24 @@ Comm::Comm(char *filename) pPoint[i*2] = oconfig->tabPoint[i][0]; pPoint[i*2+1] = oconfig->tabPoint[i][1]; } - + // Ouverture de l'image pilote et stockage - img.ReadRaw(filename); + img.LoadRGB(filename, 0, 360, 296); + //if (img.yuv) img.RGBtoYUV(); tex[0] = LoadImage(img.width, img.height, img.tabData, tex[0]); - + // Conversion en YUV et stockage - img.RGBtoYUV(); + img.LoadRGB(filename, 0, 360, 296); + //if (!img.yuv) img.YUVtoRGB(); tex[3] = LoadImage(img.width, img.height, img.tabData, tex[3]); - + // NN oconfigure en RGB ou YUV ? - if (oconfig->colorMode == RGB) img.ReadRaw(filename); + //if (oconfig->colorMode == RGB) img.Load(filename, 0, 360, 296); // Allocation memoire pour les images for (int i=0; i<2; i++) data[i] = new unsigned char[img.nbPixels*3]; - + // Initialisation de la segmentation segm = new SegmNN(&img, oconfig); segm->BuildNN(oconfig->nn_NbCouleurs, LOAD_FROM_FILE); @@ -142,7 +147,7 @@ Comm::ExecuteUiCmds(char *buffer) { case 'i': // ouverture du fifo cout << "Initialisation du fifo\n"; - // Ouverture du fifo + // Ouverture du fifo fifo = open("uicmds", O_RDWR); if (!fifo) { cerr << "InitComm : Error during opening FIFO" << endl; @@ -170,10 +175,10 @@ Comm::ExecuteUiCmds(char *buffer) // Changement des valeurs sur les poids du NN for (int i=0; i<3; i++) segm->node[numColor*3+i] = atoi(cut[COLORTOCHANGE+i]); - + // On segmente l'image puis on la stocke SegmAndGroup(); - + printf("Couleur %i changé aux valeurs : %u %u %u\n", numColor, segm->node[numColor*3], segm->node[numColor*3+1], segm->node[numColor*3+2]); break; @@ -199,7 +204,7 @@ Comm::ExecuteUiCmds(char *buffer) // On segmente l'image puis on la stocke SegmAndGroup(); - + cout << nbColorToMerge << " colors merged to " << numIndexColor << endl; break; @@ -207,11 +212,11 @@ Comm::ExecuteUiCmds(char *buffer) case 's': // isole une couleur int numColorToShow; numColorToShow = atoi(cut[NUMCOLORTOSHOW]); - + // Cas ou toutes les couleurs doivent etre affiche if (numColorToShow == -1) SegmAndGroup(); - + // Afficher seulement une couleur else { @@ -247,12 +252,12 @@ Comm::ExecuteUiCmds(char *buffer) } oconfig->nn_NbCouleurs--; - + // On refait le NN vu qu'il y a une couleur de moins segm->BuildNN(oconfig->nn_NbCouleurs, LOAD_FROM_FILE); - + segm->ShowNodes(); - + // On segmente l'image puis on la stocke SegmAndGroup(); break; @@ -260,10 +265,10 @@ Comm::ExecuteUiCmds(char *buffer) case 'r': // Reload l'image int nbNNOutput; nbNNOutput = atoi(cut[NBNNOUTPUT]); - + // Reattribution du nombre de sorties d'origine if (nbNNOutput != -1) oconfig->nn_NbCouleurs = nbNNOutput; - + // Recharge du fichier des poids oconfig->LoadNNFile("rc/poids"); @@ -292,10 +297,13 @@ Comm::ExecuteUiCmds(char *buffer) char *filename; filename = cut[FILENAME]; cout << filename << endl; + + // Copie du nom de l'image courante + strcpy(fname, filename); // Ouverture de l'image pilote et stockage - img.ReadRaw(filename); - + img.LoadRGB(filename, 0, 360, 296); + // Allocation memoire pour les images for (int i=0; i<2; i++) { @@ -304,13 +312,13 @@ Comm::ExecuteUiCmds(char *buffer) } tex[0] = LoadImage(img.width, img.height, img.tabData, tex[0]); - + // Conversion en YUV et stockage img.RGBtoYUV(); tex[3] = LoadImage(img.width, img.height, img.tabData, tex[3]); // NN oconfigure en RGB ou YUV ? - if (!oconfig->colorMode == RGB) img.ReadRaw(filename); + if (!oconfig->colorMode == RGB) img.LoadRGB(filename, 0, 360, 296); SegmAndGroup(); @@ -329,7 +337,7 @@ Comm::ExecuteUiCmds(char *buffer) SendNodes(); break; - + case 'p': // Regenere les poids du reseau int nbColor; nbColor = atoi(cut[NBCOLORNN]); @@ -361,7 +369,7 @@ Comm::ExecuteUiCmds(char *buffer) cerr << "Comm::ExecuteUiCmds : Pas assez de points selectionnes\n"; return; } - + for (int i = 0; i<3; i++) { oconfig->tabPoint[i][0] = pPoint[i*2]; @@ -373,7 +381,17 @@ Comm::ExecuteUiCmds(char *buffer) oconfig->CreateDistFile("rc/dist"); break; + case 'y': + img.yuv = !img.yuv; + // Conversion en YUV et stockage + img.ReadRaw(fname); + if (!img.yuv) img.YUVtoRGB(); + tex[3] = LoadImage(img.width, img.height, img.tabData, tex[3]); + + img.ReadRaw(fname); + break; + case 'z': group->ShowZones(); break; diff --git a/2004/i/nono/src/ovision/comm.h b/2004/i/nono/src/ovision/comm.h index 123418b..f0a4ee4 100644 --- a/2004/i/nono/src/ovision/comm.h +++ b/2004/i/nono/src/ovision/comm.h @@ -41,6 +41,9 @@ class Comm { /// PID du programme ui long uiPid; + + /// nom de l'image courante + char fname[100]; /// Constructeur Comm (char *filename); diff --git a/2004/i/nono/src/ovision/group.cc b/2004/i/nono/src/ovision/group.cc index 9228d7b..3b07e3b 100644 --- a/2004/i/nono/src/ovision/group.cc +++ b/2004/i/nono/src/ovision/group.cc @@ -70,15 +70,15 @@ void Group::Plague(int type, unsigned char numColor, int x, int y) { // TODO ajouter une inertie ? // Parcours de l'objet trouve de haut en bas - while ((xmax < width-1)&& (tabSegm[(++xmax)+y*width] == numColor)) {} - while ((xmin > 0) && (tabSegm[(--xmin)+y*width] == numColor)) {} - while ((ymax < height-1) && (tabSegm[x+(++ymax)*width] == numColor)) {} - while ((ymin > 0) && (tabSegm[x+(--ymin)*width] == numColor)) {} + while ((xmax < img->width-1)&& (tabSegm[(++xmax)+y* img->width] == numColor)) {} + while ((xmin > 0) && (tabSegm[(--xmin)+y* img->width] == numColor)) {} + while ((ymax < img->height-1) && (tabSegm[x+(++ymax)* img->width] == numColor)) {} + while ((ymin > 0) && (tabSegm[x+(--ymin)* img->width] == numColor)) {} // Verification la validite des entrees -/* if ((xmin < 0) || (xmin > width)) +/* if ((xmin < 0) || (xmin > img->width)) xmin = 0; - if ((xmax > img->width) || (xmax < 0)) + if ((xmax > img->img->width) || (xmax < 0)) xmax = img->width; if ((ymin < 0) || (ymin > height)) ymin = 0; @@ -104,7 +104,7 @@ void Group::Plague(int type, unsigned char numColor, int x, int y) { ZONE *pLast=NULL; while (pCur) { // si on a deja ce groupe on actualise les donnees du groupe - if ((numColor == pCur->idColor) && (abs(pCur->centerx - centerx) <= DELTA) && (abs(pCur->centery - centery) <= DELTA)) { + if ((numColor == pCur->idColor) && (abs(pCur->centerx - centerx) <= PRECISION) && (abs(pCur->centery - centery) <= PRECISION)) { if (xmin < pCur->xmin) pCur->xmin = xmin; if (xmax > pCur->xmax) pCur->xmax = xmax; if (ymin < pCur->ymin) pCur->ymin = ymin; @@ -175,7 +175,7 @@ void Group::ShowZones() { } pCur = zoneListGoal; - cout << "Groupes balles:" << endl; + cout << "Groupes poteaux:" << endl; while(pCur) { printf("%u %i %i %i %i\n", pCur->idColor, pCur->xmin, pCur->xmax, pCur->ymin, pCur->ymax); pCur = pCur->next; @@ -187,15 +187,16 @@ void Group::ShowZones() { /// @param numColor numero de la couleur a trouver void Group::JumpPoints(unsigned char numColor) { + zoneListBall = NULL; tabSegm = segm->tabSegm; // Initialisation de la couleur a chercher numColor = segm->index[numColor]; // Parcours d'une partie des pixels de l'image - for (int x=0; xwidth; x+=10) { + for (int y=0; yheight; y+=10) { + if (tabSegm[y*img->width+x] == numColor) { Plague(BALL, numColor, x, y); } @@ -229,7 +230,7 @@ void Group::TabOut() { // Remplissage de la zone avec une couleur for(int i=pCur->xmin; ixmax; i++) for (int j=pCur->ymin; jymax; j++) - tabOut[j*img->width+i] = pCur->idColor+1; + tabOut[j* img->width+i] = pCur->idColor+1; pCur = pCur->next; } diff --git a/2004/i/nono/src/ovision/group.h b/2004/i/nono/src/ovision/group.h index d5a6420..66d0207 100644 --- a/2004/i/nono/src/ovision/group.h +++ b/2004/i/nono/src/ovision/group.h @@ -8,7 +8,7 @@ #include "segmNN.h" // TODO delta devrait diminuer avec la profondeur -#define DELTA 20 // taille du jumppoint +#define PRECISION 80 // distance a partir 2 groups sont 2 balles distinctes /// Liste chainee des zones trouvees par la classe group diff --git a/2004/i/nono/src/ovision/img.cc b/2004/i/nono/src/ovision/img.cc index 60469ad..4fcc7b9 100644 --- a/2004/i/nono/src/ovision/img.cc +++ b/2004/i/nono/src/ovision/img.cc @@ -32,8 +32,6 @@ Img::~Img (void) { delete [] tabData; } - - /// Convertit un tableau de donnees RGB en YUV void Img::RGBtoYUV() { unsigned char r,g,b; @@ -70,6 +68,26 @@ void Img::RGBtoHSI() { } } +/// Convertit un tableau de donnees YUV en RGB +void Img::YUVtoRGB() +{ + unsigned char y,u,v; + + yuv = false; + + // Parcours du tableau et conversion des valeurs YUV en RGB + for (unsigned long i=0; iwidth = width; + this->height = height; + nbPixels = width * height; + delete[] tabData; + tabData = new unsigned char[nbPixels*3]; + yuv = mode; + + FILE *file; + file = fopen(filename, "r"); + + fread(tabData, 3, width*height, file); + + fclose(file); +} + + /// Lit une image depuis un ImageLoader. void Img::load (ImageLoader &loader) diff --git a/2004/i/nono/src/ovision/img.h b/2004/i/nono/src/ovision/img.h index dde68d2..daeae77 100644 --- a/2004/i/nono/src/ovision/img.h +++ b/2004/i/nono/src/ovision/img.h @@ -50,9 +50,16 @@ class Img /// Conversion en HSI void RGBtoHSI(); + /// Conversion de YUV en RGB + void YUVtoRGB(); + + /// Ecrite des valeurs RGB dans un fichier void WriteRGB(char *filename); + /// Charge les valeurs RGB dans un fichier + void LoadRGB(char *filename, int mode, int width, int height); + /// Lit une image depuis un ImageLoader. void load (ImageLoader &loader); diff --git a/2004/i/nono/src/ovision/mainui.cc b/2004/i/nono/src/ovision/mainui.cc new file mode 100644 index 0000000..b31cea3 --- /dev/null +++ b/2004/i/nono/src/ovision/mainui.cc @@ -0,0 +1,51 @@ +#include "ui.h" + +#include + +#include +#include +#include + +using namespace std; + +UI *ui; +int ready; + +int +GetReady() +{ + return ready; +} + +void +SetReady(int i) +{ + ready = i; +} + + +// Lecture du fifo et execution de la commande +void +endSleep(int numSignal) +{ + // Reassignement du signal handler + signal(SIGUSR1, endSleep); + ready = 1; +} + + +int +main(int argc, char **argv) +{ + signal(SIGUSR1, endSleep); + + if (argc > 0) + { + ui = new UI (argv[1]); + } + else ui = new UI; + + ui->Menu (); + + delete ui; +} diff --git a/2004/i/nono/src/ovision/mainui.h b/2004/i/nono/src/ovision/mainui.h new file mode 100644 index 0000000..2d550cb --- /dev/null +++ b/2004/i/nono/src/ovision/mainui.h @@ -0,0 +1,4 @@ + +int GetReady(); +void SetReady(int i); + diff --git a/2004/i/nono/src/ovision/space.cc b/2004/i/nono/src/ovision/space.cc index 730dea7..82d237f 100644 --- a/2004/i/nono/src/ovision/space.cc +++ b/2004/i/nono/src/ovision/space.cc @@ -23,7 +23,6 @@ Space::Space (int imgHeight, int imgWidth, OConfig *oconfig) aY = bY = cY = 0; aX = aY = 0; - } @@ -33,14 +32,6 @@ Space::~Space () } -/// Affiche la liste des distance etalonneess -void Space::ShowTab() -{ -// cout << "\nTabLocY (" << tabLocY.size() << "):" << endl; - - // Parcours de la liste et affichage ces elements pour y -} - /// Ajoute un point pour l'etalonnage void Space::AddSetupPoint(int x, int y, int distx, int disty) { @@ -69,6 +60,8 @@ void Space::LoadFromFile() AddSetupPoint(oconfig->tabPoint[i][0], oconfig->tabPoint[i][1], oconfig->tabPoint[i][2], oconfig->tabPoint[i][3]); } + +/// Calcul du determinant d'une matrice int Space::Determinant(int matrix[][4]) { int det = 0; @@ -80,6 +73,7 @@ int Space::Determinant(int matrix[][4]) return det; } +/// Calcul du déterminant caractéristique d'une matrice int Space::CaracteristicDeterminant(int matrix[][4], int numCol) { int save[3]; @@ -107,7 +101,7 @@ int Space::Setup() { if (setupTab.size() < 3) { - cerr << "Space::Setup : Pas assez de points donnÃs, utilisà AddSetupPoint\n"; + cerr << "Space::Setup : Pas assez de points donnés, utilisé AddSetupPoint\n"; return 0; } diff --git a/2004/i/nono/src/ovision/space.h b/2004/i/nono/src/ovision/space.h index be9686d..c9843e7 100644 --- a/2004/i/nono/src/ovision/space.h +++ b/2004/i/nono/src/ovision/space.h @@ -52,9 +52,6 @@ class Space // Destructeur ~Space (); - /// Affiche les tables de correspondances de distances - void ShowTab (); - /// Position d'un objet dans le referentiel du robot void GetLoc(int locImgX, int locImgY, int &locX, int &locY); @@ -62,10 +59,11 @@ class Space void AddSetupPoint(int x, int y, int distx, int disty); /// Chargement des points a partir d'un fichier - void Space::LoadFromFile(); + void LoadFromFile(); /// Etalonnage des distances int Setup(); + protected: /// Calcul du determinant int Determinant(int matrix[][4]); diff --git a/2004/i/nono/src/ovision/test_ovision.cc b/2004/i/nono/src/ovision/test_ovision.cc new file mode 100644 index 0000000..90af585 --- /dev/null +++ b/2004/i/nono/src/ovision/test_ovision.cc @@ -0,0 +1,71 @@ + +#include "video4linux/video4linux.h" +#include "map.h" +#include "oconfig.h" +#include "group.h" +#include "space.h" + +int +main() +{ + ///////////////////////////////////////////////////////////////////////////////////////// + /// Initialisation des classes + OConfig oconfig("rc/vision.conf"); + + Img img; + Video4Linux::ColorSpace cs; + cs = Video4Linux::rgb; + Video4Linux v4l("/dev/video", cs, 55000); + v4l.calibrate (); + + Space space(img.width, img.height, &oconfig); + space.AddSetupPoint (230, 16, 30, 300); + space.AddSetupPoint (208, 168, 40, 600); + space.AddSetupPoint (201, 230, 50, 900); + space.Setup (); + + SegmNN segmNN(&img, &oconfig); + segmNN.BuildNN(oconfig.nn_NbCouleurs, LOAD_FROM_FILE); + + Group group(&img, &segmNN); + + Map map(&oconfig, &space); + ///////////////////////////////////////////////////////////////////////////////////////// + + + ///////////////////////////////////////////////////////////////////////////////////////// + /// Prends une image a partir de la camera et l'analyse + char filename[30]; + int i = 0; + while (1) + { + std::cout << "-----------------------------------------------------------------" << std::endl; + std::cout << "image n°" << i << std::endl; + img.load(v4l); + img.load(v4l); + sprintf(filename, "test%i.rgb", i); + img.WriteRGB(filename); + segmNN.Segm(); + + group.JumpPoints(oconfig.groupColor); + group.ShowZones(); + std::cout << "-------------\n" << std::endl; + if (group.zoneListBall) + { + int x,y; + double angle; + x = group.zoneListBall->centerx - img.width/2; + y = img.height - group.zoneListBall->centery; + std::cout << x << " " << y << std::endl; + space.GetLoc(0, y, x, y); + std::cout << y << std::endl; + + } + std::cout << "-------------\n" << std::endl; + + getchar(); + i++; + } + ///////////////////////////////////////////////////////////////////////////////////////// +} + diff --git a/2004/i/nono/src/ovision/testdist.cc b/2004/i/nono/src/ovision/testdist.cc index 8936607..f2ed486 100644 --- a/2004/i/nono/src/ovision/testdist.cc +++ b/2004/i/nono/src/ovision/testdist.cc @@ -1,14 +1,40 @@ #include "space.h" #include -using namespace std; -int main() +int main(int argc, char **argv) { - Space space(356, 288); + const int imgWidth = 360; + const int imgHeight = 296; - space.DoDistTab(); - space.ShowTab(); - space.DoIndexTab(); + if (argc < 2) + { + std::cout << "testmap renvoie les coordonnees dans le référentiel du robot par rapport aux coordonées de l'image donnée.\n"; + std::cout << "Usage: testmap \n"; + return 0; + } + OConfig oconfig ("rc/vision.conf"); + Space space (imgWidth, imgHeight, &oconfig); + // Entree des 3 points nécessaires à la création des équations + //space.LoadFromFile(); + space.AddSetupPoint (109, 90, 150, 9); + space.AddSetupPoint (84, 20, 150, 2); + space.AddSetupPoint (50, 10, 150, 1); + + // Calcul des équations pour la conversion des coordonnées + space.Setup (); + + + int locImgX = atoi (argv[1]); + int locImgY = atoi (argv[2]); + std::cout << "Coordonnées de l'image: " << locImgX << " " << locImgY << std::endl; + + int locX, locY; + space.GetLoc (locImgX, locImgY, locX, locY); + + std::cout << "Coordonnées de la balle " << locX << " " << locY << std::endl; + + return 1; +} diff --git a/2004/i/nono/src/ovision/testmap.cc b/2004/i/nono/src/ovision/testmap.cc index e7675d4..191156c 100644 --- a/2004/i/nono/src/ovision/testmap.cc +++ b/2004/i/nono/src/ovision/testmap.cc @@ -1,5 +1,7 @@ +#include "imgFile.h" #include "image/raw_loader.h" +#include "video4linux/video4linux.h" #include "map.h" #include "oconfig.h" #include "group.h" @@ -10,47 +12,42 @@ main() { OConfig oconfig("rc/vision.conf"); - // ImgFile img; - // img.ReadRaw("im.jpg"); + ImgFile img; + img.ReadRaw("test3.jpg"); // - +/* Img img; + RawLoader rawLoader("im2000.rgb", 360, 296, ImageLoader::rgb); + img.load(rawLoader); + - // RawLoader rawLoader("im2000.rgb", 360, 296, ImageLoader::rgb); - // img.load(rawLoader); - - Video4Linux::ColorSpace cs; - cs = Video4Linux::yuv; - Video4Linux vid ("/dev/video", cs); - vid.calibrate (); - int w, h; - vid.getSize (w, h); - std::cout << w << ' ' << h << std::endl; - int s; - s = vid.getBufSize (); - unsigned char *buf = new unsigned char[s]; - s = vid.read (buf, s); - - img.RGBtoYUV(); - // img.WriteRGB("test.rgb"); - - Space space(img.width, img.height); - space.AddSetupPoint (109, 36, -150, 900); - space.AddSetupPoint (84, 102, -150, 600); - space.AddSetupPoint (50, 259, -150, 300); + +/* Video4Linux::ColorSpace cs; + cs = Video4Linux::rgb; + Video4Linux v4l("/dev/video", cs, 30000); + v4l.calibrate (); + img.load(v4l); + */ + if ((oconfig.colorMode == YUV) && (!img.yuv)) img.RGBtoYUV(); + img.WriteRGB("test.rgb"); + + Space space(img.width, img.height, &oconfig); + space.AddSetupPoint (109, 36, 150, 900); + space.AddSetupPoint (84, 102, 150, 600); + space.AddSetupPoint (50, 259, 150, 300); space.Setup (); SegmNN segmNN(&img, &oconfig); segmNN.BuildNN(oconfig.nn_NbCouleurs, LOAD_FROM_FILE); Group group(&img, &segmNN); - + Map map(&oconfig, &space); - + segmNN.Segm(); group.JumpPoints(oconfig.groupColor); - // group.ShowZones(); + group.ShowZones(); map.AddBallsToMap(&group); -// map.ShowBalls(); + // map.ShowBalls(); } diff --git a/2004/i/nono/src/ovision/ui.cc b/2004/i/nono/src/ovision/ui.cc index 5e045a9..11b0da7 100644 --- a/2004/i/nono/src/ovision/ui.cc +++ b/2004/i/nono/src/ovision/ui.cc @@ -14,7 +14,7 @@ #include "oconfig.h" #include "ui.h" -#include "testui.h" +#include "mainui.h" using namespace std; @@ -23,7 +23,7 @@ using namespace std; /// Nombre d'items du menu -#define NBITEMS 12 +#define NBITEMS 13 OConfig oconfig("rc/vision.conf"); @@ -36,20 +36,21 @@ char *itemsName[NBITEMS][2] = {{"Move color", "Permet d'ajuster les niveaux d'un {"Training", "Entraine le reseau de neurones"}, {"New network", "Regenere de nouveaux poids pour le reseau"}, {"Set dist point", "Fixe les points pour la distance"}, + {"Switch rgb/yuv", "Change mode rgb/yuv"}, {"Cancel changes", "Recharge le fichier de oconfig"}, {"Save changes", "Sauvegarde les changements dans le fichier"}, {"Quit", "Quitte le programme"}, {NULL, NULL}}; /// Constructor -UI::UI() +UI::UI(char *filename) { // TODO verifier que le terminal est assez grand sinon écran noir // Suppression de l'ancien fifo system("rm -f uicmds"); - + // Creation du fifo if (mknod("uicmds", S_IFIFO | 0666, 0) != 0 && errno != EEXIST) { @@ -80,7 +81,7 @@ UI::UI() curImage = 0; ParseFileList(); - + oconfig.LoadNNFile(); savedNNColorNumber = oconfig.nn_NbCouleurs; @@ -97,7 +98,7 @@ UI::UI() // Ouverture du fifo kill(pid, SIGUSR2); - + // Init ncurses initscr(); start_color(); @@ -112,6 +113,8 @@ UI::UI() init_pair(3, COLOR_GREEN, COLOR_BLACK); init_pair(4, COLOR_CYAN, COLOR_BLACK); + sprintf(buf, "n %s\n", filename); + SendSignal(buf); } @@ -849,8 +852,14 @@ UI::Menu() SendSignal("v\n"); break; + case 8: // Change mode rgb/yuv + SendSignal("y\n"); + if (oconfig.colorMode == RGB) + oconfig.colorMode = YUV; + else oconfig.colorMode = RGB; + break; - case 8: // Annuler les changements + case 9: // Annuler les changements // Reload du fichier de poids initial oconfig.LoadNNFile(); @@ -862,7 +871,7 @@ UI::Menu() PrintStatus("Les changements ont ete annules\n"); break; - case 9: // Sauver les changements + case 10: // Sauver les changements // Sauvegarde des poids dans le fichier poids oconfig.CreateNNFile("rc/poids", oconfig.colorMode, oconfig.nn_NbCouleurs); diff --git a/2004/i/nono/src/ovision/ui.h b/2004/i/nono/src/ovision/ui.h index 4b29cb7..e735368 100644 --- a/2004/i/nono/src/ovision/ui.h +++ b/2004/i/nono/src/ovision/ui.h @@ -44,7 +44,7 @@ class UI { public: /// Constructeurs. - UI (void); + UI (char *filename = ""); /// Destructeur. ~UI (void); @@ -54,14 +54,11 @@ class UI { /// reponse du programme adjust int uiReady; - + protected: /// Cree la liste d'images a ouvrir void ParseFileList(); - /// Envoie une donnee au prog adjust - void SendSignal(char *buf); - /// Menu de selection de couleur inline int ChooseColor(int type) {return ChooseColor(type, 0);} @@ -86,6 +83,9 @@ class UI { /// Synchronisation des poids locaux et de ceux du programme adjust void UpdateNodes(); + + /// Envoie une donnee au prog adjust + void SendSignal(char *buf); }; -- cgit v1.2.3