summaryrefslogtreecommitdiff
path: root/2004
diff options
context:
space:
mode:
Diffstat (limited to '2004')
-rw-r--r--2004/i/nono/src/ovision/Makefile.defs7
-rw-r--r--2004/i/nono/src/ovision/adjust.cc43
-rw-r--r--2004/i/nono/src/ovision/comm.cc66
-rw-r--r--2004/i/nono/src/ovision/comm.h3
-rw-r--r--2004/i/nono/src/ovision/group.cc25
-rw-r--r--2004/i/nono/src/ovision/group.h2
-rw-r--r--2004/i/nono/src/ovision/img.cc41
-rw-r--r--2004/i/nono/src/ovision/img.h7
-rw-r--r--2004/i/nono/src/ovision/mainui.cc51
-rw-r--r--2004/i/nono/src/ovision/mainui.h4
-rw-r--r--2004/i/nono/src/ovision/space.cc14
-rw-r--r--2004/i/nono/src/ovision/space.h6
-rw-r--r--2004/i/nono/src/ovision/test_ovision.cc71
-rw-r--r--2004/i/nono/src/ovision/testdist.cc38
-rw-r--r--2004/i/nono/src/ovision/testmap.cc55
-rw-r--r--2004/i/nono/src/ovision/ui.cc25
-rw-r--r--2004/i/nono/src/ovision/ui.h10
17 files changed, 357 insertions, 111 deletions
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; x<width; x+=10) {
- for (int y=0; y<height; y+=10) {
- if (tabSegm[y*width+x] == numColor)
+ for (int x=0; x<img->width; x+=10) {
+ for (int y=0; y<img->height; 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; i<pCur->xmax; i++)
for (int j=pCur->ymin; j<pCur->ymax; 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; i<nbPixels; i++) {
+ y = tabData[i*3];
+ u = tabData[i*3+1];
+ v = tabData[i*3+2];
+
+ tabData[i*3] = (unsigned char)(y + (1.4075 * (v - 128)));
+ tabData[i*3+1] = (unsigned char)(y + ((0.3455 * (u - 128)) - (0.7169 * (v - 128))));
+ tabData[i*3+2] = (unsigned char)(y + (1.7790 * (u - 128)));
+ }
+}
+
+
/// Ecrit les valeurs RGB dans un fichier
void Img::WriteRGB(char *filename) {
@@ -81,6 +99,25 @@ void Img::WriteRGB(char *filename) {
fclose(file);
}
+/// Charge les valeurs RGB dans un fichier
+void Img::LoadRGB(char *filename, int mode, int width, int height) {
+
+ this->width = 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 <iostream>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <signal.h>
+
+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 <iostream>
-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 <coordonnees x de l'image> <coordonnees y de l'image>\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);
};