Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Capteurs > Caméra Pob-Eye 2 > Détection d’une forme avec la Pob-Eye 2

Détection d’une forme avec la Pob-Eye 2

dimanche 22 novembre 2009, par Julien H.

Enfin ! Après avoir réussi à écrire nos premiers programmes "simples", on va attaquer la reconnaissance d’une forme dans l’image prise. Pour cela on va utiliser les fonctions développées par Pob-Technology.

Le principe

Chaque forme qu’on souhaite détecter doit être définie en noir sur fond rouge dans une image bitmap (.bmp) de taille 100 x 100 pixels. Il ne faut pas qu’il y ait de zones vides et d’autres contraintes dont vous trouverez la liste dans la documentation officielle.

Le logiciel Pob-Tools 4 intègre la transformation automatique des images que vous lui proposez en un tableau d’octets contenu dans un fichier "pattern.h" que vous devez intégrer dans votre programme principal.

Après avoir récupéré une frame RGB, vous avez la possibilité de demander à la bibliothèque de fonctions de la caméra Pob-Eye 2 la recherche de "Forms" parmi les "Patterns" décrits dans le fichier header "pattern.h".

3 patterns pour Pob-Eye 2

Chaque Form peut alors vous renseigner sur sa position en x,y dans l’image (en considérant le centre de la forme) et sa taille (largeur et hauteur du rectangle entourant l’intégralité de la forme). Un identifiant fait référence au pattern associé dans le fichier header : 1, 2, 3 selon l’ordre de conversion.

Code source

Projet Pob-Tools

Créez un nouveau projet, ajoutez les 3 fichiers par clic droit sur le répertoire "pattern files", un par un :

Configuration des patterns

Copiez le code source ci-dessous :


#include "pob-eye.h"

#include "pattern.h"

char* transformeNom(UInt8 id) ;

int main (void)

int i=0 ;
int nombre=0 ;
UInt8 * rgbFrame ;
Form listeFormes[MAX_OF_FORM] ;

// initialisations obligatoires
InitPobeye2() ;
InitUART0(115200) ;
InitI2C(I2C_100_KHZ) ;
InitCameraPobeye2() ;

rgbFrame = GetRGBFrame() ;

while(1)

// attendre le déclenchement
GetByteFromUART0() ;

// prendre la photo
GrabRGBFrame() ;

// transformer en binaires
BinaryRGBFrame(rgbFrame) ;

// chercher les formes parmi les "patterns" créés
nombre=IdentifyForm(rgbFrame,listeFormes,pattern) ;

// traiter les formes une à une
for (i=0 ;i < nombre ;i++)

// afficher son nom
PrintToUart0("Vu : ") ;
PrintToUart0(transformeNom(listeFormes[i].id)) ;
PrintToUart0("\n") ;

// si rien n’est reçu
if (nombre == 0)
SendString("Rien !\n") ;


return 0 ;

char* transformeNom(UInt8 id)

switch(id)

case IDP_CIRCLE :
return "cercle" ;
case IDP_CROSS :
return "croix" ;
case IDP_TRIANGLE :
return "triangle" ;
default :
return "inconnu" ;


Résultat

Il suffit de redémarrer la caméra, d’ouvrir un terminal série (ici, Docklight pour sa facilité à envoyer de manière répétée un caractère, par clic sur un bouton) et de pointer avec l’objectif différentes zones de l’écran, dont les 3 images qu’on a utilisé en patterns (attention aux reflets, ça marche mieux avec des patterns imprimés).

Autre version

Si on rajoute l’affichage des coordonnées, et avec une photo prise avec notre programme précédent, voici ce que ça donne :

Retour avec coordonnées
Visualisation du centre

Vos commentaires

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.