Projet Cvlib. Implémentation OpenCV pour Pure Data (environnement Flext) Jean-Yves Gratius, Mars 2010 jy.gratius.free.fr



Documents pareils
Programmer en JAVA. par Tama

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Généralités sur le Langage Java et éléments syntaxiques.

Windows serveur 2008 installer hyperv

Programme de formation

Systeme d'exploitation

TP1 : Initiation à Java et Eclipse

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Artica. La déduplication. Révision Du 08 Février 2011 version

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

La technologie Java Card TM

MS 2615 Implémentation et support Microsoft Windows XP Professionnel

Compression de Données - Algorithme de Huffman Document de Conception

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Table des matières L INTEGRATION DE SAS AVEC JMP. Les échanges de données entre SAS et JMP, en mode déconnecté. Dans JMP

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Programmation système I Les entrées/sorties

La boîte à outils GAS sur clé USB - Manuel d utilisation de la Mise à jour Smart

Symantec Backup Exec 2012

DA MOTA Anthony - Comparaison de technologies : PhoneGap VS Cordova

TP1. Outils Java Eléments de correction

Communications performantes par passage de message entre machines virtuelles co-hébergées

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Programmation par les Objets en Java

G. Méthodes de déploiement alternatives

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

Les Virtual LAN. F. Nolot. Master 1 STIC-Informatique 1

TP : Gestion d une image au format PGM

3IS - Système d'exploitation linux - Programmation système

Une introduction à Java

LANGAGUE JAVA. Public Développeurs souhaitant étendre leur panel de langages de programmation

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

McAfee Data Loss Prevention Endpoint 9.4.0

Auto-évaluation Programmation en Java

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Qui ont toujours à mon côté pour me soutenir et me guider au long de ce projet.

Traitement numérique de l'image. Raphaël Isdant

Le Ro le Hyper V Premie re Partie Configuration et Prise en main du gestionnaire Hyper-V

Préparer la synchronisation d'annuaires

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Hyper-V et SC Virtual Machine Manager sous Windows Server 2008 R2

Présentation des PowerToy pour Windows XP

2. Comprendre les définitions de classes

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Le service FTP. M.BOUABID, Page 1 sur 5

Plate formes mobiles. Utilisation. Contexte 9/29/2010 IFC 2. Deux utilisations assez distinctes :

Retrospect 7.7 Addendum au Guide d'utilisation

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Table des matières 1 Accès distant sur Windows 2008 Server Introduction...2

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

Initiation à JAVA et à la programmation objet.

Restauration rapide et fiable sur des plates-formes matérielles différentes, dans des environnements virtuels ou sur des sites distants.

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

PHP 5.4 Développez un site web dynamique et interactif

Cours 14 Les fichiers

2. MAQUETTAGE DES SOLUTIONS CONSTRUCTIVES. 2.2 Architecture fonctionnelle d un système communicant.

Éléments de programmation et introduction à Java

GUIDE DE L UTILISATEUR Recoveo Récupérateur de données

Cours 1: Java et les objets

MODULES 3D TAG CLOUD. Par GENIUS AOM

Note technique. Formats de compression vidéo utilisés par CamTrace V11 avantages et inconvénients.

I. Introduction aux fonctions : les fonctions standards

CAHIER DES CHARGES D IMPLANTATION

Héritage presque multiple en Java (1/2)

as Architecture des Systèmes d Information

Programmation parallèle et distribuée (Master 1 Info )

IMPORTATION, CRÉATION, MANIPULATION, EXPORTATION DE DONNÉES STATISTIQUES

Machine virtuelle installée sur le poste du citoyen

La GEIDE. Dans une solution GEIDE, il est possible d'associer au sein même d'un dossier:

Présentation. NOUVEAU Prise en charge des derniers environnements virtuels VMware ESX 3.5, Microsoft Hyper-V et Citrix XenServer 4.

Réseau Global MIDI Note applicative

Introduction au langage C

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Modernisation et développement d applications IBM i Stratégies, technologies et outils. Volubis.fr

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Langage Java. Classe de première SI

Les RPV (Réseaux Privés Virtuels) ou VPN (Virtual Private Networks)

Création d objet imbriqué sous PowerShell.

PROTECTION DE MACHINE VIRTUELLE VMWARE DELL POWERVAULT DL2000 OPTIMISÉ PAR SYMANTEC

Can we trust smartphones?

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

EXPERTS EN DÉVELOPPEMENT ET MODERNISATION DE LOGICIELS WEB ET MOBILES

Chapitre I : le langage UML et le processus unifié

Java 7 Les fondamentaux du langage Java

Acronis Backup & Recovery 10 Advanced Server Virtual Edition. Guide de démarrage rapide

COMMENT FAIRE? Comment bien se servir de WinHIIP? Expérimenter grâce aux guides imprimés!

Gestion collaborative de documents

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

Tune Sweeper Manuel de l'utilisateur

Bases Java - Eclipse / Netbeans

2 Grad Info Soir Langage C++ Juin Projet BANQUE

MYXTRACTION La Business Intelligence en temps réel

PROJET ARCHI WINDOWS SERVER

Les stratégies de groupe (GPO) sous Windows Server 2008 et 2008 R2 Implémentation, fonctionnalités, dépannage [2ième édition]

Transcription:

Projet Cvlib Implémentation OpenCV pour Pure Data (environnement Flext) Jean-Yves Gratius, Mars 2010 jy.gratius.free.fr

Introduction OpenCV est une bibliothèque de fonctions C++ fournissant nombre d'outils pour la vision et la reconnissance d'images par ordinateur. Le projet Cvlib vise à implémenter un certain nombre de ces fonctions dans l'environnement de programmation graphique Pure Data. Le hangar : http://hangar.org/wikis/lab/doku.php?id=start:puredata_opencv propose un certain nombre d'externals compatibles avec les deux principales bibliothèques graphiques de Pure Data, pdp et GEM. Ces externals, dérivés des exemples de la documentation opencv, permettent de réaliser des opérations très utiles («face detection», etc...), mais ne sont pas disponibles sous Windows. D'un autre côté, cv.jit.(http://www.iamas.ac.jp/~jovan02/cv/), disponible pour Max MSP semble permettre des opérations d'un niveau plus élémentaire sur opencv. Actuellement, pour Pure Data, il n'existe pas de solution multiplateforme (windows / mac / linux) d'implémentation d'opencv à la fois haut et bas niveau. La bibliothèque d'externals cvlib vise à remédier à cela. La bibliothèque d'externals cvlib Les caractéristiques de la bibliothèque d'externals Cvlib sont les suivantes. Multiplateformes. Pour l'instant, seule une version Windows est proposée. Portage pour la plateforme Windows des objets existants pix_opencv_xxxxxxx proposés par hangar.org, jusqu'à présent seulement accessible aux utilisateurs de linux / OSX. Cvlib se veut un outil pour le prototypage rapide dans Pure Data d'algorithmes basés sur OpenCV. Par conséquent, le coeur de cette bibliothèque est constitué d'objets bas niveaux reprenant les noms des fonctions de base d'opencv qu'ils implémentent.

Compatibilité avec GEM Les objets de la bibliothèque cvlib peuvent fonctionner dans deux modes différents : Un mode compatible avec GEM, la bibliothèque graphique de référence pour PureData sous Windows. Un mode natif OpenCV, dans lequel les objets communiquent entre eux en s'échangeant des index pointant vers des structurs de données standard d'opencv (IplImage, cvrect, etc...) Les objets acceptent indifféremment les deux modes et permettent facilement le passage d'un mode à l'autre. Il est possible de mixer les deux modes dans un même patch. Le framework associé à cvlib Conjointement à cvlib, nous proposons un framework de développement multiplateformes pour faciliter l'implémentation dans Pure Data des fonctionnalités de OpenCV. Les classes de base C++ de cvlib ont pour but de faciliter la création de nouveaux objets, avec gestion intégrée des messages et données (inlet, outlet, import/export GEM) Nous avons choisi de développer ce framework dans l'environnement FLEXT développé par Thomas Grill (http://puredata.info/members/thomas/flext/) qui présente deux avantages principaux : Cet environnement permet d'écrire en C++ (comme OpenCV), contrairement à Pure Data qui est écrit en C. Cet environnement est multiplateforme (tout comme OpenCV), ce qui facilitera le port vers les différentes plateformes. Un port vers MAX est théoriquement envisageable.

Structure des données En mode natif opencv, Cvlib utilise les structures de données d'opencv, «empaquetées» dans un format conteneur spécifique qui permet de partager des données entre différents objets dans pure-data. Le principe est de transmettre un identificateur de type (exemple : cvimage, cvcontours) suivi d'un index qui fait référence à un pointeur interne indiquant où se trouve la structure de données OpenCV correspondante. Ce principe permet de partager différents types de données (et pas seulement des images), dans un contexte sécurisé puisque le type est non seulement explicitement spécifié dans les messages qui transitent entre objets, mais est aussi revérifié en interne dans la structure de stockage elle-même. Cela doit éviter les erreurs de type «pointeur fou» ou de mélange entre types de données en cas d'erreurs dans le patch. Pourquoi ne pas utiliser la structure de données de GEM ou pdp? Le choix de ce format conteneur spécifique est justifié par le fait que OpenCV propose de nombreux types de données et qu'il est souhaitable d'accéder à toute la puissance de traitement de cet outil en adoptant ses formats. Par exemple, comparée à la structure ImageStruct de GEM, la structure IplImage de OpenCV permet de définir un COI (channel of interest) ou une ROI (region of interest), données très utiles pour le travail sur les images. Cependant, afin d'assurer la compatibilité avec GEM, les objets créés avec le framework convertissent les messages de type gemstate <pointer><pointer> issus d'objets pix. Dans ce cas, ils effectuent également la conversion vers Gem en sortie. Il est possible de mixer les deux types de formats sur le même objet. La compatibilité avec pdp n'est pas envisagée pour l'instant. Ecriture d'une fonction simple de filtre d'image Voici un exemple d'une fonction cverode Au niveau de l'implémentation d'un module opencv, cela se résumera à écrire une fonction processimage(), les conversions éventuelles vers GEM étant intégrées dans la classe de base.

Exemple simple de module : cvlib_erode Le fichier header : cvlib_erode.h On définit une classe cvlib_erode qui est dérivée de la classe cvlib_imagefilter_1_1 1 #include "cvlib_imagefilter_1_1.h" 2 #include <stdio.h> 3 class cvlib_erode: 4 public cvlib_imagefilter_1_1 // classe de base cvlib_imagefilter_1_1 5 { 6 FLEXT_HEADER(cvlib_erode,cvlib_ImageFilter_1_1) 7 public: 8 cvlib_erode(int argc,t_atom *argv); 9 ~cvlib_erode(); 10 int iterations; 11 protected: 12 virtual int process_default_image(); 13 void set_iterations(int i); 14 private: 15 FLEXT_CALLBACK_I(set_iterations) 16 }; Le fichier C++ : cvlib_erode.cpp 1 #include "cvlib_erode.h" 2 // CONSTRUCTEUR 3 cvlib_erode::cvlib_erode(int argc,t_atom *argv) 4 { 5 AddInInt(); // inlet pour spécifier le nombre d'itérations de la méthode erode 6 FLEXT_ADDMETHOD(1,set_iterations);

7 // initialisation 8 set_iterations(1); 9 if(argc >= 1) 10 if (IsFloat(argv[0])) 11 set_iterations(getint(argv[0])) 12 } 13 14 // DESTRUCTEUR 15 cvlib_erode::~cvlib_erode() 16 {} 17 18 // GESTION INLET DE DROITE 19 void cvlib_erode::set_iterations(int i) 20 { 21 iterations=min(64,max(0, i)); 22 } 23 24 // MODULE DE TRAITEMENT PRINCIPAL : process_default_image() 25 int cvlib_erode::process_default_image() 26 { 27 // prepare dest image de même taille que l'original 28 int result=cvlib_prepareiplimage(&cvimagedest, cvimagesource->width, cvimagesource->height, cvimagesource->nchannels); 29 if (result) 30 cverode( cvimagesource, cvimagedest, 0,iterations ); 31 return result; 32 } 33 // DECLARATION DE L'EXTERNAL 34 FLEXT_LIB_V("cvErode",cvlib_erode);

Les classes de base cvlib_imagefilter_0_1 Source d'image filtre cvimagedest cvlib_imagefilter_1_0 Destination d'image cvimagesource filtre cvlib_imagefilter_1_1 Filtre cvimagesource filtre cvimagedest cvlib_imagefilter_2_1 opérateur sur deux images sources cvimagesource1 filtre cvimagedest cvimagesource2 cvlib_image_transformation modification des dimensions (crop, resize, channel extract) Etc...

COI, ROI, mono/multichannel : Stratégies de prise en charge Certaines fonctions de OpenCV ne prenant pas en charge COI (Channel of Interset), ROI (Region of Interest) ou le multichannel, il convient de définir une stratégie à suivre (conversion) dans le cas où l'image source présente des caractéristiques différentes de celles normalement prises en charge par la fonction opencv à implémenter. Plusieurs scénarios sont par exemple possibles : Fonction opencv Scénario 1 Scénario 2 Scénario 3 Multichannel non pris en charge (exemple : cvcanny) Monochannel non pris en charge COI/ROI non pris en charge ne pas effectuer le traitement et afficher un message d'erreur en console ne pas effectuer le traitement et afficher un message d'erreur en console ne pas effectuer le traitement et afficher un message d'erreur en console Convertir l'image source en gray, effectuer le traitement sur l'image convertie (monochannel) Convertir l'image source en multichannel, effectuer le traitement sur l'image convertie (multichannel) Ignorer le paramètre COI/ROI, effectuer les conversions nécessaires de format Extraire chaque channel, effectuer le traitement sur chacun d'entre eux, puis reconstituer l'image multi-channel en sortie Conversion interne en multichannel Faire une copie en prenant en compte le COI/ROI, opérer des conversions internes si nécessaire. Le scénario 3 a l'avantage d'accroitre la polyvalence des fonctions opencv dans pure-data mais a pour inconvénients de rendre les erreurs moins faciles à déceler, et de s'éloigner des conventions OpenCV. Il peut néanmoins être utile dans le cas où l'on souhaite écrire des modules de traitement de haut niveau. Le scénario 2 est moins logique et peut porter à confusion. Le scénario 1 permet de rester le plus près possible des fonctions natives d'opencv. Les conversions nécessaires devront être effectuées par l'utilisateur dans pure data à l'aide de modules appropriés (test, copie, extraction, combinaison, fusion, etc...)

Encodage de la stratégie choisie : En décidant quelles fonctions virtuelles de la classe de base seront surchargées, on définit la stratégie de prise en charge des formats / du ROI/COI. Fonction virtuelle Rôle Comportement par défaut : virtual int process_roi_iplimage(); virtual int process_default_image(); appelée lorsque l'image source contient un COI/ROI. appelée lorsque l'image source ne correspond à aucune fonction surchargée Génère un message d'erreur Génère un message d'erreur virtual int process_4channels_image(); appelée lorsque l'image source contient 4 canaux Appelle process_default_image() virtual int process_rgba_image(); virtual int process_bgra_image(); appelée lorsque l'image source est RGBA Appelle process_4channels_image() appelée lorsque l'image source est BGRA Appelle process_4channels_image() virtual int process_3channels_image(); appelée lorsque l'image source contient 3 canaux Appelle process_default_image() virtual int process_rgb_image(); appelée lorsque l'image source est RGB Appelle process_3channels_image(); virtual int process_bgr_image(); appelée lorsque l'image source est BGR Appelle process_3channels_image() virtual int process_2channels_image(); appelée lorsque l'image source contient 2 canaux Appelle process_default_image() virtual int process_1channel_image(); appelée lorsque l'image source est monocanal Appelle process_default_image()