(par email)
valeur_de_l'opérateur_Harris x y
rm *.o *~ *.pgm cd .. tar zcvf TD5.tar.gz TD5 envoyez TD5.tar.gz en attachement
(rappel) Il faut effectuer les opérations suivantes :
après avoir calculé Harris en tout point de l'image, on doit faire une boucle sur chaque point de l'image, du type:
A B C D X E F G H if(harris[X] > 0 && harris[X] > harris[A] && harris[X] > harris[B] && harris[X] > harris[C] && harris[X] > harris[D] && harris[X] >= harris[E] && harris[X] >= harris[F] && harris[X] >= harris[G] && harris[X] >= harris[H] ) { inserer_le_point_dans_un_tableau_trie; }
(les >= sont là pour détecter un maximum si deux points voisins sont des maxima avec la même valeur, par exemple si D = X)
Le tableau doint contenir une liste de points et la valeur de Harris en chacun de ces points:
#include <string.h> typedef struct { int x; int y; float harris; } pointdinteret; Initialisation: .... pointdinteret * tableautrie; tableautrie = (pointdinteret*)malloc(nelems * sizeof(pointdinteret)); /* on met tous les elements à harris=zero, ils seront ejectés lors de l'insertion de nouveaux elements */ memset(tableautrie, 0, nelems * sizeof(pointdinteret)); .... Insertion d'un nouvel élément: /* doit-on inserer un nouvel element? */ if(harris > tableautrie[nelems-1].harris) { /* on commenca au début du tableau */ int position = 0; /* tant que l'element courant est superieur au nouvel element, on avance */ while(tableautrie[position].harris > harris) { position++; } /* ici, position est l'endroit ou on doit inserer le nouvel element */ /* decalage des elements plus petits: */ for(i = nelems-2; i>= position; i--) { tableautrie[i+1].x = tableautrie[i].x; ... } /* insertion du nouvel element */ .... }
Pour afficher les points, il suffira d'écrire la fonction suivante, qui dessine une croix de 5x5 pixels de couleur blanche en x,y. Attention aux bords !
dessine_croix(int x, int y, uint8_t *graymap, int cols, int rows) { ... }
ecrire une fonction
float SSD(const gray *image1, int cols1, int rows1, const gray *image2, int cols2, int rows2, int x1, int y1, int x2, int y2, int demifenetrex, int demifenetrey) { double ssd = 0; double ssdmax = 255 * demifenetrex * demifenetrey; int i, j; /* tester d'abord que les deux fenetres sont dans les deux images */ if(((x1 - demifenetrex) < 0) || ((x1 + demifenetrex) >= cols1) || .... ) { return ssdmax; } /* calculer la SSD... */ for(j=-demifenetrey; j<=demifenetrey; j++) { for(i=-demifenetrex; i<=demifenetrex; i++) { ..... } } return ssd; }