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".
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 :
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 :
Vos commentaires
# Le 27 janvier 2013 à 13:20, par alfonso En réponse à : Détection d’une forme avec la Pob-Eye 2
Thanks,this code helped me a Great deal.
but how can I determine the position of the object in a scene
Répondre à ce message