Dans cette section, on va présenter deux types de composants : des composants facilitant l’interconnexion et la conversion d’un type de flux à un autre, et d’autres spécifiques aux fonctions de traitement d’images.
Standard Avalon et sa spécification aux images
Figure 5-8 : Caméra vers Avalon.
Nous avons décidé d’adopter un format d’image VGA (640x480). Nous avons utilisé 32 bits par pixel composé du rouge, vert, bleu et un canal de transparence. Chaque paquet Avalon contient une image entière. La taille de l’image est toujours la même durant tout le processus de
traitement.
Les caméras ont un fonctionnement spécifique selon la famille du capteur utilisé. Il est judicieux de faire abstraction à ces signaux en les transformant en un signal standard permettant une intégration plus facile avec le reste des modules Avalon. Pour cela, deux modules sont
nécessaires comme le montre la figure 5-8. Le module de contrôle I2C permet de configurer la caméra directement avec le processeur NIOSII. La configuration de la caméra, temps
d’exposition et autres paramètres sont donc configurables par logiciel. Le module de conversion du format de l’image applique l’opération de démosaïquage qui consiste à convertir le format RGGB à notre format XRGB.
45
Chapitre 5
106
Composants d’écriture et de lecture en mémoireFigure 5-9 : Transformation des flux.
Les composants représentés par la figure 5-9 permettent d’écrire et de lire les paquets d’images ou autres dans et à partir de la mémoire.
Quand on a un paquet de données qui se transfère en série et que l’on veut l’écrire dans une plage d’adresses spécifiques de la mémoire, il suffit de définir l’adresse de départ où se trouvera le premier pixel, et un compteur se charge d’incrémenter l’adresse au fur et à mesure de
l’arrivée des autres pixels. Ces adresses, où vont se loger les images, peuvent être configurées par logiciel. L’ensemble de ces deux composants constitue un « Frame Buffer ». L’objectif de les avoir séparés en deux modules indépendants, permet plus de configurations de fonctionnement. On peut avoir un nombre de modules de lecture inégal au nombre de modules d’écriture. Les FIFOs (Premier arrivé premier servi) permettent de connecter plusieurs modules à la même mémoire. Sous réserve que la somme des flux ne dépasse pas la bande passante commune, l’accès reste garanti. L’arbitrage de tous les modules est réparti, car l’accès mémoire n’est réservé que durant le temps nécessaire pour vider le FIFO.
Module de transformation
Figure 5-10 : Récupération des pixels.
La figure 5-10 représente le module nécessaire à toutes les transformations d’images. C’est le récupérateur de pixels. Il est issu d’une transformation du « Frame Reader ». Il n’a pas un compteur qui incrémente les adresses à lire de façon monotone, mais il a en entrée un flux Avalon qui indique à chaque nouveau pixel, quelle sera la nouvelle adresse à charger. Les adresses à charger dépendent du contenu en entrée et ne sont pas nécessairement continues. Cela peut entraîner une baisse de la bande passante selon le type de mémoire. D’après les tests effectués avec notre équipement, une mémoire DDR est 5 à 10 fois plus lente avec un accès aléatoire qu’avec un accès séquentiel.
Le flux des adresses à charger peut provenir de deux sources différentes : de la mémoire, avec l’utilisation d’un « Frame Reader » en amont, ou calculé de façon dynamique avec un composant
Chapitre 5
107
spécifique. Le tableau 5-2 compare ces deux techniques pour renseigner dans quel cas l’une est plus appropriée que l’autre.
Transformation avec table en mémoire Transformation dynamique Statique, ou le temps d’écriture pour la mise à
jour Dynamique
Même module matériel réutilisable Conception spécifique à chaque transformation
Ressources mémoires pour la table Ressources FPGA, multiplicateurs, registres Consommation de bande passante de lecture Pas besoin d’accès mémoire
Pas de limite de complexité Complexité croissante avec la complexité de la fonction de transformation
Accès à de multiples images (fusion d’images) Accès à une image unique Possibilité de concaténer les tables de
transformations en une seule
La concaténation doit concaténer les blocs avec perte de résolution
Tableau 5-2 : Comparaison des transformations. Correction de distorsion
La formule de correction de distorsion dépend de la lentille utilisée. On utilise un modèle mathématique standard (Brown 1971), pour lequel la procédure d’étalonnage permet de déterminer les paramètres.
Plusieurs types de distorsions sont possibles pour une lentille. La distorsion radiale, dont la formule de correction est la suivante :
Et une distorsion tangentielle, qu’on n’a pas eu à appliquer mais que l’on cite à titre de référence :
La figure 5-11 illustre le principe de fonctionnement du module.
On définit A comme la coordonnée corrigée du point et B la coordonnée de notre point de référence. Quand le flux d’image a besoin du point A, le module de correction applique la transformée et demande plutôt le point corrigé B. De la sorte, l’image en sortie est rectifiée.
Chapitre 5
108
Figure 5-11 : principe de fonctionnement de la correction de distorsion.Homographie
Figure 5-12 : Transformation homographique.
La figure 5-12 représente l’implémentation du module de transformation homographique, dont voici la formulation :
À un pixel en entrée à la coordonnée on fait correspondre une nouvelle coordonnée de sorte que :
Avec étant une matrice 3x3 calculée en ligne par le processeur NIOSII en fonction des paramètres de l’application.
Remarquons qu’en fonction de la transformation appliquée, il faut bien synchroniser les tâches de mise à jour de l’image source et de l’application de la transformation. Au pire des cas, le premier pixel à sortir peut être le dernier pixel mis à jour dans l’image source.