TD5 : Mise en correspondance de points d'intérêt

Prérequis

Sujet

A rendre

(par email)

Indices

Pour calculer l'opérateur de Harris

(rappel) Il faut effectuer les opérations suivantes :

Pour trier les points de Harris

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)
{
...
}

Pour calculer la similarité

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;
}
	

Frederic Devernay