<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://air.imag.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maxence</id>
	<title>air - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://air.imag.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maxence"/>
	<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php/Special:Contributions/Maxence"/>
	<updated>2026-06-01T14:05:56Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=10281</id>
		<title>Fusion multi-capteurs pour table tactile</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=10281"/>
		<updated>2013-03-23T10:49:59Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Enseignants: Didier Donsez&lt;br /&gt;
&lt;br /&gt;
Client: DIGITALE&lt;br /&gt;
&lt;br /&gt;
Eleves RICM5: Maxence Raoux (Responsable Communication), Léopold Dauvergne&lt;br /&gt;
&lt;br /&gt;
=Presentation=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif de ce projet est de mettre en place des méthodes permettant à la table tactile de Digitale d’interagir avec son environnement extérieur sans action physique des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
La durée du projet est de 6 semaines et la charge de travail est variable et modulée selon les autres cours, séminaires et projets qui prennent aussi place durant cette période.&lt;br /&gt;
&lt;br /&gt;
La représentation de la solution développée respecte l’implémentation souhaité par Digitale, voir schéma ci-dessous, tiré du cahier des charges :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Screenshot_from_2013-03-21_15-44-27.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Projet=&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
==Choix et contraintes matérielles==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps nous avons étudié les différents types de capteurs et les interactions requises pour activer ceux-ci. Nous avons ainsi exclu les options suivantes :&lt;br /&gt;
&lt;br /&gt;
- Kinect : Requiert d’avoir plusieurs kinects disposées autour de la table (et non sur celle-ci), budget assez conséquent et non pratique lors du transport de la table.&lt;br /&gt;
&lt;br /&gt;
- NFC : Bien que pratique ce dernier nécessite que l’utilisateur ai un badge et se loggue sur la table. Cette solution pourrait être adoptée à terme pour permettre d’apporter à l’utilisateur un contenu vraiment personnalisé.&lt;br /&gt;
&lt;br /&gt;
- Caméras : Cette solution, semblable à la Kinect, pose les mêmes soucis que pour la Kinect, il n’est pas facilement envisageable d’installer des caméras dans la pièce et embarquer des caméras dans la table serait complexe notamment au niveau du recul nécessaire.&lt;br /&gt;
&lt;br /&gt;
Notre choix s’est donc porté sur des capteurs permettant d’être embarqués de manière « simple » au sein de la table. Le détail des différents types de capteurs est disponible dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
==Capteurs==&lt;br /&gt;
&lt;br /&gt;
Durant la première partie du projet nous avons étudié les différents types de capteurs qui pourraient correspondre au besoin de l’entreprise :&lt;br /&gt;
Capteurs de contact : Ce premier type de capteur est intéressant car il permet une détection nette de la personne si celle-ci est en contact physique avec la table. Néanmoins nous n’avons pas choisi cette solution car il nous parait important pour la table de détecter les personnes arrivant sur cette dernière.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Capteurs infrarouge : Il s’agit du premier type de capteur que nous avons expérimenté. Ceux-ci sont très directifs et offrent une bonne précision (de l’ordre du millimètre) sur un distance assez grande (allant jusqu’à 1-2mètres). Nous avons eu durant notre projet un capteur infrarouge qui nous donnait des résultats satisfaisants, pour un prix faible (~5€) voici ses caractéristiques :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:547132375_615.jpg|400px|thumb|center|E18-D50NK]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ses caractéristiques sont : &lt;br /&gt;
&lt;br /&gt;
- Power Supply :5V DC&lt;br /&gt;
&lt;br /&gt;
- Quiescent Current : &amp;lt;2mA&lt;br /&gt;
&lt;br /&gt;
- Effectual Angle: &amp;lt;15°&lt;br /&gt;
&lt;br /&gt;
- Ranging Distance : 2cm – 500 cm/1&amp;quot; - 16ft&lt;br /&gt;
&lt;br /&gt;
- Resolution : 0.3 cm&lt;br /&gt;
&lt;br /&gt;
Capteurs à ultrasons : Il s’agit du type de capteur préféré lors de nos premières réunions avec Digitale, notamment car Mr Donsez avait commandé un certain nombre de capteurs lors du début du projet. Ces capteurs ont l’avantage d’être peu cher (~3-5€), d’avoir une bonne portée et d’être relativement précis. Voici les spécifications du modèle de capteur à ultrasons choisi : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:HC-SR04-lg.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
La datasheet est disponible [http://jaktek.com/wp-content/uploads/2011/12/HC-SR04.pdf ici].&lt;br /&gt;
&lt;br /&gt;
- Alimentation : 5V&lt;br /&gt;
- Consommation : &amp;lt; 12mA&lt;br /&gt;
- Distance : 2-500cm avec un angle de 15 dégrés&lt;br /&gt;
&lt;br /&gt;
Ce module dispose simplement de 4 pins de sortie : VCC, TRIG, ECHO, GND. Il est donc très facile de l&#039;interfacer à un microcontrôleur. Le processus complet est le suivant: &lt;br /&gt;
&lt;br /&gt;
Mettre la pin &amp;quot;TRIG&amp;quot; une impulsion de niveau haut (5V) durant au moins 10µs et le module démarre sa lecture; A la fin de la mesure, s&#039;il détecte un objet devant lui, la pin &amp;quot;ECHO&amp;quot; passe au niveau haut (5V). &lt;br /&gt;
La distance où se situe l&#039;obstacle est proportionnelle à la durée de cette impulsion. Il est donc très facile de calculer cette distance avec la formule suivante:&lt;br /&gt;
&lt;br /&gt;
Distance = ((Durée du niveau haut)*(vitesse du son: 340 m/s))/2.&lt;br /&gt;
&lt;br /&gt;
Notre prototype fonctionne avec ce dernier type de capteur, son implémentation est décrite dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
Les capteurs seront idéalement placé sous l&#039;écran de la table, le long des bordures, comme dans l&#039;illustration ci dessous:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaTablesSensors.jpg|500px|thumb|center|Les capteurs sont représentés par les triangles noirs.]]&lt;br /&gt;
&lt;br /&gt;
==Solution adoptée==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi d’utiliser en priorité des capteurs à ultrasons car ces derniers étaient les seuls à être disponible suffisamment rapidement en plus de posséder les caractéristiques techniques qui correspondaient à notre besoin. Pour le prototype, nous avons construit une barre en bois sur laquelle les capteurs sont fixés. Nous avons choisi de « serrer » les capteurs pour gagner en précision, ils sont donc espacés d’environ 3 cm. Voici une photo du montage : &lt;br /&gt;
&lt;br /&gt;
[[Image:DSC00731-Small.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Pour la connectique, un Arduino peut gérer jusqu’à 18 capteurs à condition d’unifier la pin servant de trigger. D’un point de vue software, notre programme gère jusqu’à 15 capteurs, ceci permet de garder une assez bonne réactivité car les capteurs sont « interrogés » un à un. Pour accélérer encore plus ce processus, nous avons limité la distance de détection à 100 cm.&lt;br /&gt;
&lt;br /&gt;
La librairie utilisée est disponible [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ici].&lt;br /&gt;
&lt;br /&gt;
Le code sur lequel nous nous sommes basé est disponible [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ici]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
Pour la partie software, nous avons utilisé le langage C# et avons développés plusieurs modules orientés autour d&#039;un bus à messages dont voici un schéma:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaBUSSONARTABLE.jpg|600px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Concernant le bus à messages, nous utilisons un produit développé par le CENA  nommé Ivy. Le site internet du projet est disponible [http://www.tls.cena.fr/products/ivy/ ici]. Pour rendre l&#039;utilisation de la bibliothèque Ivy plus agréable à utiliser, et l&#039;adapter au projet, nous avons créer une bibliothèque qui est utilisée dans chaque module. Elle permet par exemple de faire une connexion automatique sur le port et adresse réseau de l&#039;application, mais surtout d&#039;améliorer la réception et envoi de messages sur le bus Ivy. En effet cette bibliothèque gère les messages sous forme d&#039;objets et non de comme de simple chaînes de caractères. De plus cela rend l&#039;application plus maintenable puisque toute la gestion des messages est écrire dans une unique bibliothèque. &lt;br /&gt;
&lt;br /&gt;
Le module d&#039;écoute des capteurs permet de récupérer l&#039;information générée par les Arduinos connectés aux différents ports COM et d&#039;envoyer ces informations &amp;quot;brutes&amp;quot; sur le bus Ivy. Pour récupérer les informations provenant des capteurs, nous avons modifié [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ce programme] destiné à la plateforme Arduino. &lt;br /&gt;
Ce module possède une interface graphique de configuration pour sélectionner les ports COM sur lesquels sont connectés les Arduinos. Actuellement un seul est sélectionnable dans l&#039;interface et un seul thread d’écoute est lancé. Mais l&#039;évolution du programme vers plusieurs se résume à une ligne de code si nécessaire. &lt;br /&gt;
&lt;br /&gt;
Le module de traitement permet de récupérer les informations des capteurs envoyés sur le bus et de les traiter. Dans le cadre de notre projet il ne reçoit et traite seulement les messages envoyés par les capteurs ultra-sons. Une évolution vers différent type de capteurs se résumerai donc à l&#039;abonnement sur le bus Ivy d&#039;autre type de messages et à leurs traitements. Le traitement des informations consistes à générer des messages de plus haut niveau et ainsi abstraire les informations qui proviennes des capteurs, cela permet donc de proposer plusieurs services qui sont chacun basés sur un ou plusieurs types de capteurs. Ces informations sont ensuite à nouveau transférées sur le bus Ivy. Pour notre projet deux messages sont générés. Présence et position. Présence signale l&#039;arrivé et le départ d&#039;une personne, et position donne la position de la personne autour de la table ainsi que sa distance par rapport à elle. &lt;br /&gt;
&lt;br /&gt;
L&#039;application client est dans notre cas une application de démonstration technologique qui affiche des fenêtres suivant le mouvement des utilisateurs autour de la table. Elle est basée sur le sdk Microsoft Surface.&lt;br /&gt;
&lt;br /&gt;
Git et source : https://bitbucket.org/ldauvergne/table-interact-2013&lt;br /&gt;
&lt;br /&gt;
==Architecture==&lt;br /&gt;
&lt;br /&gt;
*Architecture découpée en deux modules&lt;br /&gt;
** SerialPortListener&lt;br /&gt;
*** Ecoute l’Arduino (et les capteurs) et renvois des informations brutes.&lt;br /&gt;
*** Possède une interface de configuration (port com vers Arduino + Baud)&lt;br /&gt;
*** Envois des messages type : STArduino = &amp;lt;Capteur&amp;gt;;&amp;lt;Distance&amp;gt;&lt;br /&gt;
** BundlePP&lt;br /&gt;
*** Traite les données envoyées par SerialPortListener pour générer des informations de position et de présence. &lt;br /&gt;
*** Possède une interface de configuration (nombres de capteurs en longueur et largeur + résolution de la table)&lt;br /&gt;
*** Envois des messages type : Presence = &amp;lt;Capteur&amp;gt;;&amp;lt;Presence&amp;gt; et Position = &amp;lt;Capteur&amp;gt;;&amp;lt;x&amp;gt;;&amp;lt;y&amp;gt;;&amp;lt;distance&amp;gt;&lt;br /&gt;
*** Ces messages sont envoyé par un algorithme de décision qui prend en compte les 3 paramètre cités au chapitre précédent. nbAbsenceAcceptee / distanceDifferenceAcceptee / reglageInterval&lt;br /&gt;
*Echange via un bus de données Ivy. Création d’une bibliothèque de fonction Ivycom&lt;br /&gt;
*Deux applications exemples : &lt;br /&gt;
** SonarVizualizer : Affichage minimaliste des données envoyé depuis le module SerialPortListner&lt;br /&gt;
** SonarTable : Affichage des données reçus depuis BundlePP avec des feneêtre&lt;br /&gt;
&lt;br /&gt;
=Marketing=&lt;br /&gt;
&lt;br /&gt;
== Video ==&lt;br /&gt;
&lt;br /&gt;
Une vidéo de démonstration disponible [http://www.youtube.com/watch?v=8VKd9UdPNmc ici].&lt;br /&gt;
&lt;br /&gt;
== Poster ==&lt;br /&gt;
&lt;br /&gt;
[[Image:PosterSonarTable.jpg|600px|thumb|center| Resolution originale : 1024*768]]&lt;br /&gt;
&lt;br /&gt;
== Flyer ==&lt;br /&gt;
&lt;br /&gt;
Disponible [http://air.imag.fr/mediawiki/images/0/07/FliyerSonarTable.pdf ici].&lt;br /&gt;
&lt;br /&gt;
== Transparents ==&lt;br /&gt;
&lt;br /&gt;
Disponibles [http://air.imag.fr/mediawiki/images/b/be/Sonar_TablePresentation.pdf ici].&lt;br /&gt;
&lt;br /&gt;
= Optimisations à apporter =&lt;br /&gt;
&lt;br /&gt;
Une fois le prototype monté nous nous sommes rendu compte que les capteurs n’étaient pas très fiables et avaient tendance à ne pas détecter une personne alors que celle-ci était bien présente. Pour essayer de remédier à ce problème nous avons resserré les capteurs mais le problème à tendance à persister. Nous avons donc mis en place des solutions d’optimisation logicielle mais permettre de réduire le problème mais ne le résout pas totalement.&lt;br /&gt;
&lt;br /&gt;
= Suggestions =&lt;br /&gt;
&lt;br /&gt;
D’un point de vue hardware, nous vous conseillons de faire des tests avec d’autres types de capteurs, dont des capteurs infrarouges. Un mélange des deux est aussi envisageable est permettrait de s’affranchir des problèmes inhérents à un type de capteur.&lt;br /&gt;
&lt;br /&gt;
=Suivi=&lt;br /&gt;
&lt;br /&gt;
==Semaine 5== &lt;br /&gt;
* Définition des objectifs du projet&lt;br /&gt;
* Mise en place du dépôts&lt;br /&gt;
* Création d&#039;un projet vide contenant une application Microsoft Surface vide : SonarTable.&lt;br /&gt;
* Mise en place de réunion hebdomadaire pour avoir un bon suivis du projet.&lt;br /&gt;
&lt;br /&gt;
==Semaine 6==&lt;br /&gt;
* Connexion à l&#039;arduino via le port COM. &lt;br /&gt;
* Création du projet SerialPortListener pour écouter l&#039;Arduino.   &lt;br /&gt;
* Apprentissage de la bibliothèque Ivy et création de la bibliothèque IvyCom.&lt;br /&gt;
* Compilation de la bibliothèque ivy pour qu&#039;elle soit disponible sur l&#039;architecture x64 demandé par les applications Surface.&lt;br /&gt;
* Création d&#039;évenements c# pour créer le dialogue entre la  bibliothèque IvyCom et les projets qui l&#039;utilise. &lt;br /&gt;
* Création d&#039;une interface pour paramétrer SerialPortListener &lt;br /&gt;
&lt;br /&gt;
==Semaine 7==&lt;br /&gt;
* Conversion du projet SerialPortListener en x64&lt;br /&gt;
* Création de la bibliothèque MiddleWare pour traiter les message reçut de l&#039;Arduino et envoyer un évènement c# à l&#039;application SonarTable. &lt;br /&gt;
* Création des classes Personnes et Personne pour traiter les différentes personnes présente autour de la table. &lt;br /&gt;
* Création de nombreuse fonction dans les classe Personnes et Personne. Tel que : &lt;br /&gt;
** Ajouter / Supprimer capteurs&lt;br /&gt;
** Recherche personne par id&lt;br /&gt;
**Recherche personne par capteur&lt;br /&gt;
** Ajout / Suppression de personnes ...&lt;br /&gt;
* Création d&#039;un buffer pour sauvegarder par personnes les messages voulus.&lt;br /&gt;
* Début d&#039;algorithme de décision dans MiddleWare pour la conversion de message type Arduino de SerialPortListener par des messages utilisables par l&#039;application SonarTable.&lt;br /&gt;
* Affichage de fenêtres dans l&#039;application SonarTable affichant les données des messages reçuts.&lt;br /&gt;
&lt;br /&gt;
==Semaine 8==&lt;br /&gt;
* Grosse amélioration de l&#039;algorithme de décision&lt;br /&gt;
* Nombreuse correction de bug&lt;br /&gt;
* Placement des fenêtres sur la l&#039;application SonarTable selon la valeurs des messages. &lt;br /&gt;
* Réflexion sur un changement de structure : &lt;br /&gt;
MiddleWare ne communiquera plus comme une bibliothèque avec SonarTable mais via le bus ivy.&lt;br /&gt;
&lt;br /&gt;
==Semaine 9==&lt;br /&gt;
* Mise en place de la nouvelle structure.&lt;br /&gt;
* Changement de la gestion des fenêtres sur SonarTable dû aux changements de la structure (plus simple)&lt;br /&gt;
* Mise en place de variable de configurations pour l&#039;algorithme de décision : &lt;br /&gt;
** nbAbsenceAcceptee : Nombre de messages d’absences acceptés. Cette variable est dû à des erreurs de distance parfois envoyée par les capteurs.&lt;br /&gt;
** distanceDifferenceAcceptee : Correspond à la distance envoyée entre deux capteurs qui permet de différencier une personne d&#039;une autre.  &lt;br /&gt;
** reglageInterval : Nombre de capteurs à proximité nécessaire pour considérer le déplacement d&#039;une fenêtre.&lt;br /&gt;
&lt;br /&gt;
==Semaine 10==&lt;br /&gt;
* Amélioration de la connexion via le bus ivy&lt;br /&gt;
* Amélioration de la position des fenêtres sur SonarTable.&lt;br /&gt;
* Orientation des fenêtres sur SonarTable.&lt;br /&gt;
* Optimisation de l&#039;algorithme&lt;br /&gt;
* Correction de bugs.&lt;br /&gt;
* Début de rapport&lt;br /&gt;
&lt;br /&gt;
==Semaine 11==&lt;br /&gt;
* Création d&#039;une nouvelle application qui affiche les valeurs reçut par l&#039;Arduino. &lt;br /&gt;
* Ecriture du rapport.&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=10280</id>
		<title>Fusion multi-capteurs pour table tactile</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=10280"/>
		<updated>2013-03-23T10:46:57Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Architecture */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Enseignants: Didier Donsez&lt;br /&gt;
&lt;br /&gt;
Client: DIGITALE&lt;br /&gt;
&lt;br /&gt;
Eleves RICM5: Maxence Raoux (Responsable Communication), Léopold Dauvergne&lt;br /&gt;
&lt;br /&gt;
=Presentation=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif de ce projet est de mettre en place des méthodes permettant à la table tactile de Digitale d’interagir avec son environnement extérieur sans action physique des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
La durée du projet est de 6 semaines et la charge de travail est variable et modulée selon les autres cours, séminaires et projets qui prennent aussi place durant cette période.&lt;br /&gt;
&lt;br /&gt;
La représentation de la solution développée respecte l’implémentation souhaité par Digitale, voir schéma ci-dessous, tiré du cahier des charges :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Screenshot_from_2013-03-21_15-44-27.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Projet=&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
==Choix et contraintes matérielles==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps nous avons étudié les différents types de capteurs et les interactions requises pour activer ceux-ci. Nous avons ainsi exclu les options suivantes :&lt;br /&gt;
&lt;br /&gt;
- Kinect : Requiert d’avoir plusieurs kinects disposées autour de la table (et non sur celle-ci), budget assez conséquent et non pratique lors du transport de la table.&lt;br /&gt;
&lt;br /&gt;
- NFC : Bien que pratique ce dernier nécessite que l’utilisateur ai un badge et se loggue sur la table. Cette solution pourrait être adoptée à terme pour permettre d’apporter à l’utilisateur un contenu vraiment personnalisé.&lt;br /&gt;
&lt;br /&gt;
- Caméras : Cette solution, semblable à la Kinect, pose les mêmes soucis que pour la Kinect, il n’est pas facilement envisageable d’installer des caméras dans la pièce et embarquer des caméras dans la table serait complexe notamment au niveau du recul nécessaire.&lt;br /&gt;
&lt;br /&gt;
Notre choix s’est donc porté sur des capteurs permettant d’être embarqués de manière « simple » au sein de la table. Le détail des différents types de capteurs est disponible dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
==Capteurs==&lt;br /&gt;
&lt;br /&gt;
Durant la première partie du projet nous avons étudié les différents types de capteurs qui pourraient correspondre au besoin de l’entreprise :&lt;br /&gt;
Capteurs de contact : Ce premier type de capteur est intéressant car il permet une détection nette de la personne si celle-ci est en contact physique avec la table. Néanmoins nous n’avons pas choisi cette solution car il nous parait important pour la table de détecter les personnes arrivant sur cette dernière.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Capteurs infrarouge : Il s’agit du premier type de capteur que nous avons expérimenté. Ceux-ci sont très directifs et offrent une bonne précision (de l’ordre du millimètre) sur un distance assez grande (allant jusqu’à 1-2mètres). Nous avons eu durant notre projet un capteur infrarouge qui nous donnait des résultats satisfaisants, pour un prix faible (~5€) voici ses caractéristiques :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:547132375_615.jpg|400px|thumb|center|E18-D50NK]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ses caractéristiques sont : &lt;br /&gt;
&lt;br /&gt;
- Power Supply :5V DC&lt;br /&gt;
&lt;br /&gt;
- Quiescent Current : &amp;lt;2mA&lt;br /&gt;
&lt;br /&gt;
- Effectual Angle: &amp;lt;15°&lt;br /&gt;
&lt;br /&gt;
- Ranging Distance : 2cm – 500 cm/1&amp;quot; - 16ft&lt;br /&gt;
&lt;br /&gt;
- Resolution : 0.3 cm&lt;br /&gt;
&lt;br /&gt;
Capteurs à ultrasons : Il s’agit du type de capteur préféré lors de nos premières réunions avec Digitale, notamment car Mr Donsez avait commandé un certain nombre de capteurs lors du début du projet. Ces capteurs ont l’avantage d’être peu cher (~3-5€), d’avoir une bonne portée et d’être relativement précis. Voici les spécifications du modèle de capteur à ultrasons choisi : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:HC-SR04-lg.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
La datasheet est disponible [http://jaktek.com/wp-content/uploads/2011/12/HC-SR04.pdf ici].&lt;br /&gt;
&lt;br /&gt;
- Alimentation : 5V&lt;br /&gt;
- Consommation : &amp;lt; 12mA&lt;br /&gt;
- Distance : 2-500cm avec un angle de 15 dégrés&lt;br /&gt;
&lt;br /&gt;
Ce module dispose simplement de 4 pins de sortie : VCC, TRIG, ECHO, GND. Il est donc très facile de l&#039;interfacer à un microcontrôleur. Le processus complet est le suivant: &lt;br /&gt;
&lt;br /&gt;
Mettre la pin &amp;quot;TRIG&amp;quot; une impulsion de niveau haut (5V) durant au moins 10µs et le module démarre sa lecture; A la fin de la mesure, s&#039;il détecte un objet devant lui, la pin &amp;quot;ECHO&amp;quot; passe au niveau haut (5V). &lt;br /&gt;
La distance où se situe l&#039;obstacle est proportionnelle à la durée de cette impulsion. Il est donc très facile de calculer cette distance avec la formule suivante:&lt;br /&gt;
&lt;br /&gt;
Distance = ((Durée du niveau haut)*(vitesse du son: 340 m/s))/2.&lt;br /&gt;
&lt;br /&gt;
Notre prototype fonctionne avec ce dernier type de capteur, son implémentation est décrite dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
Les capteurs seront idéalement placé sous l&#039;écran de la table, le long des bordures, comme dans l&#039;illustration ci dessous:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaTablesSensors.jpg|500px|thumb|center|Les capteurs sont représentés par les triangles noirs.]]&lt;br /&gt;
&lt;br /&gt;
==Solution adoptée==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi d’utiliser en priorité des capteurs à ultrasons car ces derniers étaient les seuls à être disponible suffisamment rapidement en plus de posséder les caractéristiques techniques qui correspondaient à notre besoin. Pour le prototype, nous avons construit une barre en bois sur laquelle les capteurs sont fixés. Nous avons choisi de « serrer » les capteurs pour gagner en précision, ils sont donc espacés d’environ 3 cm. Voici une photo du montage : &lt;br /&gt;
&lt;br /&gt;
[[Image:DSC00731-Small.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Pour la connectique, un Arduino peut gérer jusqu’à 18 capteurs à condition d’unifier la pin servant de trigger. D’un point de vue software, notre programme gère jusqu’à 15 capteurs, ceci permet de garder une assez bonne réactivité car les capteurs sont « interrogés » un à un. Pour accélérer encore plus ce processus, nous avons limité la distance de détection à 100 cm.&lt;br /&gt;
&lt;br /&gt;
La librairie utilisée est disponible [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ici].&lt;br /&gt;
&lt;br /&gt;
Le code sur lequel nous nous sommes basé est disponible [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ici]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
Pour la partie software, nous avons utilisé le langage C# et avons développés plusieurs modules orientés autour d&#039;un bus à messages dont voici un schéma:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaBUSSONARTABLE.jpg|600px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Concernant le bus à messages, nous utilisons un produit développé par le CENA  nommé Ivy. Le site internet du projet est disponible [http://www.tls.cena.fr/products/ivy/ ici]. Pour rendre l&#039;utilisation de la bibliothèque Ivy plus agréable à utiliser, et l&#039;adapter au projet, nous avons créer une bibliothèque qui est utilisée dans chaque module. Elle permet par exemple de faire une connexion automatique sur le port et adresse réseau de l&#039;application, mais surtout d&#039;améliorer la réception et envoi de messages sur le bus Ivy. En effet cette bibliothèque gère les messages sous forme d&#039;objets et non de comme de simple chaînes de caractères. De plus cela rend l&#039;application plus maintenable puisque toute la gestion des messages est écrire dans une unique bibliothèque. &lt;br /&gt;
&lt;br /&gt;
Le module d&#039;écoute des capteurs permet de récupérer l&#039;information générée par les Arduinos connectés aux différents ports COM et d&#039;envoyer ces informations &amp;quot;brutes&amp;quot; sur le bus Ivy. Pour récupérer les informations provenant des capteurs, nous avons modifié [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ce programme] destiné à la plateforme Arduino. &lt;br /&gt;
Ce module possède une interface graphique de configuration pour sélectionner les ports COM sur lesquels sont connectés les Arduinos. Actuellement un seul est sélectionnable dans l&#039;interface et un seul thread d’écoute est lancé. Mais l&#039;évolution du programme vers plusieurs se résume à une ligne de code si nécessaire. &lt;br /&gt;
&lt;br /&gt;
Le module de traitement permet de récupérer les informations des capteurs envoyés sur le bus et de les traiter. Dans le cadre de notre projet il ne reçoit et traite seulement les messages envoyés par les capteurs ultra-sons. Une évolution vers différent type de capteurs se résumerai donc à l&#039;abonnement sur le bus Ivy d&#039;autre type de messages et à leurs traitements. Le traitement des informations consistes à générer des messages de plus haut niveau et ainsi abstraire les informations qui proviennes des capteurs, cela permet donc de proposer plusieurs services qui sont chacun basés sur un ou plusieurs types de capteurs. Ces informations sont ensuite à nouveau transférées sur le bus Ivy. Pour notre projet deux messages sont générés. Présence et position. Présence signale l&#039;arrivé et le départ d&#039;une personne, et position donne la position de la personne autour de la table ainsi que sa distance par rapport à elle. &lt;br /&gt;
&lt;br /&gt;
L&#039;application client est dans notre cas une application de démonstration technologique qui affiche des fenêtres suivant le mouvement des utilisateurs autour de la table. Elle est basée sur le sdk Microsoft Surface.&lt;br /&gt;
&lt;br /&gt;
==Architecture==&lt;br /&gt;
&lt;br /&gt;
*Architecture découpée en deux modules&lt;br /&gt;
** SerialPortListener&lt;br /&gt;
*** Ecoute l’Arduino (et les capteurs) et renvois des informations brutes.&lt;br /&gt;
*** Possède une interface de configuration (port com vers Arduino + Baud)&lt;br /&gt;
*** Envois des messages type : STArduino = &amp;lt;Capteur&amp;gt;;&amp;lt;Distance&amp;gt;&lt;br /&gt;
** BundlePP&lt;br /&gt;
*** Traite les données envoyées par SerialPortListener pour générer des informations de position et de présence. &lt;br /&gt;
*** Possède une interface de configuration (nombres de capteurs en longueur et largeur + résolution de la table)&lt;br /&gt;
*** Envois des messages type : Presence = &amp;lt;Capteur&amp;gt;;&amp;lt;Presence&amp;gt; et Position = &amp;lt;Capteur&amp;gt;;&amp;lt;x&amp;gt;;&amp;lt;y&amp;gt;;&amp;lt;distance&amp;gt;&lt;br /&gt;
*** Ces messages sont envoyé par un algorithme de décision qui prend en compte les 3 paramètre cités au chapitre précédent. nbAbsenceAcceptee / distanceDifferenceAcceptee / reglageInterval&lt;br /&gt;
*Echange via un bus de données Ivy. Création d’une bibliothèque de fonction Ivycom&lt;br /&gt;
*Deux applications exemples : &lt;br /&gt;
** SonarVizualizer : Affichage minimaliste des données envoyé depuis le module SerialPortListner&lt;br /&gt;
** SonarTable : Affichage des données reçus depuis BundlePP avec des feneêtre&lt;br /&gt;
&lt;br /&gt;
=Marketing=&lt;br /&gt;
&lt;br /&gt;
== Video ==&lt;br /&gt;
&lt;br /&gt;
Une vidéo de démonstration disponible [http://www.youtube.com/watch?v=8VKd9UdPNmc ici].&lt;br /&gt;
&lt;br /&gt;
== Poster ==&lt;br /&gt;
&lt;br /&gt;
[[Image:PosterSonarTable.jpg|600px|thumb|center| Resolution originale : 1024*768]]&lt;br /&gt;
&lt;br /&gt;
== Flyer ==&lt;br /&gt;
&lt;br /&gt;
Disponible [http://air.imag.fr/mediawiki/images/0/07/FliyerSonarTable.pdf ici].&lt;br /&gt;
&lt;br /&gt;
== Transparents ==&lt;br /&gt;
&lt;br /&gt;
Disponibles [http://air.imag.fr/mediawiki/images/b/be/Sonar_TablePresentation.pdf ici].&lt;br /&gt;
&lt;br /&gt;
= Optimisations à apporter =&lt;br /&gt;
&lt;br /&gt;
Une fois le prototype monté nous nous sommes rendu compte que les capteurs n’étaient pas très fiables et avaient tendance à ne pas détecter une personne alors que celle-ci était bien présente. Pour essayer de remédier à ce problème nous avons resserré les capteurs mais le problème à tendance à persister. Nous avons donc mis en place des solutions d’optimisation logicielle mais permettre de réduire le problème mais ne le résout pas totalement.&lt;br /&gt;
&lt;br /&gt;
= Suggestions =&lt;br /&gt;
&lt;br /&gt;
D’un point de vue hardware, nous vous conseillons de faire des tests avec d’autres types de capteurs, dont des capteurs infrarouges. Un mélange des deux est aussi envisageable est permettrait de s’affranchir des problèmes inhérents à un type de capteur.&lt;br /&gt;
&lt;br /&gt;
=Suivi=&lt;br /&gt;
&lt;br /&gt;
==Semaine 5== &lt;br /&gt;
* Définition des objectifs du projet&lt;br /&gt;
* Mise en place du dépôts&lt;br /&gt;
* Création d&#039;un projet vide contenant une application Microsoft Surface vide : SonarTable.&lt;br /&gt;
* Mise en place de réunion hebdomadaire pour avoir un bon suivis du projet.&lt;br /&gt;
&lt;br /&gt;
==Semaine 6==&lt;br /&gt;
* Connexion à l&#039;arduino via le port COM. &lt;br /&gt;
* Création du projet SerialPortListener pour écouter l&#039;Arduino.   &lt;br /&gt;
* Apprentissage de la bibliothèque Ivy et création de la bibliothèque IvyCom.&lt;br /&gt;
* Compilation de la bibliothèque ivy pour qu&#039;elle soit disponible sur l&#039;architecture x64 demandé par les applications Surface.&lt;br /&gt;
* Création d&#039;évenements c# pour créer le dialogue entre la  bibliothèque IvyCom et les projets qui l&#039;utilise. &lt;br /&gt;
* Création d&#039;une interface pour paramétrer SerialPortListener &lt;br /&gt;
&lt;br /&gt;
==Semaine 7==&lt;br /&gt;
* Conversion du projet SerialPortListener en x64&lt;br /&gt;
* Création de la bibliothèque MiddleWare pour traiter les message reçut de l&#039;Arduino et envoyer un évènement c# à l&#039;application SonarTable. &lt;br /&gt;
* Création des classes Personnes et Personne pour traiter les différentes personnes présente autour de la table. &lt;br /&gt;
* Création de nombreuse fonction dans les classe Personnes et Personne. Tel que : &lt;br /&gt;
** Ajouter / Supprimer capteurs&lt;br /&gt;
** Recherche personne par id&lt;br /&gt;
**Recherche personne par capteur&lt;br /&gt;
** Ajout / Suppression de personnes ...&lt;br /&gt;
* Création d&#039;un buffer pour sauvegarder par personnes les messages voulus.&lt;br /&gt;
* Début d&#039;algorithme de décision dans MiddleWare pour la conversion de message type Arduino de SerialPortListener par des messages utilisables par l&#039;application SonarTable.&lt;br /&gt;
* Affichage de fenêtres dans l&#039;application SonarTable affichant les données des messages reçuts.&lt;br /&gt;
&lt;br /&gt;
==Semaine 8==&lt;br /&gt;
* Grosse amélioration de l&#039;algorithme de décision&lt;br /&gt;
* Nombreuse correction de bug&lt;br /&gt;
* Placement des fenêtres sur la l&#039;application SonarTable selon la valeurs des messages. &lt;br /&gt;
* Réflexion sur un changement de structure : &lt;br /&gt;
MiddleWare ne communiquera plus comme une bibliothèque avec SonarTable mais via le bus ivy.&lt;br /&gt;
&lt;br /&gt;
==Semaine 9==&lt;br /&gt;
* Mise en place de la nouvelle structure.&lt;br /&gt;
* Changement de la gestion des fenêtres sur SonarTable dû aux changements de la structure (plus simple)&lt;br /&gt;
* Mise en place de variable de configurations pour l&#039;algorithme de décision : &lt;br /&gt;
** nbAbsenceAcceptee : Nombre de messages d’absences acceptés. Cette variable est dû à des erreurs de distance parfois envoyée par les capteurs.&lt;br /&gt;
** distanceDifferenceAcceptee : Correspond à la distance envoyée entre deux capteurs qui permet de différencier une personne d&#039;une autre.  &lt;br /&gt;
** reglageInterval : Nombre de capteurs à proximité nécessaire pour considérer le déplacement d&#039;une fenêtre.&lt;br /&gt;
&lt;br /&gt;
==Semaine 10==&lt;br /&gt;
* Amélioration de la connexion via le bus ivy&lt;br /&gt;
* Amélioration de la position des fenêtres sur SonarTable.&lt;br /&gt;
* Orientation des fenêtres sur SonarTable.&lt;br /&gt;
* Optimisation de l&#039;algorithme&lt;br /&gt;
* Correction de bugs.&lt;br /&gt;
* Début de rapport&lt;br /&gt;
&lt;br /&gt;
==Semaine 11==&lt;br /&gt;
* Création d&#039;une nouvelle application qui affiche les valeurs reçut par l&#039;Arduino. &lt;br /&gt;
* Ecriture du rapport.&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=10279</id>
		<title>Fusion multi-capteurs pour table tactile</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=10279"/>
		<updated>2013-03-23T10:45:38Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Architecture */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Enseignants: Didier Donsez&lt;br /&gt;
&lt;br /&gt;
Client: DIGITALE&lt;br /&gt;
&lt;br /&gt;
Eleves RICM5: Maxence Raoux (Responsable Communication), Léopold Dauvergne&lt;br /&gt;
&lt;br /&gt;
=Presentation=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif de ce projet est de mettre en place des méthodes permettant à la table tactile de Digitale d’interagir avec son environnement extérieur sans action physique des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
La durée du projet est de 6 semaines et la charge de travail est variable et modulée selon les autres cours, séminaires et projets qui prennent aussi place durant cette période.&lt;br /&gt;
&lt;br /&gt;
La représentation de la solution développée respecte l’implémentation souhaité par Digitale, voir schéma ci-dessous, tiré du cahier des charges :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Screenshot_from_2013-03-21_15-44-27.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Projet=&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
==Choix et contraintes matérielles==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps nous avons étudié les différents types de capteurs et les interactions requises pour activer ceux-ci. Nous avons ainsi exclu les options suivantes :&lt;br /&gt;
&lt;br /&gt;
- Kinect : Requiert d’avoir plusieurs kinects disposées autour de la table (et non sur celle-ci), budget assez conséquent et non pratique lors du transport de la table.&lt;br /&gt;
&lt;br /&gt;
- NFC : Bien que pratique ce dernier nécessite que l’utilisateur ai un badge et se loggue sur la table. Cette solution pourrait être adoptée à terme pour permettre d’apporter à l’utilisateur un contenu vraiment personnalisé.&lt;br /&gt;
&lt;br /&gt;
- Caméras : Cette solution, semblable à la Kinect, pose les mêmes soucis que pour la Kinect, il n’est pas facilement envisageable d’installer des caméras dans la pièce et embarquer des caméras dans la table serait complexe notamment au niveau du recul nécessaire.&lt;br /&gt;
&lt;br /&gt;
Notre choix s’est donc porté sur des capteurs permettant d’être embarqués de manière « simple » au sein de la table. Le détail des différents types de capteurs est disponible dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
==Capteurs==&lt;br /&gt;
&lt;br /&gt;
Durant la première partie du projet nous avons étudié les différents types de capteurs qui pourraient correspondre au besoin de l’entreprise :&lt;br /&gt;
Capteurs de contact : Ce premier type de capteur est intéressant car il permet une détection nette de la personne si celle-ci est en contact physique avec la table. Néanmoins nous n’avons pas choisi cette solution car il nous parait important pour la table de détecter les personnes arrivant sur cette dernière.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Capteurs infrarouge : Il s’agit du premier type de capteur que nous avons expérimenté. Ceux-ci sont très directifs et offrent une bonne précision (de l’ordre du millimètre) sur un distance assez grande (allant jusqu’à 1-2mètres). Nous avons eu durant notre projet un capteur infrarouge qui nous donnait des résultats satisfaisants, pour un prix faible (~5€) voici ses caractéristiques :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:547132375_615.jpg|400px|thumb|center|E18-D50NK]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ses caractéristiques sont : &lt;br /&gt;
&lt;br /&gt;
- Power Supply :5V DC&lt;br /&gt;
&lt;br /&gt;
- Quiescent Current : &amp;lt;2mA&lt;br /&gt;
&lt;br /&gt;
- Effectual Angle: &amp;lt;15°&lt;br /&gt;
&lt;br /&gt;
- Ranging Distance : 2cm – 500 cm/1&amp;quot; - 16ft&lt;br /&gt;
&lt;br /&gt;
- Resolution : 0.3 cm&lt;br /&gt;
&lt;br /&gt;
Capteurs à ultrasons : Il s’agit du type de capteur préféré lors de nos premières réunions avec Digitale, notamment car Mr Donsez avait commandé un certain nombre de capteurs lors du début du projet. Ces capteurs ont l’avantage d’être peu cher (~3-5€), d’avoir une bonne portée et d’être relativement précis. Voici les spécifications du modèle de capteur à ultrasons choisi : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:HC-SR04-lg.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
La datasheet est disponible [http://jaktek.com/wp-content/uploads/2011/12/HC-SR04.pdf ici].&lt;br /&gt;
&lt;br /&gt;
- Alimentation : 5V&lt;br /&gt;
- Consommation : &amp;lt; 12mA&lt;br /&gt;
- Distance : 2-500cm avec un angle de 15 dégrés&lt;br /&gt;
&lt;br /&gt;
Ce module dispose simplement de 4 pins de sortie : VCC, TRIG, ECHO, GND. Il est donc très facile de l&#039;interfacer à un microcontrôleur. Le processus complet est le suivant: &lt;br /&gt;
&lt;br /&gt;
Mettre la pin &amp;quot;TRIG&amp;quot; une impulsion de niveau haut (5V) durant au moins 10µs et le module démarre sa lecture; A la fin de la mesure, s&#039;il détecte un objet devant lui, la pin &amp;quot;ECHO&amp;quot; passe au niveau haut (5V). &lt;br /&gt;
La distance où se situe l&#039;obstacle est proportionnelle à la durée de cette impulsion. Il est donc très facile de calculer cette distance avec la formule suivante:&lt;br /&gt;
&lt;br /&gt;
Distance = ((Durée du niveau haut)*(vitesse du son: 340 m/s))/2.&lt;br /&gt;
&lt;br /&gt;
Notre prototype fonctionne avec ce dernier type de capteur, son implémentation est décrite dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
Les capteurs seront idéalement placé sous l&#039;écran de la table, le long des bordures, comme dans l&#039;illustration ci dessous:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaTablesSensors.jpg|500px|thumb|center|Les capteurs sont représentés par les triangles noirs.]]&lt;br /&gt;
&lt;br /&gt;
==Solution adoptée==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi d’utiliser en priorité des capteurs à ultrasons car ces derniers étaient les seuls à être disponible suffisamment rapidement en plus de posséder les caractéristiques techniques qui correspondaient à notre besoin. Pour le prototype, nous avons construit une barre en bois sur laquelle les capteurs sont fixés. Nous avons choisi de « serrer » les capteurs pour gagner en précision, ils sont donc espacés d’environ 3 cm. Voici une photo du montage : &lt;br /&gt;
&lt;br /&gt;
[[Image:DSC00731-Small.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Pour la connectique, un Arduino peut gérer jusqu’à 18 capteurs à condition d’unifier la pin servant de trigger. D’un point de vue software, notre programme gère jusqu’à 15 capteurs, ceci permet de garder une assez bonne réactivité car les capteurs sont « interrogés » un à un. Pour accélérer encore plus ce processus, nous avons limité la distance de détection à 100 cm.&lt;br /&gt;
&lt;br /&gt;
La librairie utilisée est disponible [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ici].&lt;br /&gt;
&lt;br /&gt;
Le code sur lequel nous nous sommes basé est disponible [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ici]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
Pour la partie software, nous avons utilisé le langage C# et avons développés plusieurs modules orientés autour d&#039;un bus à messages dont voici un schéma:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaBUSSONARTABLE.jpg|600px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Concernant le bus à messages, nous utilisons un produit développé par le CENA  nommé Ivy. Le site internet du projet est disponible [http://www.tls.cena.fr/products/ivy/ ici]. Pour rendre l&#039;utilisation de la bibliothèque Ivy plus agréable à utiliser, et l&#039;adapter au projet, nous avons créer une bibliothèque qui est utilisée dans chaque module. Elle permet par exemple de faire une connexion automatique sur le port et adresse réseau de l&#039;application, mais surtout d&#039;améliorer la réception et envoi de messages sur le bus Ivy. En effet cette bibliothèque gère les messages sous forme d&#039;objets et non de comme de simple chaînes de caractères. De plus cela rend l&#039;application plus maintenable puisque toute la gestion des messages est écrire dans une unique bibliothèque. &lt;br /&gt;
&lt;br /&gt;
Le module d&#039;écoute des capteurs permet de récupérer l&#039;information générée par les Arduinos connectés aux différents ports COM et d&#039;envoyer ces informations &amp;quot;brutes&amp;quot; sur le bus Ivy. Pour récupérer les informations provenant des capteurs, nous avons modifié [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ce programme] destiné à la plateforme Arduino. &lt;br /&gt;
Ce module possède une interface graphique de configuration pour sélectionner les ports COM sur lesquels sont connectés les Arduinos. Actuellement un seul est sélectionnable dans l&#039;interface et un seul thread d’écoute est lancé. Mais l&#039;évolution du programme vers plusieurs se résume à une ligne de code si nécessaire. &lt;br /&gt;
&lt;br /&gt;
Le module de traitement permet de récupérer les informations des capteurs envoyés sur le bus et de les traiter. Dans le cadre de notre projet il ne reçoit et traite seulement les messages envoyés par les capteurs ultra-sons. Une évolution vers différent type de capteurs se résumerai donc à l&#039;abonnement sur le bus Ivy d&#039;autre type de messages et à leurs traitements. Le traitement des informations consistes à générer des messages de plus haut niveau et ainsi abstraire les informations qui proviennes des capteurs, cela permet donc de proposer plusieurs services qui sont chacun basés sur un ou plusieurs types de capteurs. Ces informations sont ensuite à nouveau transférées sur le bus Ivy. Pour notre projet deux messages sont générés. Présence et position. Présence signale l&#039;arrivé et le départ d&#039;une personne, et position donne la position de la personne autour de la table ainsi que sa distance par rapport à elle. &lt;br /&gt;
&lt;br /&gt;
L&#039;application client est dans notre cas une application de démonstration technologique qui affiche des fenêtres suivant le mouvement des utilisateurs autour de la table. Elle est basée sur le sdk Microsoft Surface.&lt;br /&gt;
&lt;br /&gt;
==Architecture==&lt;br /&gt;
&lt;br /&gt;
*Architecture découpée en deux modules&lt;br /&gt;
** SerialPortListener&lt;br /&gt;
*** Ecoute l’Arduino (et les capteurs) et renvois des informations brutes.&lt;br /&gt;
*** Possède une interface de configuration (port com vers Arduino + Baud)&lt;br /&gt;
*** Envois des messages type : &lt;br /&gt;
 STArduino = &amp;lt;Capteur&amp;gt;;&amp;lt;Distance&amp;gt;&lt;br /&gt;
** BundlePP&lt;br /&gt;
*** Traite les données envoyées par SerialPortListener pour générer des informations de position et de présence. &lt;br /&gt;
*** Possède une interface de configuration (nombres de capteurs en longueur et largeur + résolution de la table)&lt;br /&gt;
*** Envois des messages type :&lt;br /&gt;
 Presence = &amp;lt;Capteur&amp;gt;;&amp;lt;Presence&amp;gt;&lt;br /&gt;
 Position = &amp;lt;Capteur&amp;gt;;&amp;lt;x&amp;gt;;&amp;lt;y&amp;gt;;&amp;lt;distance&amp;gt;&lt;br /&gt;
*** Ces messages sont envoyé par un algorithme de décision qui prend en compte les 3 paramètre cités au chapitre précédent. &lt;br /&gt;
 nbAbsenceAcceptee &lt;br /&gt;
 distanceDifferenceAcceptee&lt;br /&gt;
 reglageInterval&lt;br /&gt;
&lt;br /&gt;
*Echange via un bus de données Ivy. Création d’une bibliothèque de fonction Ivycom&lt;br /&gt;
&lt;br /&gt;
*Deux applications exemples : &lt;br /&gt;
** SonarVizualizer : Affichage minimaliste des données envoyé depuis le module SerialPortListner&lt;br /&gt;
** SonarTable : Affichage des données reçus depuis BundlePP avec des feneêtre&lt;br /&gt;
&lt;br /&gt;
=Marketing=&lt;br /&gt;
&lt;br /&gt;
== Video ==&lt;br /&gt;
&lt;br /&gt;
Une vidéo de démonstration disponible [http://www.youtube.com/watch?v=8VKd9UdPNmc ici].&lt;br /&gt;
&lt;br /&gt;
== Poster ==&lt;br /&gt;
&lt;br /&gt;
[[Image:PosterSonarTable.jpg|600px|thumb|center| Resolution originale : 1024*768]]&lt;br /&gt;
&lt;br /&gt;
== Flyer ==&lt;br /&gt;
&lt;br /&gt;
Disponible [http://air.imag.fr/mediawiki/images/0/07/FliyerSonarTable.pdf ici].&lt;br /&gt;
&lt;br /&gt;
== Transparents ==&lt;br /&gt;
&lt;br /&gt;
Disponibles [http://air.imag.fr/mediawiki/images/b/be/Sonar_TablePresentation.pdf ici].&lt;br /&gt;
&lt;br /&gt;
= Optimisations à apporter =&lt;br /&gt;
&lt;br /&gt;
Une fois le prototype monté nous nous sommes rendu compte que les capteurs n’étaient pas très fiables et avaient tendance à ne pas détecter une personne alors que celle-ci était bien présente. Pour essayer de remédier à ce problème nous avons resserré les capteurs mais le problème à tendance à persister. Nous avons donc mis en place des solutions d’optimisation logicielle mais permettre de réduire le problème mais ne le résout pas totalement.&lt;br /&gt;
&lt;br /&gt;
= Suggestions =&lt;br /&gt;
&lt;br /&gt;
D’un point de vue hardware, nous vous conseillons de faire des tests avec d’autres types de capteurs, dont des capteurs infrarouges. Un mélange des deux est aussi envisageable est permettrait de s’affranchir des problèmes inhérents à un type de capteur.&lt;br /&gt;
&lt;br /&gt;
=Suivi=&lt;br /&gt;
&lt;br /&gt;
==Semaine 5== &lt;br /&gt;
* Définition des objectifs du projet&lt;br /&gt;
* Mise en place du dépôts&lt;br /&gt;
* Création d&#039;un projet vide contenant une application Microsoft Surface vide : SonarTable.&lt;br /&gt;
* Mise en place de réunion hebdomadaire pour avoir un bon suivis du projet.&lt;br /&gt;
&lt;br /&gt;
==Semaine 6==&lt;br /&gt;
* Connexion à l&#039;arduino via le port COM. &lt;br /&gt;
* Création du projet SerialPortListener pour écouter l&#039;Arduino.   &lt;br /&gt;
* Apprentissage de la bibliothèque Ivy et création de la bibliothèque IvyCom.&lt;br /&gt;
* Compilation de la bibliothèque ivy pour qu&#039;elle soit disponible sur l&#039;architecture x64 demandé par les applications Surface.&lt;br /&gt;
* Création d&#039;évenements c# pour créer le dialogue entre la  bibliothèque IvyCom et les projets qui l&#039;utilise. &lt;br /&gt;
* Création d&#039;une interface pour paramétrer SerialPortListener &lt;br /&gt;
&lt;br /&gt;
==Semaine 7==&lt;br /&gt;
* Conversion du projet SerialPortListener en x64&lt;br /&gt;
* Création de la bibliothèque MiddleWare pour traiter les message reçut de l&#039;Arduino et envoyer un évènement c# à l&#039;application SonarTable. &lt;br /&gt;
* Création des classes Personnes et Personne pour traiter les différentes personnes présente autour de la table. &lt;br /&gt;
* Création de nombreuse fonction dans les classe Personnes et Personne. Tel que : &lt;br /&gt;
** Ajouter / Supprimer capteurs&lt;br /&gt;
** Recherche personne par id&lt;br /&gt;
**Recherche personne par capteur&lt;br /&gt;
** Ajout / Suppression de personnes ...&lt;br /&gt;
* Création d&#039;un buffer pour sauvegarder par personnes les messages voulus.&lt;br /&gt;
* Début d&#039;algorithme de décision dans MiddleWare pour la conversion de message type Arduino de SerialPortListener par des messages utilisables par l&#039;application SonarTable.&lt;br /&gt;
* Affichage de fenêtres dans l&#039;application SonarTable affichant les données des messages reçuts.&lt;br /&gt;
&lt;br /&gt;
==Semaine 8==&lt;br /&gt;
* Grosse amélioration de l&#039;algorithme de décision&lt;br /&gt;
* Nombreuse correction de bug&lt;br /&gt;
* Placement des fenêtres sur la l&#039;application SonarTable selon la valeurs des messages. &lt;br /&gt;
* Réflexion sur un changement de structure : &lt;br /&gt;
MiddleWare ne communiquera plus comme une bibliothèque avec SonarTable mais via le bus ivy.&lt;br /&gt;
&lt;br /&gt;
==Semaine 9==&lt;br /&gt;
* Mise en place de la nouvelle structure.&lt;br /&gt;
* Changement de la gestion des fenêtres sur SonarTable dû aux changements de la structure (plus simple)&lt;br /&gt;
* Mise en place de variable de configurations pour l&#039;algorithme de décision : &lt;br /&gt;
** nbAbsenceAcceptee : Nombre de messages d’absences acceptés. Cette variable est dû à des erreurs de distance parfois envoyée par les capteurs.&lt;br /&gt;
** distanceDifferenceAcceptee : Correspond à la distance envoyée entre deux capteurs qui permet de différencier une personne d&#039;une autre.  &lt;br /&gt;
** reglageInterval : Nombre de capteurs à proximité nécessaire pour considérer le déplacement d&#039;une fenêtre.&lt;br /&gt;
&lt;br /&gt;
==Semaine 10==&lt;br /&gt;
* Amélioration de la connexion via le bus ivy&lt;br /&gt;
* Amélioration de la position des fenêtres sur SonarTable.&lt;br /&gt;
* Orientation des fenêtres sur SonarTable.&lt;br /&gt;
* Optimisation de l&#039;algorithme&lt;br /&gt;
* Correction de bugs.&lt;br /&gt;
* Début de rapport&lt;br /&gt;
&lt;br /&gt;
==Semaine 11==&lt;br /&gt;
* Création d&#039;une nouvelle application qui affiche les valeurs reçut par l&#039;Arduino. &lt;br /&gt;
* Ecriture du rapport.&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=10278</id>
		<title>Fusion multi-capteurs pour table tactile</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=10278"/>
		<updated>2013-03-23T10:44:49Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Architecture */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Enseignants: Didier Donsez&lt;br /&gt;
&lt;br /&gt;
Client: DIGITALE&lt;br /&gt;
&lt;br /&gt;
Eleves RICM5: Maxence Raoux (Responsable Communication), Léopold Dauvergne&lt;br /&gt;
&lt;br /&gt;
=Presentation=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif de ce projet est de mettre en place des méthodes permettant à la table tactile de Digitale d’interagir avec son environnement extérieur sans action physique des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
La durée du projet est de 6 semaines et la charge de travail est variable et modulée selon les autres cours, séminaires et projets qui prennent aussi place durant cette période.&lt;br /&gt;
&lt;br /&gt;
La représentation de la solution développée respecte l’implémentation souhaité par Digitale, voir schéma ci-dessous, tiré du cahier des charges :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Screenshot_from_2013-03-21_15-44-27.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Projet=&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
==Choix et contraintes matérielles==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps nous avons étudié les différents types de capteurs et les interactions requises pour activer ceux-ci. Nous avons ainsi exclu les options suivantes :&lt;br /&gt;
&lt;br /&gt;
- Kinect : Requiert d’avoir plusieurs kinects disposées autour de la table (et non sur celle-ci), budget assez conséquent et non pratique lors du transport de la table.&lt;br /&gt;
&lt;br /&gt;
- NFC : Bien que pratique ce dernier nécessite que l’utilisateur ai un badge et se loggue sur la table. Cette solution pourrait être adoptée à terme pour permettre d’apporter à l’utilisateur un contenu vraiment personnalisé.&lt;br /&gt;
&lt;br /&gt;
- Caméras : Cette solution, semblable à la Kinect, pose les mêmes soucis que pour la Kinect, il n’est pas facilement envisageable d’installer des caméras dans la pièce et embarquer des caméras dans la table serait complexe notamment au niveau du recul nécessaire.&lt;br /&gt;
&lt;br /&gt;
Notre choix s’est donc porté sur des capteurs permettant d’être embarqués de manière « simple » au sein de la table. Le détail des différents types de capteurs est disponible dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
==Capteurs==&lt;br /&gt;
&lt;br /&gt;
Durant la première partie du projet nous avons étudié les différents types de capteurs qui pourraient correspondre au besoin de l’entreprise :&lt;br /&gt;
Capteurs de contact : Ce premier type de capteur est intéressant car il permet une détection nette de la personne si celle-ci est en contact physique avec la table. Néanmoins nous n’avons pas choisi cette solution car il nous parait important pour la table de détecter les personnes arrivant sur cette dernière.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Capteurs infrarouge : Il s’agit du premier type de capteur que nous avons expérimenté. Ceux-ci sont très directifs et offrent une bonne précision (de l’ordre du millimètre) sur un distance assez grande (allant jusqu’à 1-2mètres). Nous avons eu durant notre projet un capteur infrarouge qui nous donnait des résultats satisfaisants, pour un prix faible (~5€) voici ses caractéristiques :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:547132375_615.jpg|400px|thumb|center|E18-D50NK]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ses caractéristiques sont : &lt;br /&gt;
&lt;br /&gt;
- Power Supply :5V DC&lt;br /&gt;
&lt;br /&gt;
- Quiescent Current : &amp;lt;2mA&lt;br /&gt;
&lt;br /&gt;
- Effectual Angle: &amp;lt;15°&lt;br /&gt;
&lt;br /&gt;
- Ranging Distance : 2cm – 500 cm/1&amp;quot; - 16ft&lt;br /&gt;
&lt;br /&gt;
- Resolution : 0.3 cm&lt;br /&gt;
&lt;br /&gt;
Capteurs à ultrasons : Il s’agit du type de capteur préféré lors de nos premières réunions avec Digitale, notamment car Mr Donsez avait commandé un certain nombre de capteurs lors du début du projet. Ces capteurs ont l’avantage d’être peu cher (~3-5€), d’avoir une bonne portée et d’être relativement précis. Voici les spécifications du modèle de capteur à ultrasons choisi : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:HC-SR04-lg.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
La datasheet est disponible [http://jaktek.com/wp-content/uploads/2011/12/HC-SR04.pdf ici].&lt;br /&gt;
&lt;br /&gt;
- Alimentation : 5V&lt;br /&gt;
- Consommation : &amp;lt; 12mA&lt;br /&gt;
- Distance : 2-500cm avec un angle de 15 dégrés&lt;br /&gt;
&lt;br /&gt;
Ce module dispose simplement de 4 pins de sortie : VCC, TRIG, ECHO, GND. Il est donc très facile de l&#039;interfacer à un microcontrôleur. Le processus complet est le suivant: &lt;br /&gt;
&lt;br /&gt;
Mettre la pin &amp;quot;TRIG&amp;quot; une impulsion de niveau haut (5V) durant au moins 10µs et le module démarre sa lecture; A la fin de la mesure, s&#039;il détecte un objet devant lui, la pin &amp;quot;ECHO&amp;quot; passe au niveau haut (5V). &lt;br /&gt;
La distance où se situe l&#039;obstacle est proportionnelle à la durée de cette impulsion. Il est donc très facile de calculer cette distance avec la formule suivante:&lt;br /&gt;
&lt;br /&gt;
Distance = ((Durée du niveau haut)*(vitesse du son: 340 m/s))/2.&lt;br /&gt;
&lt;br /&gt;
Notre prototype fonctionne avec ce dernier type de capteur, son implémentation est décrite dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
Les capteurs seront idéalement placé sous l&#039;écran de la table, le long des bordures, comme dans l&#039;illustration ci dessous:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaTablesSensors.jpg|500px|thumb|center|Les capteurs sont représentés par les triangles noirs.]]&lt;br /&gt;
&lt;br /&gt;
==Solution adoptée==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi d’utiliser en priorité des capteurs à ultrasons car ces derniers étaient les seuls à être disponible suffisamment rapidement en plus de posséder les caractéristiques techniques qui correspondaient à notre besoin. Pour le prototype, nous avons construit une barre en bois sur laquelle les capteurs sont fixés. Nous avons choisi de « serrer » les capteurs pour gagner en précision, ils sont donc espacés d’environ 3 cm. Voici une photo du montage : &lt;br /&gt;
&lt;br /&gt;
[[Image:DSC00731-Small.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Pour la connectique, un Arduino peut gérer jusqu’à 18 capteurs à condition d’unifier la pin servant de trigger. D’un point de vue software, notre programme gère jusqu’à 15 capteurs, ceci permet de garder une assez bonne réactivité car les capteurs sont « interrogés » un à un. Pour accélérer encore plus ce processus, nous avons limité la distance de détection à 100 cm.&lt;br /&gt;
&lt;br /&gt;
La librairie utilisée est disponible [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ici].&lt;br /&gt;
&lt;br /&gt;
Le code sur lequel nous nous sommes basé est disponible [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ici]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
Pour la partie software, nous avons utilisé le langage C# et avons développés plusieurs modules orientés autour d&#039;un bus à messages dont voici un schéma:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaBUSSONARTABLE.jpg|600px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Concernant le bus à messages, nous utilisons un produit développé par le CENA  nommé Ivy. Le site internet du projet est disponible [http://www.tls.cena.fr/products/ivy/ ici]. Pour rendre l&#039;utilisation de la bibliothèque Ivy plus agréable à utiliser, et l&#039;adapter au projet, nous avons créer une bibliothèque qui est utilisée dans chaque module. Elle permet par exemple de faire une connexion automatique sur le port et adresse réseau de l&#039;application, mais surtout d&#039;améliorer la réception et envoi de messages sur le bus Ivy. En effet cette bibliothèque gère les messages sous forme d&#039;objets et non de comme de simple chaînes de caractères. De plus cela rend l&#039;application plus maintenable puisque toute la gestion des messages est écrire dans une unique bibliothèque. &lt;br /&gt;
&lt;br /&gt;
Le module d&#039;écoute des capteurs permet de récupérer l&#039;information générée par les Arduinos connectés aux différents ports COM et d&#039;envoyer ces informations &amp;quot;brutes&amp;quot; sur le bus Ivy. Pour récupérer les informations provenant des capteurs, nous avons modifié [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ce programme] destiné à la plateforme Arduino. &lt;br /&gt;
Ce module possède une interface graphique de configuration pour sélectionner les ports COM sur lesquels sont connectés les Arduinos. Actuellement un seul est sélectionnable dans l&#039;interface et un seul thread d’écoute est lancé. Mais l&#039;évolution du programme vers plusieurs se résume à une ligne de code si nécessaire. &lt;br /&gt;
&lt;br /&gt;
Le module de traitement permet de récupérer les informations des capteurs envoyés sur le bus et de les traiter. Dans le cadre de notre projet il ne reçoit et traite seulement les messages envoyés par les capteurs ultra-sons. Une évolution vers différent type de capteurs se résumerai donc à l&#039;abonnement sur le bus Ivy d&#039;autre type de messages et à leurs traitements. Le traitement des informations consistes à générer des messages de plus haut niveau et ainsi abstraire les informations qui proviennes des capteurs, cela permet donc de proposer plusieurs services qui sont chacun basés sur un ou plusieurs types de capteurs. Ces informations sont ensuite à nouveau transférées sur le bus Ivy. Pour notre projet deux messages sont générés. Présence et position. Présence signale l&#039;arrivé et le départ d&#039;une personne, et position donne la position de la personne autour de la table ainsi que sa distance par rapport à elle. &lt;br /&gt;
&lt;br /&gt;
L&#039;application client est dans notre cas une application de démonstration technologique qui affiche des fenêtres suivant le mouvement des utilisateurs autour de la table. Elle est basée sur le sdk Microsoft Surface.&lt;br /&gt;
&lt;br /&gt;
==Architecture==&lt;br /&gt;
&lt;br /&gt;
Architecture découpée en deux modules&lt;br /&gt;
&lt;br /&gt;
* SerialPortListener&lt;br /&gt;
** Ecoute l’Arduino (et les capteurs) et renvois des informations brutes.&lt;br /&gt;
** Possède une interface de configuration (port com vers Arduino + Baud)&lt;br /&gt;
** Envois des messages type : &lt;br /&gt;
 STArduino = &amp;lt;Capteur&amp;gt;;&amp;lt;Distance&amp;gt;&lt;br /&gt;
* BundlePP&lt;br /&gt;
Traite les données envoyées par SerialPortListener pour générer des informations de position et de présence. &lt;br /&gt;
Possède une interface de configuration (nombres de capteurs en longueur et largeur + résolution de la table)&lt;br /&gt;
Envois des messages type :&lt;br /&gt;
 Presence = &amp;lt;Capteur&amp;gt;;&amp;lt;Presence&amp;gt;&lt;br /&gt;
 Position = &amp;lt;Capteur&amp;gt;;&amp;lt;x&amp;gt;;&amp;lt;y&amp;gt;;&amp;lt;distance&amp;gt;&lt;br /&gt;
Ces messages sont envoyé par un algorithme de décision qui prend en compte les 3 paramètre cités au chapitre précédent. &lt;br /&gt;
 nbAbsenceAcceptee &lt;br /&gt;
 distanceDifferenceAcceptee&lt;br /&gt;
 reglageInterval&lt;br /&gt;
&lt;br /&gt;
Echange via un bus de données Ivy. Création d’une bibliothèque de fonction Ivycom&lt;br /&gt;
&lt;br /&gt;
Deux applications exemples : &lt;br /&gt;
* SonarVizualizer : Affichage minimaliste des données envoyé depuis le module SerialPortListner&lt;br /&gt;
* SonarTable : Affichage des données reçus depuis BundlePP avec des feneêtre&lt;br /&gt;
&lt;br /&gt;
=Marketing=&lt;br /&gt;
&lt;br /&gt;
== Video ==&lt;br /&gt;
&lt;br /&gt;
Une vidéo de démonstration disponible [http://www.youtube.com/watch?v=8VKd9UdPNmc ici].&lt;br /&gt;
&lt;br /&gt;
== Poster ==&lt;br /&gt;
&lt;br /&gt;
[[Image:PosterSonarTable.jpg|600px|thumb|center| Resolution originale : 1024*768]]&lt;br /&gt;
&lt;br /&gt;
== Flyer ==&lt;br /&gt;
&lt;br /&gt;
Disponible [http://air.imag.fr/mediawiki/images/0/07/FliyerSonarTable.pdf ici].&lt;br /&gt;
&lt;br /&gt;
== Transparents ==&lt;br /&gt;
&lt;br /&gt;
Disponibles [http://air.imag.fr/mediawiki/images/b/be/Sonar_TablePresentation.pdf ici].&lt;br /&gt;
&lt;br /&gt;
= Optimisations à apporter =&lt;br /&gt;
&lt;br /&gt;
Une fois le prototype monté nous nous sommes rendu compte que les capteurs n’étaient pas très fiables et avaient tendance à ne pas détecter une personne alors que celle-ci était bien présente. Pour essayer de remédier à ce problème nous avons resserré les capteurs mais le problème à tendance à persister. Nous avons donc mis en place des solutions d’optimisation logicielle mais permettre de réduire le problème mais ne le résout pas totalement.&lt;br /&gt;
&lt;br /&gt;
= Suggestions =&lt;br /&gt;
&lt;br /&gt;
D’un point de vue hardware, nous vous conseillons de faire des tests avec d’autres types de capteurs, dont des capteurs infrarouges. Un mélange des deux est aussi envisageable est permettrait de s’affranchir des problèmes inhérents à un type de capteur.&lt;br /&gt;
&lt;br /&gt;
=Suivi=&lt;br /&gt;
&lt;br /&gt;
==Semaine 5== &lt;br /&gt;
* Définition des objectifs du projet&lt;br /&gt;
* Mise en place du dépôts&lt;br /&gt;
* Création d&#039;un projet vide contenant une application Microsoft Surface vide : SonarTable.&lt;br /&gt;
* Mise en place de réunion hebdomadaire pour avoir un bon suivis du projet.&lt;br /&gt;
&lt;br /&gt;
==Semaine 6==&lt;br /&gt;
* Connexion à l&#039;arduino via le port COM. &lt;br /&gt;
* Création du projet SerialPortListener pour écouter l&#039;Arduino.   &lt;br /&gt;
* Apprentissage de la bibliothèque Ivy et création de la bibliothèque IvyCom.&lt;br /&gt;
* Compilation de la bibliothèque ivy pour qu&#039;elle soit disponible sur l&#039;architecture x64 demandé par les applications Surface.&lt;br /&gt;
* Création d&#039;évenements c# pour créer le dialogue entre la  bibliothèque IvyCom et les projets qui l&#039;utilise. &lt;br /&gt;
* Création d&#039;une interface pour paramétrer SerialPortListener &lt;br /&gt;
&lt;br /&gt;
==Semaine 7==&lt;br /&gt;
* Conversion du projet SerialPortListener en x64&lt;br /&gt;
* Création de la bibliothèque MiddleWare pour traiter les message reçut de l&#039;Arduino et envoyer un évènement c# à l&#039;application SonarTable. &lt;br /&gt;
* Création des classes Personnes et Personne pour traiter les différentes personnes présente autour de la table. &lt;br /&gt;
* Création de nombreuse fonction dans les classe Personnes et Personne. Tel que : &lt;br /&gt;
** Ajouter / Supprimer capteurs&lt;br /&gt;
** Recherche personne par id&lt;br /&gt;
**Recherche personne par capteur&lt;br /&gt;
** Ajout / Suppression de personnes ...&lt;br /&gt;
* Création d&#039;un buffer pour sauvegarder par personnes les messages voulus.&lt;br /&gt;
* Début d&#039;algorithme de décision dans MiddleWare pour la conversion de message type Arduino de SerialPortListener par des messages utilisables par l&#039;application SonarTable.&lt;br /&gt;
* Affichage de fenêtres dans l&#039;application SonarTable affichant les données des messages reçuts.&lt;br /&gt;
&lt;br /&gt;
==Semaine 8==&lt;br /&gt;
* Grosse amélioration de l&#039;algorithme de décision&lt;br /&gt;
* Nombreuse correction de bug&lt;br /&gt;
* Placement des fenêtres sur la l&#039;application SonarTable selon la valeurs des messages. &lt;br /&gt;
* Réflexion sur un changement de structure : &lt;br /&gt;
MiddleWare ne communiquera plus comme une bibliothèque avec SonarTable mais via le bus ivy.&lt;br /&gt;
&lt;br /&gt;
==Semaine 9==&lt;br /&gt;
* Mise en place de la nouvelle structure.&lt;br /&gt;
* Changement de la gestion des fenêtres sur SonarTable dû aux changements de la structure (plus simple)&lt;br /&gt;
* Mise en place de variable de configurations pour l&#039;algorithme de décision : &lt;br /&gt;
** nbAbsenceAcceptee : Nombre de messages d’absences acceptés. Cette variable est dû à des erreurs de distance parfois envoyée par les capteurs.&lt;br /&gt;
** distanceDifferenceAcceptee : Correspond à la distance envoyée entre deux capteurs qui permet de différencier une personne d&#039;une autre.  &lt;br /&gt;
** reglageInterval : Nombre de capteurs à proximité nécessaire pour considérer le déplacement d&#039;une fenêtre.&lt;br /&gt;
&lt;br /&gt;
==Semaine 10==&lt;br /&gt;
* Amélioration de la connexion via le bus ivy&lt;br /&gt;
* Amélioration de la position des fenêtres sur SonarTable.&lt;br /&gt;
* Orientation des fenêtres sur SonarTable.&lt;br /&gt;
* Optimisation de l&#039;algorithme&lt;br /&gt;
* Correction de bugs.&lt;br /&gt;
* Début de rapport&lt;br /&gt;
&lt;br /&gt;
==Semaine 11==&lt;br /&gt;
* Création d&#039;une nouvelle application qui affiche les valeurs reçut par l&#039;Arduino. &lt;br /&gt;
* Ecriture du rapport.&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=10277</id>
		<title>Fusion multi-capteurs pour table tactile</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=10277"/>
		<updated>2013-03-23T10:44:21Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Architecture */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Enseignants: Didier Donsez&lt;br /&gt;
&lt;br /&gt;
Client: DIGITALE&lt;br /&gt;
&lt;br /&gt;
Eleves RICM5: Maxence Raoux (Responsable Communication), Léopold Dauvergne&lt;br /&gt;
&lt;br /&gt;
=Presentation=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif de ce projet est de mettre en place des méthodes permettant à la table tactile de Digitale d’interagir avec son environnement extérieur sans action physique des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
La durée du projet est de 6 semaines et la charge de travail est variable et modulée selon les autres cours, séminaires et projets qui prennent aussi place durant cette période.&lt;br /&gt;
&lt;br /&gt;
La représentation de la solution développée respecte l’implémentation souhaité par Digitale, voir schéma ci-dessous, tiré du cahier des charges :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Screenshot_from_2013-03-21_15-44-27.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Projet=&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
==Choix et contraintes matérielles==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps nous avons étudié les différents types de capteurs et les interactions requises pour activer ceux-ci. Nous avons ainsi exclu les options suivantes :&lt;br /&gt;
&lt;br /&gt;
- Kinect : Requiert d’avoir plusieurs kinects disposées autour de la table (et non sur celle-ci), budget assez conséquent et non pratique lors du transport de la table.&lt;br /&gt;
&lt;br /&gt;
- NFC : Bien que pratique ce dernier nécessite que l’utilisateur ai un badge et se loggue sur la table. Cette solution pourrait être adoptée à terme pour permettre d’apporter à l’utilisateur un contenu vraiment personnalisé.&lt;br /&gt;
&lt;br /&gt;
- Caméras : Cette solution, semblable à la Kinect, pose les mêmes soucis que pour la Kinect, il n’est pas facilement envisageable d’installer des caméras dans la pièce et embarquer des caméras dans la table serait complexe notamment au niveau du recul nécessaire.&lt;br /&gt;
&lt;br /&gt;
Notre choix s’est donc porté sur des capteurs permettant d’être embarqués de manière « simple » au sein de la table. Le détail des différents types de capteurs est disponible dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
==Capteurs==&lt;br /&gt;
&lt;br /&gt;
Durant la première partie du projet nous avons étudié les différents types de capteurs qui pourraient correspondre au besoin de l’entreprise :&lt;br /&gt;
Capteurs de contact : Ce premier type de capteur est intéressant car il permet une détection nette de la personne si celle-ci est en contact physique avec la table. Néanmoins nous n’avons pas choisi cette solution car il nous parait important pour la table de détecter les personnes arrivant sur cette dernière.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Capteurs infrarouge : Il s’agit du premier type de capteur que nous avons expérimenté. Ceux-ci sont très directifs et offrent une bonne précision (de l’ordre du millimètre) sur un distance assez grande (allant jusqu’à 1-2mètres). Nous avons eu durant notre projet un capteur infrarouge qui nous donnait des résultats satisfaisants, pour un prix faible (~5€) voici ses caractéristiques :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:547132375_615.jpg|400px|thumb|center|E18-D50NK]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ses caractéristiques sont : &lt;br /&gt;
&lt;br /&gt;
- Power Supply :5V DC&lt;br /&gt;
&lt;br /&gt;
- Quiescent Current : &amp;lt;2mA&lt;br /&gt;
&lt;br /&gt;
- Effectual Angle: &amp;lt;15°&lt;br /&gt;
&lt;br /&gt;
- Ranging Distance : 2cm – 500 cm/1&amp;quot; - 16ft&lt;br /&gt;
&lt;br /&gt;
- Resolution : 0.3 cm&lt;br /&gt;
&lt;br /&gt;
Capteurs à ultrasons : Il s’agit du type de capteur préféré lors de nos premières réunions avec Digitale, notamment car Mr Donsez avait commandé un certain nombre de capteurs lors du début du projet. Ces capteurs ont l’avantage d’être peu cher (~3-5€), d’avoir une bonne portée et d’être relativement précis. Voici les spécifications du modèle de capteur à ultrasons choisi : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:HC-SR04-lg.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
La datasheet est disponible [http://jaktek.com/wp-content/uploads/2011/12/HC-SR04.pdf ici].&lt;br /&gt;
&lt;br /&gt;
- Alimentation : 5V&lt;br /&gt;
- Consommation : &amp;lt; 12mA&lt;br /&gt;
- Distance : 2-500cm avec un angle de 15 dégrés&lt;br /&gt;
&lt;br /&gt;
Ce module dispose simplement de 4 pins de sortie : VCC, TRIG, ECHO, GND. Il est donc très facile de l&#039;interfacer à un microcontrôleur. Le processus complet est le suivant: &lt;br /&gt;
&lt;br /&gt;
Mettre la pin &amp;quot;TRIG&amp;quot; une impulsion de niveau haut (5V) durant au moins 10µs et le module démarre sa lecture; A la fin de la mesure, s&#039;il détecte un objet devant lui, la pin &amp;quot;ECHO&amp;quot; passe au niveau haut (5V). &lt;br /&gt;
La distance où se situe l&#039;obstacle est proportionnelle à la durée de cette impulsion. Il est donc très facile de calculer cette distance avec la formule suivante:&lt;br /&gt;
&lt;br /&gt;
Distance = ((Durée du niveau haut)*(vitesse du son: 340 m/s))/2.&lt;br /&gt;
&lt;br /&gt;
Notre prototype fonctionne avec ce dernier type de capteur, son implémentation est décrite dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
Les capteurs seront idéalement placé sous l&#039;écran de la table, le long des bordures, comme dans l&#039;illustration ci dessous:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaTablesSensors.jpg|500px|thumb|center|Les capteurs sont représentés par les triangles noirs.]]&lt;br /&gt;
&lt;br /&gt;
==Solution adoptée==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi d’utiliser en priorité des capteurs à ultrasons car ces derniers étaient les seuls à être disponible suffisamment rapidement en plus de posséder les caractéristiques techniques qui correspondaient à notre besoin. Pour le prototype, nous avons construit une barre en bois sur laquelle les capteurs sont fixés. Nous avons choisi de « serrer » les capteurs pour gagner en précision, ils sont donc espacés d’environ 3 cm. Voici une photo du montage : &lt;br /&gt;
&lt;br /&gt;
[[Image:DSC00731-Small.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Pour la connectique, un Arduino peut gérer jusqu’à 18 capteurs à condition d’unifier la pin servant de trigger. D’un point de vue software, notre programme gère jusqu’à 15 capteurs, ceci permet de garder une assez bonne réactivité car les capteurs sont « interrogés » un à un. Pour accélérer encore plus ce processus, nous avons limité la distance de détection à 100 cm.&lt;br /&gt;
&lt;br /&gt;
La librairie utilisée est disponible [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ici].&lt;br /&gt;
&lt;br /&gt;
Le code sur lequel nous nous sommes basé est disponible [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ici]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
Pour la partie software, nous avons utilisé le langage C# et avons développés plusieurs modules orientés autour d&#039;un bus à messages dont voici un schéma:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaBUSSONARTABLE.jpg|600px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Concernant le bus à messages, nous utilisons un produit développé par le CENA  nommé Ivy. Le site internet du projet est disponible [http://www.tls.cena.fr/products/ivy/ ici]. Pour rendre l&#039;utilisation de la bibliothèque Ivy plus agréable à utiliser, et l&#039;adapter au projet, nous avons créer une bibliothèque qui est utilisée dans chaque module. Elle permet par exemple de faire une connexion automatique sur le port et adresse réseau de l&#039;application, mais surtout d&#039;améliorer la réception et envoi de messages sur le bus Ivy. En effet cette bibliothèque gère les messages sous forme d&#039;objets et non de comme de simple chaînes de caractères. De plus cela rend l&#039;application plus maintenable puisque toute la gestion des messages est écrire dans une unique bibliothèque. &lt;br /&gt;
&lt;br /&gt;
Le module d&#039;écoute des capteurs permet de récupérer l&#039;information générée par les Arduinos connectés aux différents ports COM et d&#039;envoyer ces informations &amp;quot;brutes&amp;quot; sur le bus Ivy. Pour récupérer les informations provenant des capteurs, nous avons modifié [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ce programme] destiné à la plateforme Arduino. &lt;br /&gt;
Ce module possède une interface graphique de configuration pour sélectionner les ports COM sur lesquels sont connectés les Arduinos. Actuellement un seul est sélectionnable dans l&#039;interface et un seul thread d’écoute est lancé. Mais l&#039;évolution du programme vers plusieurs se résume à une ligne de code si nécessaire. &lt;br /&gt;
&lt;br /&gt;
Le module de traitement permet de récupérer les informations des capteurs envoyés sur le bus et de les traiter. Dans le cadre de notre projet il ne reçoit et traite seulement les messages envoyés par les capteurs ultra-sons. Une évolution vers différent type de capteurs se résumerai donc à l&#039;abonnement sur le bus Ivy d&#039;autre type de messages et à leurs traitements. Le traitement des informations consistes à générer des messages de plus haut niveau et ainsi abstraire les informations qui proviennes des capteurs, cela permet donc de proposer plusieurs services qui sont chacun basés sur un ou plusieurs types de capteurs. Ces informations sont ensuite à nouveau transférées sur le bus Ivy. Pour notre projet deux messages sont générés. Présence et position. Présence signale l&#039;arrivé et le départ d&#039;une personne, et position donne la position de la personne autour de la table ainsi que sa distance par rapport à elle. &lt;br /&gt;
&lt;br /&gt;
L&#039;application client est dans notre cas une application de démonstration technologique qui affiche des fenêtres suivant le mouvement des utilisateurs autour de la table. Elle est basée sur le sdk Microsoft Surface.&lt;br /&gt;
&lt;br /&gt;
==Architecture==&lt;br /&gt;
&lt;br /&gt;
Architecture découpée en deux modules&lt;br /&gt;
&lt;br /&gt;
* SerialPortListener&lt;br /&gt;
Ecoute l’Arduino (et les capteurs) et renvois des informations brutes.&lt;br /&gt;
Possède une interface de configuration (port com vers Arduino + Baud)&lt;br /&gt;
Envois des messages type : &lt;br /&gt;
 STArduino = &amp;lt;Capteur&amp;gt;;&amp;lt;Distance&amp;gt;&lt;br /&gt;
* BundlePP&lt;br /&gt;
Traite les données envoyées par SerialPortListener pour générer des informations de position et de présence. &lt;br /&gt;
Possède une interface de configuration (nombres de capteurs en longueur et largeur + résolution de la table)&lt;br /&gt;
Envois des messages type :&lt;br /&gt;
 Presence = &amp;lt;Capteur&amp;gt;;&amp;lt;Presence&amp;gt;&lt;br /&gt;
 Position = &amp;lt;Capteur&amp;gt;;&amp;lt;x&amp;gt;;&amp;lt;y&amp;gt;;&amp;lt;distance&amp;gt;&lt;br /&gt;
Ces messages sont envoyé par un algorithme de décision qui prend en compte les 3 paramètre cités au chapitre précédent. &lt;br /&gt;
 nbAbsenceAcceptee &lt;br /&gt;
 distanceDifferenceAcceptee&lt;br /&gt;
 reglageInterval&lt;br /&gt;
&lt;br /&gt;
Echange via un bus de données Ivy. Création d’une bibliothèque de fonction Ivycom&lt;br /&gt;
&lt;br /&gt;
Deux applications exemples : &lt;br /&gt;
* SonarVizualizer : Affichage minimaliste des données envoyé depuis le module SerialPortListner&lt;br /&gt;
* SonarTable : Affichage des données reçus depuis BundlePP avec des feneêtre&lt;br /&gt;
&lt;br /&gt;
=Marketing=&lt;br /&gt;
&lt;br /&gt;
== Video ==&lt;br /&gt;
&lt;br /&gt;
Une vidéo de démonstration disponible [http://www.youtube.com/watch?v=8VKd9UdPNmc ici].&lt;br /&gt;
&lt;br /&gt;
== Poster ==&lt;br /&gt;
&lt;br /&gt;
[[Image:PosterSonarTable.jpg|600px|thumb|center| Resolution originale : 1024*768]]&lt;br /&gt;
&lt;br /&gt;
== Flyer ==&lt;br /&gt;
&lt;br /&gt;
Disponible [http://air.imag.fr/mediawiki/images/0/07/FliyerSonarTable.pdf ici].&lt;br /&gt;
&lt;br /&gt;
== Transparents ==&lt;br /&gt;
&lt;br /&gt;
Disponibles [http://air.imag.fr/mediawiki/images/b/be/Sonar_TablePresentation.pdf ici].&lt;br /&gt;
&lt;br /&gt;
= Optimisations à apporter =&lt;br /&gt;
&lt;br /&gt;
Une fois le prototype monté nous nous sommes rendu compte que les capteurs n’étaient pas très fiables et avaient tendance à ne pas détecter une personne alors que celle-ci était bien présente. Pour essayer de remédier à ce problème nous avons resserré les capteurs mais le problème à tendance à persister. Nous avons donc mis en place des solutions d’optimisation logicielle mais permettre de réduire le problème mais ne le résout pas totalement.&lt;br /&gt;
&lt;br /&gt;
= Suggestions =&lt;br /&gt;
&lt;br /&gt;
D’un point de vue hardware, nous vous conseillons de faire des tests avec d’autres types de capteurs, dont des capteurs infrarouges. Un mélange des deux est aussi envisageable est permettrait de s’affranchir des problèmes inhérents à un type de capteur.&lt;br /&gt;
&lt;br /&gt;
=Suivi=&lt;br /&gt;
&lt;br /&gt;
==Semaine 5== &lt;br /&gt;
* Définition des objectifs du projet&lt;br /&gt;
* Mise en place du dépôts&lt;br /&gt;
* Création d&#039;un projet vide contenant une application Microsoft Surface vide : SonarTable.&lt;br /&gt;
* Mise en place de réunion hebdomadaire pour avoir un bon suivis du projet.&lt;br /&gt;
&lt;br /&gt;
==Semaine 6==&lt;br /&gt;
* Connexion à l&#039;arduino via le port COM. &lt;br /&gt;
* Création du projet SerialPortListener pour écouter l&#039;Arduino.   &lt;br /&gt;
* Apprentissage de la bibliothèque Ivy et création de la bibliothèque IvyCom.&lt;br /&gt;
* Compilation de la bibliothèque ivy pour qu&#039;elle soit disponible sur l&#039;architecture x64 demandé par les applications Surface.&lt;br /&gt;
* Création d&#039;évenements c# pour créer le dialogue entre la  bibliothèque IvyCom et les projets qui l&#039;utilise. &lt;br /&gt;
* Création d&#039;une interface pour paramétrer SerialPortListener &lt;br /&gt;
&lt;br /&gt;
==Semaine 7==&lt;br /&gt;
* Conversion du projet SerialPortListener en x64&lt;br /&gt;
* Création de la bibliothèque MiddleWare pour traiter les message reçut de l&#039;Arduino et envoyer un évènement c# à l&#039;application SonarTable. &lt;br /&gt;
* Création des classes Personnes et Personne pour traiter les différentes personnes présente autour de la table. &lt;br /&gt;
* Création de nombreuse fonction dans les classe Personnes et Personne. Tel que : &lt;br /&gt;
** Ajouter / Supprimer capteurs&lt;br /&gt;
** Recherche personne par id&lt;br /&gt;
**Recherche personne par capteur&lt;br /&gt;
** Ajout / Suppression de personnes ...&lt;br /&gt;
* Création d&#039;un buffer pour sauvegarder par personnes les messages voulus.&lt;br /&gt;
* Début d&#039;algorithme de décision dans MiddleWare pour la conversion de message type Arduino de SerialPortListener par des messages utilisables par l&#039;application SonarTable.&lt;br /&gt;
* Affichage de fenêtres dans l&#039;application SonarTable affichant les données des messages reçuts.&lt;br /&gt;
&lt;br /&gt;
==Semaine 8==&lt;br /&gt;
* Grosse amélioration de l&#039;algorithme de décision&lt;br /&gt;
* Nombreuse correction de bug&lt;br /&gt;
* Placement des fenêtres sur la l&#039;application SonarTable selon la valeurs des messages. &lt;br /&gt;
* Réflexion sur un changement de structure : &lt;br /&gt;
MiddleWare ne communiquera plus comme une bibliothèque avec SonarTable mais via le bus ivy.&lt;br /&gt;
&lt;br /&gt;
==Semaine 9==&lt;br /&gt;
* Mise en place de la nouvelle structure.&lt;br /&gt;
* Changement de la gestion des fenêtres sur SonarTable dû aux changements de la structure (plus simple)&lt;br /&gt;
* Mise en place de variable de configurations pour l&#039;algorithme de décision : &lt;br /&gt;
** nbAbsenceAcceptee : Nombre de messages d’absences acceptés. Cette variable est dû à des erreurs de distance parfois envoyée par les capteurs.&lt;br /&gt;
** distanceDifferenceAcceptee : Correspond à la distance envoyée entre deux capteurs qui permet de différencier une personne d&#039;une autre.  &lt;br /&gt;
** reglageInterval : Nombre de capteurs à proximité nécessaire pour considérer le déplacement d&#039;une fenêtre.&lt;br /&gt;
&lt;br /&gt;
==Semaine 10==&lt;br /&gt;
* Amélioration de la connexion via le bus ivy&lt;br /&gt;
* Amélioration de la position des fenêtres sur SonarTable.&lt;br /&gt;
* Orientation des fenêtres sur SonarTable.&lt;br /&gt;
* Optimisation de l&#039;algorithme&lt;br /&gt;
* Correction de bugs.&lt;br /&gt;
* Début de rapport&lt;br /&gt;
&lt;br /&gt;
==Semaine 11==&lt;br /&gt;
* Création d&#039;une nouvelle application qui affiche les valeurs reçut par l&#039;Arduino. &lt;br /&gt;
* Ecriture du rapport.&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=10276</id>
		<title>Fusion multi-capteurs pour table tactile</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=10276"/>
		<updated>2013-03-23T10:37:35Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Enseignants: Didier Donsez&lt;br /&gt;
&lt;br /&gt;
Client: DIGITALE&lt;br /&gt;
&lt;br /&gt;
Eleves RICM5: Maxence Raoux (Responsable Communication), Léopold Dauvergne&lt;br /&gt;
&lt;br /&gt;
=Presentation=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif de ce projet est de mettre en place des méthodes permettant à la table tactile de Digitale d’interagir avec son environnement extérieur sans action physique des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
La durée du projet est de 6 semaines et la charge de travail est variable et modulée selon les autres cours, séminaires et projets qui prennent aussi place durant cette période.&lt;br /&gt;
&lt;br /&gt;
La représentation de la solution développée respecte l’implémentation souhaité par Digitale, voir schéma ci-dessous, tiré du cahier des charges :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Screenshot_from_2013-03-21_15-44-27.png|500px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=Projet=&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
==Choix et contraintes matérielles==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps nous avons étudié les différents types de capteurs et les interactions requises pour activer ceux-ci. Nous avons ainsi exclu les options suivantes :&lt;br /&gt;
&lt;br /&gt;
- Kinect : Requiert d’avoir plusieurs kinects disposées autour de la table (et non sur celle-ci), budget assez conséquent et non pratique lors du transport de la table.&lt;br /&gt;
&lt;br /&gt;
- NFC : Bien que pratique ce dernier nécessite que l’utilisateur ai un badge et se loggue sur la table. Cette solution pourrait être adoptée à terme pour permettre d’apporter à l’utilisateur un contenu vraiment personnalisé.&lt;br /&gt;
&lt;br /&gt;
- Caméras : Cette solution, semblable à la Kinect, pose les mêmes soucis que pour la Kinect, il n’est pas facilement envisageable d’installer des caméras dans la pièce et embarquer des caméras dans la table serait complexe notamment au niveau du recul nécessaire.&lt;br /&gt;
&lt;br /&gt;
Notre choix s’est donc porté sur des capteurs permettant d’être embarqués de manière « simple » au sein de la table. Le détail des différents types de capteurs est disponible dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
==Capteurs==&lt;br /&gt;
&lt;br /&gt;
Durant la première partie du projet nous avons étudié les différents types de capteurs qui pourraient correspondre au besoin de l’entreprise :&lt;br /&gt;
Capteurs de contact : Ce premier type de capteur est intéressant car il permet une détection nette de la personne si celle-ci est en contact physique avec la table. Néanmoins nous n’avons pas choisi cette solution car il nous parait important pour la table de détecter les personnes arrivant sur cette dernière.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Capteurs infrarouge : Il s’agit du premier type de capteur que nous avons expérimenté. Ceux-ci sont très directifs et offrent une bonne précision (de l’ordre du millimètre) sur un distance assez grande (allant jusqu’à 1-2mètres). Nous avons eu durant notre projet un capteur infrarouge qui nous donnait des résultats satisfaisants, pour un prix faible (~5€) voici ses caractéristiques :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:547132375_615.jpg|400px|thumb|center|E18-D50NK]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ses caractéristiques sont : &lt;br /&gt;
&lt;br /&gt;
- Power Supply :5V DC&lt;br /&gt;
&lt;br /&gt;
- Quiescent Current : &amp;lt;2mA&lt;br /&gt;
&lt;br /&gt;
- Effectual Angle: &amp;lt;15°&lt;br /&gt;
&lt;br /&gt;
- Ranging Distance : 2cm – 500 cm/1&amp;quot; - 16ft&lt;br /&gt;
&lt;br /&gt;
- Resolution : 0.3 cm&lt;br /&gt;
&lt;br /&gt;
Capteurs à ultrasons : Il s’agit du type de capteur préféré lors de nos premières réunions avec Digitale, notamment car Mr Donsez avait commandé un certain nombre de capteurs lors du début du projet. Ces capteurs ont l’avantage d’être peu cher (~3-5€), d’avoir une bonne portée et d’être relativement précis. Voici les spécifications du modèle de capteur à ultrasons choisi : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:HC-SR04-lg.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
La datasheet est disponible [http://jaktek.com/wp-content/uploads/2011/12/HC-SR04.pdf ici].&lt;br /&gt;
&lt;br /&gt;
- Alimentation : 5V&lt;br /&gt;
- Consommation : &amp;lt; 12mA&lt;br /&gt;
- Distance : 2-500cm avec un angle de 15 dégrés&lt;br /&gt;
&lt;br /&gt;
Ce module dispose simplement de 4 pins de sortie : VCC, TRIG, ECHO, GND. Il est donc très facile de l&#039;interfacer à un microcontrôleur. Le processus complet est le suivant: &lt;br /&gt;
&lt;br /&gt;
Mettre la pin &amp;quot;TRIG&amp;quot; une impulsion de niveau haut (5V) durant au moins 10µs et le module démarre sa lecture; A la fin de la mesure, s&#039;il détecte un objet devant lui, la pin &amp;quot;ECHO&amp;quot; passe au niveau haut (5V). &lt;br /&gt;
La distance où se situe l&#039;obstacle est proportionnelle à la durée de cette impulsion. Il est donc très facile de calculer cette distance avec la formule suivante:&lt;br /&gt;
&lt;br /&gt;
Distance = ((Durée du niveau haut)*(vitesse du son: 340 m/s))/2.&lt;br /&gt;
&lt;br /&gt;
Notre prototype fonctionne avec ce dernier type de capteur, son implémentation est décrite dans la partie suivante.&lt;br /&gt;
&lt;br /&gt;
Les capteurs seront idéalement placé sous l&#039;écran de la table, le long des bordures, comme dans l&#039;illustration ci dessous:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaTablesSensors.jpg|500px|thumb|center|Les capteurs sont représentés par les triangles noirs.]]&lt;br /&gt;
&lt;br /&gt;
==Solution adoptée==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi d’utiliser en priorité des capteurs à ultrasons car ces derniers étaient les seuls à être disponible suffisamment rapidement en plus de posséder les caractéristiques techniques qui correspondaient à notre besoin. Pour le prototype, nous avons construit une barre en bois sur laquelle les capteurs sont fixés. Nous avons choisi de « serrer » les capteurs pour gagner en précision, ils sont donc espacés d’environ 3 cm. Voici une photo du montage : &lt;br /&gt;
&lt;br /&gt;
[[Image:DSC00731-Small.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Pour la connectique, un Arduino peut gérer jusqu’à 18 capteurs à condition d’unifier la pin servant de trigger. D’un point de vue software, notre programme gère jusqu’à 15 capteurs, ceci permet de garder une assez bonne réactivité car les capteurs sont « interrogés » un à un. Pour accélérer encore plus ce processus, nous avons limité la distance de détection à 100 cm.&lt;br /&gt;
&lt;br /&gt;
La librairie utilisée est disponible [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ici].&lt;br /&gt;
&lt;br /&gt;
Le code sur lequel nous nous sommes basé est disponible [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ici]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
Pour la partie software, nous avons utilisé le langage C# et avons développés plusieurs modules orientés autour d&#039;un bus à messages dont voici un schéma:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaBUSSONARTABLE.jpg|600px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Concernant le bus à messages, nous utilisons un produit développé par le CENA  nommé Ivy. Le site internet du projet est disponible [http://www.tls.cena.fr/products/ivy/ ici]. Pour rendre l&#039;utilisation de la bibliothèque Ivy plus agréable à utiliser, et l&#039;adapter au projet, nous avons créer une bibliothèque qui est utilisée dans chaque module. Elle permet par exemple de faire une connexion automatique sur le port et adresse réseau de l&#039;application, mais surtout d&#039;améliorer la réception et envoi de messages sur le bus Ivy. En effet cette bibliothèque gère les messages sous forme d&#039;objets et non de comme de simple chaînes de caractères. De plus cela rend l&#039;application plus maintenable puisque toute la gestion des messages est écrire dans une unique bibliothèque. &lt;br /&gt;
&lt;br /&gt;
Le module d&#039;écoute des capteurs permet de récupérer l&#039;information générée par les Arduinos connectés aux différents ports COM et d&#039;envoyer ces informations &amp;quot;brutes&amp;quot; sur le bus Ivy. Pour récupérer les informations provenant des capteurs, nous avons modifié [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ce programme] destiné à la plateforme Arduino. &lt;br /&gt;
Ce module possède une interface graphique de configuration pour sélectionner les ports COM sur lesquels sont connectés les Arduinos. Actuellement un seul est sélectionnable dans l&#039;interface et un seul thread d’écoute est lancé. Mais l&#039;évolution du programme vers plusieurs se résume à une ligne de code si nécessaire. &lt;br /&gt;
&lt;br /&gt;
Le module de traitement permet de récupérer les informations des capteurs envoyés sur le bus et de les traiter. Dans le cadre de notre projet il ne reçoit et traite seulement les messages envoyés par les capteurs ultra-sons. Une évolution vers différent type de capteurs se résumerai donc à l&#039;abonnement sur le bus Ivy d&#039;autre type de messages et à leurs traitements. Le traitement des informations consistes à générer des messages de plus haut niveau et ainsi abstraire les informations qui proviennes des capteurs, cela permet donc de proposer plusieurs services qui sont chacun basés sur un ou plusieurs types de capteurs. Ces informations sont ensuite à nouveau transférées sur le bus Ivy. Pour notre projet deux messages sont générés. Présence et position. Présence signale l&#039;arrivé et le départ d&#039;une personne, et position donne la position de la personne autour de la table ainsi que sa distance par rapport à elle. &lt;br /&gt;
&lt;br /&gt;
L&#039;application client est dans notre cas une application de démonstration technologique qui affiche des fenêtres suivant le mouvement des utilisateurs autour de la table. Elle est basée sur le sdk Microsoft Surface.&lt;br /&gt;
&lt;br /&gt;
==Architecture==&lt;br /&gt;
&lt;br /&gt;
=Marketing=&lt;br /&gt;
&lt;br /&gt;
== Video ==&lt;br /&gt;
&lt;br /&gt;
Une vidéo de démonstration disponible [http://www.youtube.com/watch?v=8VKd9UdPNmc ici].&lt;br /&gt;
&lt;br /&gt;
== Poster ==&lt;br /&gt;
&lt;br /&gt;
[[Image:PosterSonarTable.jpg|600px|thumb|center| Resolution originale : 1024*768]]&lt;br /&gt;
&lt;br /&gt;
== Flyer ==&lt;br /&gt;
&lt;br /&gt;
Disponible [http://air.imag.fr/mediawiki/images/0/07/FliyerSonarTable.pdf ici].&lt;br /&gt;
&lt;br /&gt;
== Transparents ==&lt;br /&gt;
&lt;br /&gt;
Disponibles [http://air.imag.fr/mediawiki/images/b/be/Sonar_TablePresentation.pdf ici].&lt;br /&gt;
&lt;br /&gt;
= Optimisations à apporter =&lt;br /&gt;
&lt;br /&gt;
Une fois le prototype monté nous nous sommes rendu compte que les capteurs n’étaient pas très fiables et avaient tendance à ne pas détecter une personne alors que celle-ci était bien présente. Pour essayer de remédier à ce problème nous avons resserré les capteurs mais le problème à tendance à persister. Nous avons donc mis en place des solutions d’optimisation logicielle mais permettre de réduire le problème mais ne le résout pas totalement.&lt;br /&gt;
&lt;br /&gt;
= Suggestions =&lt;br /&gt;
&lt;br /&gt;
D’un point de vue hardware, nous vous conseillons de faire des tests avec d’autres types de capteurs, dont des capteurs infrarouges. Un mélange des deux est aussi envisageable est permettrait de s’affranchir des problèmes inhérents à un type de capteur.&lt;br /&gt;
&lt;br /&gt;
=Suivi=&lt;br /&gt;
&lt;br /&gt;
==Semaine 5== &lt;br /&gt;
* Définition des objectifs du projet&lt;br /&gt;
* Mise en place du dépôts&lt;br /&gt;
* Création d&#039;un projet vide contenant une application Microsoft Surface vide : SonarTable.&lt;br /&gt;
* Mise en place de réunion hebdomadaire pour avoir un bon suivis du projet.&lt;br /&gt;
&lt;br /&gt;
==Semaine 6==&lt;br /&gt;
* Connexion à l&#039;arduino via le port COM. &lt;br /&gt;
* Création du projet SerialPortListener pour écouter l&#039;Arduino.   &lt;br /&gt;
* Apprentissage de la bibliothèque Ivy et création de la bibliothèque IvyCom.&lt;br /&gt;
* Compilation de la bibliothèque ivy pour qu&#039;elle soit disponible sur l&#039;architecture x64 demandé par les applications Surface.&lt;br /&gt;
* Création d&#039;évenements c# pour créer le dialogue entre la  bibliothèque IvyCom et les projets qui l&#039;utilise. &lt;br /&gt;
* Création d&#039;une interface pour paramétrer SerialPortListener &lt;br /&gt;
&lt;br /&gt;
==Semaine 7==&lt;br /&gt;
* Conversion du projet SerialPortListener en x64&lt;br /&gt;
* Création de la bibliothèque MiddleWare pour traiter les message reçut de l&#039;Arduino et envoyer un évènement c# à l&#039;application SonarTable. &lt;br /&gt;
* Création des classes Personnes et Personne pour traiter les différentes personnes présente autour de la table. &lt;br /&gt;
* Création de nombreuse fonction dans les classe Personnes et Personne. Tel que : &lt;br /&gt;
** Ajouter / Supprimer capteurs&lt;br /&gt;
** Recherche personne par id&lt;br /&gt;
**Recherche personne par capteur&lt;br /&gt;
** Ajout / Suppression de personnes ...&lt;br /&gt;
* Création d&#039;un buffer pour sauvegarder par personnes les messages voulus.&lt;br /&gt;
* Début d&#039;algorithme de décision dans MiddleWare pour la conversion de message type Arduino de SerialPortListener par des messages utilisables par l&#039;application SonarTable.&lt;br /&gt;
* Affichage de fenêtres dans l&#039;application SonarTable affichant les données des messages reçuts.&lt;br /&gt;
&lt;br /&gt;
==Semaine 8==&lt;br /&gt;
* Grosse amélioration de l&#039;algorithme de décision&lt;br /&gt;
* Nombreuse correction de bug&lt;br /&gt;
* Placement des fenêtres sur la l&#039;application SonarTable selon la valeurs des messages. &lt;br /&gt;
* Réflexion sur un changement de structure : &lt;br /&gt;
MiddleWare ne communiquera plus comme une bibliothèque avec SonarTable mais via le bus ivy.&lt;br /&gt;
&lt;br /&gt;
==Semaine 9==&lt;br /&gt;
* Mise en place de la nouvelle structure.&lt;br /&gt;
* Changement de la gestion des fenêtres sur SonarTable dû aux changements de la structure (plus simple)&lt;br /&gt;
* Mise en place de variable de configurations pour l&#039;algorithme de décision : &lt;br /&gt;
** nbAbsenceAcceptee : Nombre de messages d’absences acceptés. Cette variable est dû à des erreurs de distance parfois envoyée par les capteurs.&lt;br /&gt;
** distanceDifferenceAcceptee : Correspond à la distance envoyée entre deux capteurs qui permet de différencier une personne d&#039;une autre.  &lt;br /&gt;
** reglageInterval : Nombre de capteurs à proximité nécessaire pour considérer le déplacement d&#039;une fenêtre.&lt;br /&gt;
&lt;br /&gt;
==Semaine 10==&lt;br /&gt;
* Amélioration de la connexion via le bus ivy&lt;br /&gt;
* Amélioration de la position des fenêtres sur SonarTable.&lt;br /&gt;
* Orientation des fenêtres sur SonarTable.&lt;br /&gt;
* Optimisation de l&#039;algorithme&lt;br /&gt;
* Correction de bugs.&lt;br /&gt;
* Début de rapport&lt;br /&gt;
&lt;br /&gt;
==Semaine 11==&lt;br /&gt;
* Création d&#039;une nouvelle application qui affiche les valeurs reçut par l&#039;Arduino. &lt;br /&gt;
* Ecriture du rapport.&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10182</id>
		<title>PAGE WIKI ETUDIANTS 2012-13 RECONNAISSANCE FACIALE</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10182"/>
		<updated>2013-03-22T09:48:57Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Utilisation de QT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description du projet==&lt;br /&gt;
Le principe est de permettre d&#039;identifier un utilisateur. Le système dispose d&#039;une base de données contenant l&#039;ensemble des utilisateurs connus et leur visage. Le système doit reconnaitre l&#039;utilisateur test dans la base de données.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scénario type :&#039;&#039;&#039; Une personne se présente au système. Le système détecte son visage et analyse la situation. Il répond alors de 2 manières possibles :&lt;br /&gt;
* La personne est vraisemblablement Monsieur X&lt;br /&gt;
* La personne n&#039;est pas dans la base de données&lt;br /&gt;
&lt;br /&gt;
==Composition de l&#039;équipe==&lt;br /&gt;
&#039;&#039;&#039;Chef de projet :&#039;&#039;&#039; Camille OSWALD&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Equipiers :&#039;&#039;&#039;&lt;br /&gt;
* Marie CHEVALLIER&lt;br /&gt;
* Fabien ELOY&lt;br /&gt;
* Christopher GNATTO&lt;br /&gt;
* Maxence RAOUX&lt;br /&gt;
* Sylvain VIGIER&lt;br /&gt;
* Clément WIRTH&lt;br /&gt;
&lt;br /&gt;
==Gestion du projet==&lt;br /&gt;
&lt;br /&gt;
 {|class=&amp;quot;wikitable organisation Bio-Face&amp;quot;&lt;br /&gt;
 |+ Grands temps de développement du projet&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Apprentissage&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Détection&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Technologie&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Sous-équipe&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Etat&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Base de données&lt;br /&gt;
 | X&lt;br /&gt;
 | -&lt;br /&gt;
 | TinyXml&lt;br /&gt;
 | Fabien &amp;amp; Christopher &amp;amp; Sylvain&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Acquisition de données&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Sylvain &amp;amp; Christopher&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Détection de visages&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Maxence &amp;amp; Camille &amp;amp; Clément&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Authentification&lt;br /&gt;
 | -&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Camille&lt;br /&gt;
 | A tester&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Documentation&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Wiki air&lt;br /&gt;
 | Marie&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Interface&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Maxence &amp;amp; Clément&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Synchro. Interface-Auth.&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Camille &amp;amp; Christopher &amp;amp; Sylvain &amp;amp; Fabien&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Technologies et matériel utilisés===&lt;br /&gt;
* C++&lt;br /&gt;
* librairies et frameworks : [http://opencv.org/ OpenCV], [http://qt-project.org/ Qt Project], [http://www.grinninglizard.com/tinyxml/ TinyXml]&lt;br /&gt;
* webcam&lt;br /&gt;
&lt;br /&gt;
===Chronologie de développement===&lt;br /&gt;
# Détection avec quelques images en base&lt;br /&gt;
#* Nous commençons par élaborer un modèle avec une petite base pour nous permettre de faire des tests. Nous agrandirons la base pour davantage de tests par la suite.&lt;br /&gt;
#* L&#039;acquisition des données de la webcam est très facilement gérée par OpenCV&lt;br /&gt;
#* La détection de visage se base sur la méthode de [http://fr.wikipedia.org/wiki/M%C3%A9thode_de_Viola_et_Jones Viola et Jones], aussi géré par OpenCV&lt;br /&gt;
#* Se focaliser sur la phase critique : l&#039;identification de visages&lt;br /&gt;
# Gérer la phase d&#039;apprentissage du système&amp;lt;br&amp;gt;&lt;br /&gt;
# optimiser le système (statistiques, réglage du seuil,…)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fonctionnement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la librairie OpenCv ===&lt;br /&gt;
&lt;br /&gt;
Comme ce projet nécéssitait l&#039;utilisation d&#039;une kinect, nous avions décidé de développer sous Windows.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc tout d&#039;abord essayé d&#039;utiliser Visual Studio pour développer notre projet. Par la suite, nous avons choisi de passer par un autre éditeur : Codeblocks.&lt;br /&gt;
&lt;br /&gt;
1) Utilisation de Visual Studio (2012)&lt;br /&gt;
&lt;br /&gt;
Après avoir réussi à inclure les librairies dans notre code, nous avons rencontrés les problèmes suivants : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problèmes rencontrés :&lt;br /&gt;
* Difficulté de comprendre le fonctionnement du compilateur de visual studio, notamment lorsqu&#039;il faut ajouter de nouveaux fichiers&lt;br /&gt;
* Problème lors du fonctionnement des objets utilisés par opencv (Exception au lancement, ou détection des visages non effectuées) pour certaines machines.&lt;br /&gt;
* La librairie devait se trouver sur au même endroit pour toutes les machines&lt;br /&gt;
&lt;br /&gt;
2) Utilisation de Code Blocks&lt;br /&gt;
&lt;br /&gt;
Pour une meilleure compréhension et un projet fonctionnant sur des machines différentes avec des librairies qui ne sont pas installées aux mêmes endroits, nous avons choisi de porter le projet sur codeblocks.&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, nous avons utilisé Codeblocks 12.11 avec MinGW inclu (version 4.7.1).&lt;br /&gt;
&lt;br /&gt;
==== Compilation de la librairie OpenCv ====&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;éviter les problèmes d&#039;utilisation de la librairie, il était nécessaire de recompiler la librairie avec le même compilateur que nous utilisons pour notre projet (ici MinGW fourni avec CodeBlocks).&lt;br /&gt;
&lt;br /&gt;
Pour compiler la librairie, nous avons utilisé l&#039;utilitaire Cmake.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de configurations de Cmake étant déjà fourni avec opencv (fichiers CMakeLists.txt), son utilisation devient très simple. Nous avons suivi le tutoriel ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Lancement de Cmake-gui&lt;br /&gt;
* Dans le champs Source Code, spécifier le chemin de la librairie openCv (exemple : C:\opencv-2.4.3)&lt;br /&gt;
* Dans le champs build, mettre le chemin ou la librairie compilée sera enregistrée (exemple : C:\openCV-build)&lt;br /&gt;
* Cliquer ensuite sur configure (créer le nouveau dossier)&lt;br /&gt;
* Spécification du générateur : MinGW Makefiles&lt;br /&gt;
* Sélectionner &amp;quot;Specify native compilers&amp;quot;&lt;br /&gt;
* Définir le compilateur C (ex : C:/Program Files/CodeBlocks/MinGW/bin/gcc.exe)&lt;br /&gt;
* Définir le compilateur C++ (ex: C:/Program Files/CodeBlocks/MinGW/bin/g++.exe)&lt;br /&gt;
* Cliquer sur Finish&lt;br /&gt;
* Cliquer sur generate&lt;br /&gt;
* Fermer Cmake&lt;br /&gt;
* Ouvrir une fenêtre de commande et aller dans le dossier que vous avez spécifié dans le champs build (ici : C:\openCV-build)&lt;br /&gt;
* Executer &amp;quot;ming32-make&amp;quot; (prend du temps et nécessite peut être d&#039;avoir le répertoire bin de MinGW dans le PATH)&lt;br /&gt;
* Enfin executer &amp;quot;mingw32-make install&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Configuration de codeblocks ====&lt;br /&gt;
&lt;br /&gt;
Pour configurer codeblocks, nous avons suivi ce tutoriel : http://opencv.willowgarage.com/wiki/CodeBlocks&lt;br /&gt;
&lt;br /&gt;
Afin que chacun puisse installer sa librairie openCv où bon lui semble, nous avons décidé de configurer chacun notre CodeBlocks. La démarche suivie est la suivante :&lt;br /&gt;
&lt;br /&gt;
* Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot; &lt;br /&gt;
* Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
* Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de notre openCv recompilé&lt;br /&gt;
* Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de notre openCv recompilé&lt;br /&gt;
* Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies .dll.a contenues dans le dossier lib.&lt;br /&gt;
* Inclure le dossier bin de notre openCv recompilé dans la variable système PATH (nécessite peut être un redemmarrage)&lt;br /&gt;
&lt;br /&gt;
Après ces étapes nous pouvons inclure les librairies openCV dans n&#039;importe quel projet Codeblocks.&lt;br /&gt;
&lt;br /&gt;
=== La bibliothèque Qt ===&lt;br /&gt;
&lt;br /&gt;
==== Installation de QT ====&lt;br /&gt;
&lt;br /&gt;
Installer QT : &lt;br /&gt;
* Télécharger Qt 5.0.1(MinGW 4.7) ou une version compatible avec MinGW 4.7 depuis le site [http://qt-project.org/downloads qt-project]&lt;br /&gt;
* Installer QT depuis l’exécutable téléchargé. &lt;br /&gt;
&lt;br /&gt;
Intégré QT à Codeblocks de la même manière qu&#039;OpenCV. C&#039;est à dire : &lt;br /&gt;
* Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot;&lt;br /&gt;
* Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
* Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/include)&lt;br /&gt;
* Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/lib)&lt;br /&gt;
* Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies a contenues dans le dossier lib.&lt;br /&gt;
&lt;br /&gt;
==== Utilisation de QT ====&lt;br /&gt;
&lt;br /&gt;
Les inclusions de bibliothèque se fond en précisant le bon chemin, par exemple pour : &lt;br /&gt;
QLabel : #include &amp;lt;QtWidgets/QLabel&amp;gt; &lt;br /&gt;
QWidget : #include &amp;lt;QtWidgets/QWidget&amp;gt;&lt;br /&gt;
QPixmap : #include &amp;lt;QtGui/QPixmap&amp;gt;&lt;br /&gt;
etc...&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne les signaux et les slots, propre a QT. Une manipulation est nécessaire à leurs bon fonctionnement. &lt;br /&gt;
Comprendre leurs fonctionnement sur [http://www.siteduzero.com/informatique/tutoriels/programmez-avec-le-langage-c/creer-ses-propres-signaux-et-slots le site du zéro par exemple] puis il est nécessaire de lancer une commande pour que le signal marche.&lt;br /&gt;
&lt;br /&gt;
Depuis la racine du projet exécutez la commande : &lt;br /&gt;
moc &amp;lt;chemin vers le .h comprenant le signal&amp;gt; -o &amp;lt;chemin vers les sources du cpp&amp;gt;\moc_&amp;lt;nom du .h&amp;gt;.cpp&lt;br /&gt;
&lt;br /&gt;
Par exempe un signal est contenu dans include avec le nom interface.h, le cpp correspondant se trouve dans src/interface.cpp&lt;br /&gt;
La ligne de commande nécessaire sera : &lt;br /&gt;
moc include/interface.h -o src/moc_interface.cpp&lt;br /&gt;
&lt;br /&gt;
Cette commande génére un fichier cpp qui rend le signal utilisable.&lt;br /&gt;
&lt;br /&gt;
=== Détection de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039;&lt;br /&gt;
* [http://opencv.willowgarage.com/wiki/FaceDetection Tutoriel pour la détection de visage par OpenCV]&lt;br /&gt;
* [http://www.cs.princeton.edu/courses/archive/fall08/cos429/CourseMaterials/Precept1/facedetect.pdf Tutoriel pour la détection de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après nous être inspirés de ces tutoriels, voici comment la détection de visages est implémentée dans notre projet :&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Déclaration des variables&amp;lt;/span&amp;gt;&lt;br /&gt;
    char Filexml[]=&amp;quot;haarcascade_frontalface_alt.xml&amp;quot;;&lt;br /&gt;
    CvHaarClassifierCascade* cascade = 0;&lt;br /&gt;
    IplImage* frame = 0;&lt;br /&gt;
    struct stat buf;&lt;br /&gt;
    int statResult = stat(Filexml,&amp;amp;buf);&lt;br /&gt;
    char s[] = &amp;quot;picture.jpg&amp;quot;;&lt;br /&gt;
    int nbFrame = 0;&lt;br /&gt;
    CvCapture* capture;&lt;br /&gt;
    IplImage *subImg;&lt;br /&gt;
    CvSeq *faceRectSeq;&lt;br /&gt;
    CvMemStorage *storage = cvCreateMemStorage(0);&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Teste si le fichier d&#039;entrée est bien chargé&amp;lt;/span&amp;gt;&lt;br /&gt;
    if (statResult ||buf.st_ino&amp;lt;0) {&lt;br /&gt;
        printf(&amp;quot;xml non trouvé&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un nouveau Haar classifier :&lt;br /&gt;
        // Crée des classes permettant d&#039;identifier des objets dans des rectangles d&#039;images&lt;br /&gt;
        // Le système s&#039;entraine sur les images du fichier xml&amp;lt;/span&amp;gt;&lt;br /&gt;
        cascade = (CvHaarClassifierCascade*) cvLoad(Filexml);&lt;br /&gt;
    }&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des visages en continue, à partir de la webcam&amp;lt;/span&amp;gt;&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Capture de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        capture = cvCaptureFromCAM(1);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un IplImage à partir de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        frame = cvQueryFrame(capture);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée une fenêtre pour afficher les visages détectés&amp;lt;/span&amp;gt;&lt;br /&gt;
        cvNamedWindow(&amp;quot;Sample Program&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        cvNamedWindow(&amp;quot;Visage&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des objets dans l&#039;image de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        faceRectSeq = cvHaarDetectObjects(frame,cascade,storage,1.2, 3,CV_HAAR_DO_CANNY_PRUNING,cvSize(50,50));&lt;br /&gt;
        CvRect *r;&lt;br /&gt;
        for ( int i = 0; i &amp;lt; (faceRectSeq? faceRectSeq-&amp;gt;total:0); i++ )&lt;br /&gt;
        {&lt;br /&gt;
            r = (CvRect*)cvGetSeqElem(faceRectSeq,i);&lt;br /&gt;
            CvPoint p1 = { r-&amp;gt;x, r-&amp;gt;y };&lt;br /&gt;
            CvPoint p2 = { r-&amp;gt;x + r-&amp;gt;width, r-&amp;gt;y + r-&amp;gt;height };&lt;br /&gt;
            cvRectangle(frame,p1,p2,CV_RGB(0,255,0),1,4,0);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupération de l&#039;image à l&#039;interieur du rectangle r&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvSetImageROI(frame, *r);&lt;br /&gt;
            subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
            cvCopy(frame, subImg, NULL);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// On enregistre l&#039;image du visage&amp;lt;/span&amp;gt;&lt;br /&gt;
            saveTrainImg(frame, subImg, nbFrame);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Affiche l&#039;image dans le rectangle, et l&#039;image de la caméra dans son intégralité&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvShowImage(&amp;quot;Visage&amp;quot;, subImg);&lt;br /&gt;
            cvResetImageROI(frame);&lt;br /&gt;
            cvShowImage(&amp;quot;Sample Program&amp;quot;, frame);&lt;br /&gt;
        }&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Fermeture de l&#039;application sur commande Echap&amp;lt;/span&amp;gt;&lt;br /&gt;
        int c = cvWaitKey(10);&lt;br /&gt;
        if( (char)c == 27 )&lt;br /&gt;
        {&lt;br /&gt;
            cvSaveImage(s, frame);&lt;br /&gt;
            exit(0);&lt;br /&gt;
        }&lt;br /&gt;
        nbFrame++;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Traitement des images ===&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Copie l&#039;image source &#039;&#039;frame&#039;&#039; dans &#039;&#039;subImg&#039;&#039; pour traitement&amp;lt;/span&amp;gt;&lt;br /&gt;
  subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
  cvCopy(frame, subImg, NULL);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le nom de fichier pour l&#039;enregistrement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  string Result;&lt;br /&gt;
  ostringstream convert;&lt;br /&gt;
  ostringstream convertIdPersonne;&lt;br /&gt;
  convert &amp;lt;&amp;lt; nbFrame;&lt;br /&gt;
  convertIdPersonne &amp;lt;&amp;lt;idPersonne;&lt;br /&gt;
  Result = &amp;quot;imgResizedGray\\picture&amp;quot;+convertIdPersonne.str()+&amp;quot;&amp;quot;+convert.str()+&amp;quot;.jpg&amp;quot;;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variables nécessaires au traitement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dst = cvCreateImage(cvSize(400, 400),subImg-&amp;gt;depth,3)&lt;br /&gt;
  IplImage *dstGray = cvCreateImage(cvSize(400, 400),dst-&amp;gt;depth,1);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Redimensionne l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvResize(subImg,dst, CV_INTER_LINEAR );&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Convertie en matrice et en niveaux de gris&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvCvtColor(dst, dstGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Enregistre l&#039;image retraitée&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvSaveImage(Result.c_str(), dstGray);&lt;br /&gt;
  return Result;&lt;br /&gt;
&lt;br /&gt;
=== Identification de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039; [http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html Tutoriel pour la reconnaissance de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
L&#039;identification de visage consiste à reconnaitre un utilisateur dans un ensemble de visages connu. Plusieurs algorithmes existent pour comparer un visage à un autre : Eigenfaces, Fisherfaces, Local Binary Patterns Histograms,...&lt;br /&gt;
&lt;br /&gt;
Dans notre solution, nous utilisons la technique Fisherfaces. Il faut générer un modèle, permettant de lier chaque identité à un set d&#039;images lui correspondant. A la phase d&#039;identification, l&#039;image test (visage) sera comparée avec ce modèle. On va sélectionner le visage le plus proche du visage test, selon un certain calcul de distance. Il est possible d&#039;améliorer les résultats en jouant sur le seuil d&#039;acceptation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Création du modèle &#039;&#039;&#039;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteurs permettant de stocker l&#039;ensemble des images et des noms des utilisateurs pour le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Mat&amp;gt; images;&lt;br /&gt;
  vector&amp;lt;int&amp;gt; labels;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Va chercher les données dans notre fichier de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Personne&amp;gt; personnes = collection-&amp;gt;getPersonnes();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteur contenant les images de notre système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Image&amp;gt; imageRefs;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Parcours de l&#039;ensemble des personnes du système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  Personne personne;&lt;br /&gt;
  for(int i=0;i&amp;lt;(int)personnes.size();i++){&lt;br /&gt;
     personne = personnes[i];&lt;br /&gt;
     imageRefs = personne.getImageReferences();&lt;br /&gt;
     for(int j=0;j&amp;lt;(int)imageRefs.size();j++){&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupère l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
        IplImage* src = cvLoadImage(imageRefs[j].getChemin().c_str(), CV_LOAD_IMAGE_GRAYSCALE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Transforme l&#039;image en matrice&amp;lt;/span&amp;gt;&lt;br /&gt;
        Mat matDst=src;&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Stocke l&#039;image dans le vecteur &#039;&#039;images&#039;&#039; et la lie à l&#039;identité dans le vecteur &#039;&#039;labels&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
        images.push_back(matDst); labels.push_back(personne.getId());&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le modèle avec la technique Fisherfaces&amp;lt;/span&amp;gt;&lt;br /&gt;
  Ptr&amp;lt;FaceRecognizer&amp;gt; model =  createFisherFaceRecognizer();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Entraine/génère le modèle en fonction des vecteurs créés&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;train(images, labels);&lt;br /&gt;
  return model;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Identification du visage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Formatage de l&#039;image du visage test&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dstTest = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,3);&lt;br /&gt;
  IplImage *dstTestGray = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,1);&lt;br /&gt;
  cvResize(subImg,dstTest, CV_INTER_LINEAR );&lt;br /&gt;
  cvCvtColor(dstTest, dstTestGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Création de la matrice de l&#039;image de visage test pour comparaison avec le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  Mat matTest=dstTestGray;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variable stockant la confiance accordée au résultat&amp;lt;/span&amp;gt;&lt;br /&gt;
  double confidence = -1.0;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Identité résultat prédite&amp;lt;/span&amp;gt;&lt;br /&gt;
  int predicted = -1;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Demande la prédiction à partir du modèle cv::FaceRecognizer:&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;predict(matTest, predicted, confidence);&lt;br /&gt;
&lt;br /&gt;
=== Persistance des données ===&lt;br /&gt;
Pour réaliser un système de reconnaissance faciale, il faut mettre en place une base des utilisateurs. Lorsqu&#039;une personne souhaitera être authentifiée (ou identifiée), la comparaison sera faite avec les individus présents dans cette base. Pour chaque individu, nous lui associons une liste d&#039;images, captures de son visage. Le système de reconnaissance d&#039;OpenCV fonctionnant directement avec des images, nous les stockons directement en format JPG dans un dossier &amp;quot;imgResizedGray&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Format de données ====&lt;br /&gt;
Les données sont stockées en XML (fichier Personnes.xml dans le dossier data). Pour chaque personne, nous enregistrons son nom, prénom, un identifiant unique (généré automatiquement), et une liste d&#039;images associées (date + chemin). Voici un exemple de fichier:&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;ListePersonnes&amp;gt;&lt;br /&gt;
    &amp;lt;Personne&amp;gt;&lt;br /&gt;
        &amp;lt;Nom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Mercier&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Nom&amp;gt;&lt;br /&gt;
        &amp;lt;Prenom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Jean-Francois&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Prenom&amp;gt;&lt;br /&gt;
        &amp;lt;Id&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        1&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois2.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
    &amp;lt;/Personne&amp;gt;&lt;br /&gt;
 &amp;lt;/ListePersonnes&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
Une fois parsées, les données sont en mémoire dans la classe &amp;quot;Connexion&amp;quot;. Les modifications des données effectuées dans cette structure sont enregistrée en même temps dans le fichier xml.&lt;br /&gt;
&lt;br /&gt;
==== Librairie utilisée ====&lt;br /&gt;
La librairie utilisée pour parser le fichier xml est tinyXML. L&#039;import de la librairie est très simple puisque ce sont des classes C++ à ajouter dans le projet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;tinystr.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxml.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlerror.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlparser.cpp&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La documentation est disponible [http://www.grinninglizard.com/tinyxml/ ici].&lt;br /&gt;
Quelques éléments sur le fonctionnement de la librairie:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Chargement d&#039;un fichier XML :&amp;lt;/li&amp;gt; &lt;br /&gt;
 TiXmlDocument doc = TiXmlDocument(xmlFile);&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise fille (dans ce cas c&#039;est &amp;lt;ListePersonnes&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlHandle hdl(&amp;amp;doc);&lt;br /&gt;
 TiXmlElement *elem1 = hdl.FirstChildElement(&amp;quot;ListePersonnes&amp;quot;).Element();&lt;br /&gt;
 //Si l&#039;élément cherché est non trouvé&lt;br /&gt;
 if(!elem1) return false;&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise soeur (on passe de &amp;lt;Nom&amp;gt; à &amp;lt;Prenom&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlElement *elem1=elem1-&amp;gt;NextSiblingElement(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
&amp;lt;li&amp;gt; Modification du fichier XML (ajout d&#039;une balise fille &amp;lt;Personne&amp;gt; ainsi que ses balises filles &amp;lt;Nom&amp;gt;, &amp;lt;Prenom&amp;gt;, &amp;lt;Id&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 TiXmlText* newText;&lt;br /&gt;
 TiXmlElement new_personne(&amp;quot;Personne&amp;quot;);&lt;br /&gt;
 TiXmlElement new_nom(&amp;quot;Nom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_prenom(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_id(&amp;quot;Id&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 //Récupération des informations de la personne&lt;br /&gt;
 newText = new TiXmlText(firstName.c_str());&lt;br /&gt;
 new_nom.InsertEndChild(*newText);&lt;br /&gt;
 newText = new TiXmlText(lastName.c_str());&lt;br /&gt;
 new_prenom.InsertEndChild(*newText);&lt;br /&gt;
 oss &amp;lt;&amp;lt;id;&lt;br /&gt;
 newText = new TiXmlText(oss.str().c_str());&lt;br /&gt;
 new_id.InsertEndChild(*newText);&lt;br /&gt;
 &lt;br /&gt;
 //Création des balises filles de &amp;lt;Personne&amp;gt;&lt;br /&gt;
 new_personne.InsertEndChild(new_nom);&lt;br /&gt;
 new_personne.InsertEndChild(new_prenom);&lt;br /&gt;
 new_personne.InsertEndChild(new_id);&lt;br /&gt;
 &lt;br /&gt;
 //Création de la balise fille &amp;lt;Personne&amp;gt;&lt;br /&gt;
 elem1-&amp;gt;InsertEndChild(new_personne);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Sauvegarde du fichier XML :&amp;lt;/li&amp;gt;&lt;br /&gt;
 doc.SaveFile(xmlFile);&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10180</id>
		<title>PAGE WIKI ETUDIANTS 2012-13 RECONNAISSANCE FACIALE</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10180"/>
		<updated>2013-03-22T09:48:36Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Utilisation de QT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description du projet==&lt;br /&gt;
Le principe est de permettre d&#039;identifier un utilisateur. Le système dispose d&#039;une base de données contenant l&#039;ensemble des utilisateurs connus et leur visage. Le système doit reconnaitre l&#039;utilisateur test dans la base de données.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scénario type :&#039;&#039;&#039; Une personne se présente au système. Le système détecte son visage et analyse la situation. Il répond alors de 2 manières possibles :&lt;br /&gt;
* La personne est vraisemblablement Monsieur X&lt;br /&gt;
* La personne n&#039;est pas dans la base de données&lt;br /&gt;
&lt;br /&gt;
==Composition de l&#039;équipe==&lt;br /&gt;
&#039;&#039;&#039;Chef de projet :&#039;&#039;&#039; Camille OSWALD&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Equipiers :&#039;&#039;&#039;&lt;br /&gt;
* Marie CHEVALLIER&lt;br /&gt;
* Fabien ELOY&lt;br /&gt;
* Christopher GNATTO&lt;br /&gt;
* Maxence RAOUX&lt;br /&gt;
* Sylvain VIGIER&lt;br /&gt;
* Clément WIRTH&lt;br /&gt;
&lt;br /&gt;
==Gestion du projet==&lt;br /&gt;
&lt;br /&gt;
 {|class=&amp;quot;wikitable organisation Bio-Face&amp;quot;&lt;br /&gt;
 |+ Grands temps de développement du projet&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Apprentissage&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Détection&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Technologie&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Sous-équipe&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Etat&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Base de données&lt;br /&gt;
 | X&lt;br /&gt;
 | -&lt;br /&gt;
 | TinyXml&lt;br /&gt;
 | Fabien &amp;amp; Christopher &amp;amp; Sylvain&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Acquisition de données&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Sylvain &amp;amp; Christopher&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Détection de visages&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Maxence &amp;amp; Camille &amp;amp; Clément&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Authentification&lt;br /&gt;
 | -&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Camille&lt;br /&gt;
 | A tester&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Documentation&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Wiki air&lt;br /&gt;
 | Marie&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Interface&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Maxence &amp;amp; Clément&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Synchro. Interface-Auth.&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Camille &amp;amp; Christopher &amp;amp; Sylvain &amp;amp; Fabien&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Technologies et matériel utilisés===&lt;br /&gt;
* C++&lt;br /&gt;
* librairies et frameworks : [http://opencv.org/ OpenCV], [http://qt-project.org/ Qt Project], [http://www.grinninglizard.com/tinyxml/ TinyXml]&lt;br /&gt;
* webcam&lt;br /&gt;
&lt;br /&gt;
===Chronologie de développement===&lt;br /&gt;
# Détection avec quelques images en base&lt;br /&gt;
#* Nous commençons par élaborer un modèle avec une petite base pour nous permettre de faire des tests. Nous agrandirons la base pour davantage de tests par la suite.&lt;br /&gt;
#* L&#039;acquisition des données de la webcam est très facilement gérée par OpenCV&lt;br /&gt;
#* La détection de visage se base sur la méthode de [http://fr.wikipedia.org/wiki/M%C3%A9thode_de_Viola_et_Jones Viola et Jones], aussi géré par OpenCV&lt;br /&gt;
#* Se focaliser sur la phase critique : l&#039;identification de visages&lt;br /&gt;
# Gérer la phase d&#039;apprentissage du système&amp;lt;br&amp;gt;&lt;br /&gt;
# optimiser le système (statistiques, réglage du seuil,…)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fonctionnement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la librairie OpenCv ===&lt;br /&gt;
&lt;br /&gt;
Comme ce projet nécéssitait l&#039;utilisation d&#039;une kinect, nous avions décidé de développer sous Windows.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc tout d&#039;abord essayé d&#039;utiliser Visual Studio pour développer notre projet. Par la suite, nous avons choisi de passer par un autre éditeur : Codeblocks.&lt;br /&gt;
&lt;br /&gt;
1) Utilisation de Visual Studio (2012)&lt;br /&gt;
&lt;br /&gt;
Après avoir réussi à inclure les librairies dans notre code, nous avons rencontrés les problèmes suivants : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problèmes rencontrés :&lt;br /&gt;
* Difficulté de comprendre le fonctionnement du compilateur de visual studio, notamment lorsqu&#039;il faut ajouter de nouveaux fichiers&lt;br /&gt;
* Problème lors du fonctionnement des objets utilisés par opencv (Exception au lancement, ou détection des visages non effectuées) pour certaines machines.&lt;br /&gt;
* La librairie devait se trouver sur au même endroit pour toutes les machines&lt;br /&gt;
&lt;br /&gt;
2) Utilisation de Code Blocks&lt;br /&gt;
&lt;br /&gt;
Pour une meilleure compréhension et un projet fonctionnant sur des machines différentes avec des librairies qui ne sont pas installées aux mêmes endroits, nous avons choisi de porter le projet sur codeblocks.&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, nous avons utilisé Codeblocks 12.11 avec MinGW inclu (version 4.7.1).&lt;br /&gt;
&lt;br /&gt;
==== Compilation de la librairie OpenCv ====&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;éviter les problèmes d&#039;utilisation de la librairie, il était nécessaire de recompiler la librairie avec le même compilateur que nous utilisons pour notre projet (ici MinGW fourni avec CodeBlocks).&lt;br /&gt;
&lt;br /&gt;
Pour compiler la librairie, nous avons utilisé l&#039;utilitaire Cmake.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de configurations de Cmake étant déjà fourni avec opencv (fichiers CMakeLists.txt), son utilisation devient très simple. Nous avons suivi le tutoriel ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Lancement de Cmake-gui&lt;br /&gt;
* Dans le champs Source Code, spécifier le chemin de la librairie openCv (exemple : C:\opencv-2.4.3)&lt;br /&gt;
* Dans le champs build, mettre le chemin ou la librairie compilée sera enregistrée (exemple : C:\openCV-build)&lt;br /&gt;
* Cliquer ensuite sur configure (créer le nouveau dossier)&lt;br /&gt;
* Spécification du générateur : MinGW Makefiles&lt;br /&gt;
* Sélectionner &amp;quot;Specify native compilers&amp;quot;&lt;br /&gt;
* Définir le compilateur C (ex : C:/Program Files/CodeBlocks/MinGW/bin/gcc.exe)&lt;br /&gt;
* Définir le compilateur C++ (ex: C:/Program Files/CodeBlocks/MinGW/bin/g++.exe)&lt;br /&gt;
* Cliquer sur Finish&lt;br /&gt;
* Cliquer sur generate&lt;br /&gt;
* Fermer Cmake&lt;br /&gt;
* Ouvrir une fenêtre de commande et aller dans le dossier que vous avez spécifié dans le champs build (ici : C:\openCV-build)&lt;br /&gt;
* Executer &amp;quot;ming32-make&amp;quot; (prend du temps et nécessite peut être d&#039;avoir le répertoire bin de MinGW dans le PATH)&lt;br /&gt;
* Enfin executer &amp;quot;mingw32-make install&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Configuration de codeblocks ====&lt;br /&gt;
&lt;br /&gt;
Pour configurer codeblocks, nous avons suivi ce tutoriel : http://opencv.willowgarage.com/wiki/CodeBlocks&lt;br /&gt;
&lt;br /&gt;
Afin que chacun puisse installer sa librairie openCv où bon lui semble, nous avons décidé de configurer chacun notre CodeBlocks. La démarche suivie est la suivante :&lt;br /&gt;
&lt;br /&gt;
* Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot; &lt;br /&gt;
* Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
* Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de notre openCv recompilé&lt;br /&gt;
* Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de notre openCv recompilé&lt;br /&gt;
* Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies .dll.a contenues dans le dossier lib.&lt;br /&gt;
* Inclure le dossier bin de notre openCv recompilé dans la variable système PATH (nécessite peut être un redemmarrage)&lt;br /&gt;
&lt;br /&gt;
Après ces étapes nous pouvons inclure les librairies openCV dans n&#039;importe quel projet Codeblocks.&lt;br /&gt;
&lt;br /&gt;
=== La bibliothèque Qt ===&lt;br /&gt;
&lt;br /&gt;
==== Installation de QT ====&lt;br /&gt;
&lt;br /&gt;
Installer QT : &lt;br /&gt;
* Télécharger Qt 5.0.1(MinGW 4.7) ou une version compatible avec MinGW 4.7 depuis le site [http://qt-project.org/downloads qt-project]&lt;br /&gt;
* Installer QT depuis l’exécutable téléchargé. &lt;br /&gt;
&lt;br /&gt;
Intégré QT à Codeblocks de la même manière qu&#039;OpenCV. C&#039;est à dire : &lt;br /&gt;
* Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot;&lt;br /&gt;
* Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
* Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/include)&lt;br /&gt;
* Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/lib)&lt;br /&gt;
* Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies a contenues dans le dossier lib.&lt;br /&gt;
&lt;br /&gt;
==== Utilisation de QT ====&lt;br /&gt;
&lt;br /&gt;
Les inclusions de bibliothèque se fond en précisant le bon chemin, par exemple pour : &lt;br /&gt;
 QLabel : #include &amp;lt;QtWidgets/QLabel&amp;gt; &lt;br /&gt;
 QWidget : #include &amp;lt;QtWidgets/QWidget&amp;gt;&lt;br /&gt;
 QPixmap : #include &amp;lt;QtGui/QPixmap&amp;gt;&lt;br /&gt;
etc...&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne les signaux et les slots, propre a QT. Une manipulation est nécessaire à leurs bon fonctionnement. &lt;br /&gt;
Comprendre leurs fonctionnement sur [http://www.siteduzero.com/informatique/tutoriels/programmez-avec-le-langage-c/creer-ses-propres-signaux-et-slots le site du zéro par exemple] puis il est nécessaire de lancer une commande pour que le signal marche.&lt;br /&gt;
&lt;br /&gt;
Depuis la racine du projet exécutez la commande : &lt;br /&gt;
moc &amp;lt;chemin vers le .h comprenant le signal&amp;gt; -o &amp;lt;chemin vers les sources du cpp&amp;gt;\moc_&amp;lt;nom du .h&amp;gt;.cpp&lt;br /&gt;
&lt;br /&gt;
Par exempe un signal est contenu dans include avec le nom interface.h, le cpp correspondant se trouve dans src/interface.cpp&lt;br /&gt;
La ligne de commande nécessaire sera : &lt;br /&gt;
moc include/interface.h -o src/moc_interface.cpp&lt;br /&gt;
&lt;br /&gt;
Cette commande génére un fichier cpp qui rend le signal utilisable.&lt;br /&gt;
&lt;br /&gt;
=== Détection de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039;&lt;br /&gt;
* [http://opencv.willowgarage.com/wiki/FaceDetection Tutoriel pour la détection de visage par OpenCV]&lt;br /&gt;
* [http://www.cs.princeton.edu/courses/archive/fall08/cos429/CourseMaterials/Precept1/facedetect.pdf Tutoriel pour la détection de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après nous être inspirés de ces tutoriels, voici comment la détection de visages est implémentée dans notre projet :&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Déclaration des variables&amp;lt;/span&amp;gt;&lt;br /&gt;
    char Filexml[]=&amp;quot;haarcascade_frontalface_alt.xml&amp;quot;;&lt;br /&gt;
    CvHaarClassifierCascade* cascade = 0;&lt;br /&gt;
    IplImage* frame = 0;&lt;br /&gt;
    struct stat buf;&lt;br /&gt;
    int statResult = stat(Filexml,&amp;amp;buf);&lt;br /&gt;
    char s[] = &amp;quot;picture.jpg&amp;quot;;&lt;br /&gt;
    int nbFrame = 0;&lt;br /&gt;
    CvCapture* capture;&lt;br /&gt;
    IplImage *subImg;&lt;br /&gt;
    CvSeq *faceRectSeq;&lt;br /&gt;
    CvMemStorage *storage = cvCreateMemStorage(0);&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Teste si le fichier d&#039;entrée est bien chargé&amp;lt;/span&amp;gt;&lt;br /&gt;
    if (statResult ||buf.st_ino&amp;lt;0) {&lt;br /&gt;
        printf(&amp;quot;xml non trouvé&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un nouveau Haar classifier :&lt;br /&gt;
        // Crée des classes permettant d&#039;identifier des objets dans des rectangles d&#039;images&lt;br /&gt;
        // Le système s&#039;entraine sur les images du fichier xml&amp;lt;/span&amp;gt;&lt;br /&gt;
        cascade = (CvHaarClassifierCascade*) cvLoad(Filexml);&lt;br /&gt;
    }&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des visages en continue, à partir de la webcam&amp;lt;/span&amp;gt;&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Capture de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        capture = cvCaptureFromCAM(1);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un IplImage à partir de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        frame = cvQueryFrame(capture);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée une fenêtre pour afficher les visages détectés&amp;lt;/span&amp;gt;&lt;br /&gt;
        cvNamedWindow(&amp;quot;Sample Program&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        cvNamedWindow(&amp;quot;Visage&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des objets dans l&#039;image de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        faceRectSeq = cvHaarDetectObjects(frame,cascade,storage,1.2, 3,CV_HAAR_DO_CANNY_PRUNING,cvSize(50,50));&lt;br /&gt;
        CvRect *r;&lt;br /&gt;
        for ( int i = 0; i &amp;lt; (faceRectSeq? faceRectSeq-&amp;gt;total:0); i++ )&lt;br /&gt;
        {&lt;br /&gt;
            r = (CvRect*)cvGetSeqElem(faceRectSeq,i);&lt;br /&gt;
            CvPoint p1 = { r-&amp;gt;x, r-&amp;gt;y };&lt;br /&gt;
            CvPoint p2 = { r-&amp;gt;x + r-&amp;gt;width, r-&amp;gt;y + r-&amp;gt;height };&lt;br /&gt;
            cvRectangle(frame,p1,p2,CV_RGB(0,255,0),1,4,0);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupération de l&#039;image à l&#039;interieur du rectangle r&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvSetImageROI(frame, *r);&lt;br /&gt;
            subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
            cvCopy(frame, subImg, NULL);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// On enregistre l&#039;image du visage&amp;lt;/span&amp;gt;&lt;br /&gt;
            saveTrainImg(frame, subImg, nbFrame);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Affiche l&#039;image dans le rectangle, et l&#039;image de la caméra dans son intégralité&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvShowImage(&amp;quot;Visage&amp;quot;, subImg);&lt;br /&gt;
            cvResetImageROI(frame);&lt;br /&gt;
            cvShowImage(&amp;quot;Sample Program&amp;quot;, frame);&lt;br /&gt;
        }&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Fermeture de l&#039;application sur commande Echap&amp;lt;/span&amp;gt;&lt;br /&gt;
        int c = cvWaitKey(10);&lt;br /&gt;
        if( (char)c == 27 )&lt;br /&gt;
        {&lt;br /&gt;
            cvSaveImage(s, frame);&lt;br /&gt;
            exit(0);&lt;br /&gt;
        }&lt;br /&gt;
        nbFrame++;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Traitement des images ===&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Copie l&#039;image source &#039;&#039;frame&#039;&#039; dans &#039;&#039;subImg&#039;&#039; pour traitement&amp;lt;/span&amp;gt;&lt;br /&gt;
  subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
  cvCopy(frame, subImg, NULL);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le nom de fichier pour l&#039;enregistrement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  string Result;&lt;br /&gt;
  ostringstream convert;&lt;br /&gt;
  ostringstream convertIdPersonne;&lt;br /&gt;
  convert &amp;lt;&amp;lt; nbFrame;&lt;br /&gt;
  convertIdPersonne &amp;lt;&amp;lt;idPersonne;&lt;br /&gt;
  Result = &amp;quot;imgResizedGray\\picture&amp;quot;+convertIdPersonne.str()+&amp;quot;&amp;quot;+convert.str()+&amp;quot;.jpg&amp;quot;;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variables nécessaires au traitement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dst = cvCreateImage(cvSize(400, 400),subImg-&amp;gt;depth,3)&lt;br /&gt;
  IplImage *dstGray = cvCreateImage(cvSize(400, 400),dst-&amp;gt;depth,1);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Redimensionne l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvResize(subImg,dst, CV_INTER_LINEAR );&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Convertie en matrice et en niveaux de gris&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvCvtColor(dst, dstGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Enregistre l&#039;image retraitée&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvSaveImage(Result.c_str(), dstGray);&lt;br /&gt;
  return Result;&lt;br /&gt;
&lt;br /&gt;
=== Identification de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039; [http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html Tutoriel pour la reconnaissance de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
L&#039;identification de visage consiste à reconnaitre un utilisateur dans un ensemble de visages connu. Plusieurs algorithmes existent pour comparer un visage à un autre : Eigenfaces, Fisherfaces, Local Binary Patterns Histograms,...&lt;br /&gt;
&lt;br /&gt;
Dans notre solution, nous utilisons la technique Fisherfaces. Il faut générer un modèle, permettant de lier chaque identité à un set d&#039;images lui correspondant. A la phase d&#039;identification, l&#039;image test (visage) sera comparée avec ce modèle. On va sélectionner le visage le plus proche du visage test, selon un certain calcul de distance. Il est possible d&#039;améliorer les résultats en jouant sur le seuil d&#039;acceptation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Création du modèle &#039;&#039;&#039;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteurs permettant de stocker l&#039;ensemble des images et des noms des utilisateurs pour le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Mat&amp;gt; images;&lt;br /&gt;
  vector&amp;lt;int&amp;gt; labels;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Va chercher les données dans notre fichier de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Personne&amp;gt; personnes = collection-&amp;gt;getPersonnes();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteur contenant les images de notre système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Image&amp;gt; imageRefs;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Parcours de l&#039;ensemble des personnes du système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  Personne personne;&lt;br /&gt;
  for(int i=0;i&amp;lt;(int)personnes.size();i++){&lt;br /&gt;
     personne = personnes[i];&lt;br /&gt;
     imageRefs = personne.getImageReferences();&lt;br /&gt;
     for(int j=0;j&amp;lt;(int)imageRefs.size();j++){&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupère l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
        IplImage* src = cvLoadImage(imageRefs[j].getChemin().c_str(), CV_LOAD_IMAGE_GRAYSCALE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Transforme l&#039;image en matrice&amp;lt;/span&amp;gt;&lt;br /&gt;
        Mat matDst=src;&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Stocke l&#039;image dans le vecteur &#039;&#039;images&#039;&#039; et la lie à l&#039;identité dans le vecteur &#039;&#039;labels&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
        images.push_back(matDst); labels.push_back(personne.getId());&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le modèle avec la technique Fisherfaces&amp;lt;/span&amp;gt;&lt;br /&gt;
  Ptr&amp;lt;FaceRecognizer&amp;gt; model =  createFisherFaceRecognizer();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Entraine/génère le modèle en fonction des vecteurs créés&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;train(images, labels);&lt;br /&gt;
  return model;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Identification du visage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Formatage de l&#039;image du visage test&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dstTest = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,3);&lt;br /&gt;
  IplImage *dstTestGray = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,1);&lt;br /&gt;
  cvResize(subImg,dstTest, CV_INTER_LINEAR );&lt;br /&gt;
  cvCvtColor(dstTest, dstTestGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Création de la matrice de l&#039;image de visage test pour comparaison avec le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  Mat matTest=dstTestGray;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variable stockant la confiance accordée au résultat&amp;lt;/span&amp;gt;&lt;br /&gt;
  double confidence = -1.0;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Identité résultat prédite&amp;lt;/span&amp;gt;&lt;br /&gt;
  int predicted = -1;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Demande la prédiction à partir du modèle cv::FaceRecognizer:&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;predict(matTest, predicted, confidence);&lt;br /&gt;
&lt;br /&gt;
=== Persistance des données ===&lt;br /&gt;
Pour réaliser un système de reconnaissance faciale, il faut mettre en place une base des utilisateurs. Lorsqu&#039;une personne souhaitera être authentifiée (ou identifiée), la comparaison sera faite avec les individus présents dans cette base. Pour chaque individu, nous lui associons une liste d&#039;images, captures de son visage. Le système de reconnaissance d&#039;OpenCV fonctionnant directement avec des images, nous les stockons directement en format JPG dans un dossier &amp;quot;imgResizedGray&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Format de données ====&lt;br /&gt;
Les données sont stockées en XML (fichier Personnes.xml dans le dossier data). Pour chaque personne, nous enregistrons son nom, prénom, un identifiant unique (généré automatiquement), et une liste d&#039;images associées (date + chemin). Voici un exemple de fichier:&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;ListePersonnes&amp;gt;&lt;br /&gt;
    &amp;lt;Personne&amp;gt;&lt;br /&gt;
        &amp;lt;Nom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Mercier&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Nom&amp;gt;&lt;br /&gt;
        &amp;lt;Prenom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Jean-Francois&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Prenom&amp;gt;&lt;br /&gt;
        &amp;lt;Id&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        1&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois2.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
    &amp;lt;/Personne&amp;gt;&lt;br /&gt;
 &amp;lt;/ListePersonnes&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
Une fois parsées, les données sont en mémoire dans la classe &amp;quot;Connexion&amp;quot;. Les modifications des données effectuées dans cette structure sont enregistrée en même temps dans le fichier xml.&lt;br /&gt;
&lt;br /&gt;
==== Librairie utilisée ====&lt;br /&gt;
La librairie utilisée pour parser le fichier xml est tinyXML. L&#039;import de la librairie est très simple puisque ce sont des classes C++ à ajouter dans le projet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;tinystr.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxml.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlerror.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlparser.cpp&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La documentation est disponible [http://www.grinninglizard.com/tinyxml/ ici].&lt;br /&gt;
Quelques éléments sur le fonctionnement de la librairie:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Chargement d&#039;un fichier XML :&amp;lt;/li&amp;gt; &lt;br /&gt;
 TiXmlDocument doc = TiXmlDocument(xmlFile);&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise fille (dans ce cas c&#039;est &amp;lt;ListePersonnes&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlHandle hdl(&amp;amp;doc);&lt;br /&gt;
 TiXmlElement *elem1 = hdl.FirstChildElement(&amp;quot;ListePersonnes&amp;quot;).Element();&lt;br /&gt;
 //Si l&#039;élément cherché est non trouvé&lt;br /&gt;
 if(!elem1) return false;&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise soeur (on passe de &amp;lt;Nom&amp;gt; à &amp;lt;Prenom&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlElement *elem1=elem1-&amp;gt;NextSiblingElement(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
&amp;lt;li&amp;gt; Modification du fichier XML (ajout d&#039;une balise fille &amp;lt;Personne&amp;gt; ainsi que ses balises filles &amp;lt;Nom&amp;gt;, &amp;lt;Prenom&amp;gt;, &amp;lt;Id&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 TiXmlText* newText;&lt;br /&gt;
 TiXmlElement new_personne(&amp;quot;Personne&amp;quot;);&lt;br /&gt;
 TiXmlElement new_nom(&amp;quot;Nom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_prenom(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_id(&amp;quot;Id&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 //Récupération des informations de la personne&lt;br /&gt;
 newText = new TiXmlText(firstName.c_str());&lt;br /&gt;
 new_nom.InsertEndChild(*newText);&lt;br /&gt;
 newText = new TiXmlText(lastName.c_str());&lt;br /&gt;
 new_prenom.InsertEndChild(*newText);&lt;br /&gt;
 oss &amp;lt;&amp;lt;id;&lt;br /&gt;
 newText = new TiXmlText(oss.str().c_str());&lt;br /&gt;
 new_id.InsertEndChild(*newText);&lt;br /&gt;
 &lt;br /&gt;
 //Création des balises filles de &amp;lt;Personne&amp;gt;&lt;br /&gt;
 new_personne.InsertEndChild(new_nom);&lt;br /&gt;
 new_personne.InsertEndChild(new_prenom);&lt;br /&gt;
 new_personne.InsertEndChild(new_id);&lt;br /&gt;
 &lt;br /&gt;
 //Création de la balise fille &amp;lt;Personne&amp;gt;&lt;br /&gt;
 elem1-&amp;gt;InsertEndChild(new_personne);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Sauvegarde du fichier XML :&amp;lt;/li&amp;gt;&lt;br /&gt;
 doc.SaveFile(xmlFile);&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10179</id>
		<title>PAGE WIKI ETUDIANTS 2012-13 RECONNAISSANCE FACIALE</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10179"/>
		<updated>2013-03-22T09:48:22Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Installation de QT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description du projet==&lt;br /&gt;
Le principe est de permettre d&#039;identifier un utilisateur. Le système dispose d&#039;une base de données contenant l&#039;ensemble des utilisateurs connus et leur visage. Le système doit reconnaitre l&#039;utilisateur test dans la base de données.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scénario type :&#039;&#039;&#039; Une personne se présente au système. Le système détecte son visage et analyse la situation. Il répond alors de 2 manières possibles :&lt;br /&gt;
* La personne est vraisemblablement Monsieur X&lt;br /&gt;
* La personne n&#039;est pas dans la base de données&lt;br /&gt;
&lt;br /&gt;
==Composition de l&#039;équipe==&lt;br /&gt;
&#039;&#039;&#039;Chef de projet :&#039;&#039;&#039; Camille OSWALD&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Equipiers :&#039;&#039;&#039;&lt;br /&gt;
* Marie CHEVALLIER&lt;br /&gt;
* Fabien ELOY&lt;br /&gt;
* Christopher GNATTO&lt;br /&gt;
* Maxence RAOUX&lt;br /&gt;
* Sylvain VIGIER&lt;br /&gt;
* Clément WIRTH&lt;br /&gt;
&lt;br /&gt;
==Gestion du projet==&lt;br /&gt;
&lt;br /&gt;
 {|class=&amp;quot;wikitable organisation Bio-Face&amp;quot;&lt;br /&gt;
 |+ Grands temps de développement du projet&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Apprentissage&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Détection&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Technologie&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Sous-équipe&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Etat&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Base de données&lt;br /&gt;
 | X&lt;br /&gt;
 | -&lt;br /&gt;
 | TinyXml&lt;br /&gt;
 | Fabien &amp;amp; Christopher &amp;amp; Sylvain&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Acquisition de données&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Sylvain &amp;amp; Christopher&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Détection de visages&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Maxence &amp;amp; Camille &amp;amp; Clément&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Authentification&lt;br /&gt;
 | -&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Camille&lt;br /&gt;
 | A tester&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Documentation&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Wiki air&lt;br /&gt;
 | Marie&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Interface&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Maxence &amp;amp; Clément&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Synchro. Interface-Auth.&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Camille &amp;amp; Christopher &amp;amp; Sylvain &amp;amp; Fabien&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Technologies et matériel utilisés===&lt;br /&gt;
* C++&lt;br /&gt;
* librairies et frameworks : [http://opencv.org/ OpenCV], [http://qt-project.org/ Qt Project], [http://www.grinninglizard.com/tinyxml/ TinyXml]&lt;br /&gt;
* webcam&lt;br /&gt;
&lt;br /&gt;
===Chronologie de développement===&lt;br /&gt;
# Détection avec quelques images en base&lt;br /&gt;
#* Nous commençons par élaborer un modèle avec une petite base pour nous permettre de faire des tests. Nous agrandirons la base pour davantage de tests par la suite.&lt;br /&gt;
#* L&#039;acquisition des données de la webcam est très facilement gérée par OpenCV&lt;br /&gt;
#* La détection de visage se base sur la méthode de [http://fr.wikipedia.org/wiki/M%C3%A9thode_de_Viola_et_Jones Viola et Jones], aussi géré par OpenCV&lt;br /&gt;
#* Se focaliser sur la phase critique : l&#039;identification de visages&lt;br /&gt;
# Gérer la phase d&#039;apprentissage du système&amp;lt;br&amp;gt;&lt;br /&gt;
# optimiser le système (statistiques, réglage du seuil,…)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fonctionnement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la librairie OpenCv ===&lt;br /&gt;
&lt;br /&gt;
Comme ce projet nécéssitait l&#039;utilisation d&#039;une kinect, nous avions décidé de développer sous Windows.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc tout d&#039;abord essayé d&#039;utiliser Visual Studio pour développer notre projet. Par la suite, nous avons choisi de passer par un autre éditeur : Codeblocks.&lt;br /&gt;
&lt;br /&gt;
1) Utilisation de Visual Studio (2012)&lt;br /&gt;
&lt;br /&gt;
Après avoir réussi à inclure les librairies dans notre code, nous avons rencontrés les problèmes suivants : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problèmes rencontrés :&lt;br /&gt;
* Difficulté de comprendre le fonctionnement du compilateur de visual studio, notamment lorsqu&#039;il faut ajouter de nouveaux fichiers&lt;br /&gt;
* Problème lors du fonctionnement des objets utilisés par opencv (Exception au lancement, ou détection des visages non effectuées) pour certaines machines.&lt;br /&gt;
* La librairie devait se trouver sur au même endroit pour toutes les machines&lt;br /&gt;
&lt;br /&gt;
2) Utilisation de Code Blocks&lt;br /&gt;
&lt;br /&gt;
Pour une meilleure compréhension et un projet fonctionnant sur des machines différentes avec des librairies qui ne sont pas installées aux mêmes endroits, nous avons choisi de porter le projet sur codeblocks.&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, nous avons utilisé Codeblocks 12.11 avec MinGW inclu (version 4.7.1).&lt;br /&gt;
&lt;br /&gt;
==== Compilation de la librairie OpenCv ====&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;éviter les problèmes d&#039;utilisation de la librairie, il était nécessaire de recompiler la librairie avec le même compilateur que nous utilisons pour notre projet (ici MinGW fourni avec CodeBlocks).&lt;br /&gt;
&lt;br /&gt;
Pour compiler la librairie, nous avons utilisé l&#039;utilitaire Cmake.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de configurations de Cmake étant déjà fourni avec opencv (fichiers CMakeLists.txt), son utilisation devient très simple. Nous avons suivi le tutoriel ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Lancement de Cmake-gui&lt;br /&gt;
* Dans le champs Source Code, spécifier le chemin de la librairie openCv (exemple : C:\opencv-2.4.3)&lt;br /&gt;
* Dans le champs build, mettre le chemin ou la librairie compilée sera enregistrée (exemple : C:\openCV-build)&lt;br /&gt;
* Cliquer ensuite sur configure (créer le nouveau dossier)&lt;br /&gt;
* Spécification du générateur : MinGW Makefiles&lt;br /&gt;
* Sélectionner &amp;quot;Specify native compilers&amp;quot;&lt;br /&gt;
* Définir le compilateur C (ex : C:/Program Files/CodeBlocks/MinGW/bin/gcc.exe)&lt;br /&gt;
* Définir le compilateur C++ (ex: C:/Program Files/CodeBlocks/MinGW/bin/g++.exe)&lt;br /&gt;
* Cliquer sur Finish&lt;br /&gt;
* Cliquer sur generate&lt;br /&gt;
* Fermer Cmake&lt;br /&gt;
* Ouvrir une fenêtre de commande et aller dans le dossier que vous avez spécifié dans le champs build (ici : C:\openCV-build)&lt;br /&gt;
* Executer &amp;quot;ming32-make&amp;quot; (prend du temps et nécessite peut être d&#039;avoir le répertoire bin de MinGW dans le PATH)&lt;br /&gt;
* Enfin executer &amp;quot;mingw32-make install&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Configuration de codeblocks ====&lt;br /&gt;
&lt;br /&gt;
Pour configurer codeblocks, nous avons suivi ce tutoriel : http://opencv.willowgarage.com/wiki/CodeBlocks&lt;br /&gt;
&lt;br /&gt;
Afin que chacun puisse installer sa librairie openCv où bon lui semble, nous avons décidé de configurer chacun notre CodeBlocks. La démarche suivie est la suivante :&lt;br /&gt;
&lt;br /&gt;
* Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot; &lt;br /&gt;
* Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
* Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de notre openCv recompilé&lt;br /&gt;
* Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de notre openCv recompilé&lt;br /&gt;
* Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies .dll.a contenues dans le dossier lib.&lt;br /&gt;
* Inclure le dossier bin de notre openCv recompilé dans la variable système PATH (nécessite peut être un redemmarrage)&lt;br /&gt;
&lt;br /&gt;
Après ces étapes nous pouvons inclure les librairies openCV dans n&#039;importe quel projet Codeblocks.&lt;br /&gt;
&lt;br /&gt;
=== La bibliothèque Qt ===&lt;br /&gt;
&lt;br /&gt;
==== Installation de QT ====&lt;br /&gt;
&lt;br /&gt;
Installer QT : &lt;br /&gt;
* Télécharger Qt 5.0.1(MinGW 4.7) ou une version compatible avec MinGW 4.7 depuis le site [http://qt-project.org/downloads qt-project]&lt;br /&gt;
* Installer QT depuis l’exécutable téléchargé. &lt;br /&gt;
&lt;br /&gt;
Intégré QT à Codeblocks de la même manière qu&#039;OpenCV. C&#039;est à dire : &lt;br /&gt;
* Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot;&lt;br /&gt;
* Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
* Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/include)&lt;br /&gt;
* Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/lib)&lt;br /&gt;
* Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies a contenues dans le dossier lib.&lt;br /&gt;
&lt;br /&gt;
== Utilisation de QT ==&lt;br /&gt;
&lt;br /&gt;
Les inclusions de bibliothèque se fond en précisant le bon chemin, par exemple pour : &lt;br /&gt;
 QLabel : #include &amp;lt;QtWidgets/QLabel&amp;gt; &lt;br /&gt;
 QWidget : #include &amp;lt;QtWidgets/QWidget&amp;gt;&lt;br /&gt;
 QPixmap : #include &amp;lt;QtGui/QPixmap&amp;gt;&lt;br /&gt;
etc...&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne les signaux et les slots, propre a QT. Une manipulation est nécessaire à leurs bon fonctionnement. &lt;br /&gt;
Comprendre leurs fonctionnement sur [http://www.siteduzero.com/informatique/tutoriels/programmez-avec-le-langage-c/creer-ses-propres-signaux-et-slots le site du zéro par exemple] puis il est nécessaire de lancer une commande pour que le signal marche.&lt;br /&gt;
&lt;br /&gt;
Depuis la racine du projet exécutez la commande : &lt;br /&gt;
moc &amp;lt;chemin vers le .h comprenant le signal&amp;gt; -o &amp;lt;chemin vers les sources du cpp&amp;gt;\moc_&amp;lt;nom du .h&amp;gt;.cpp&lt;br /&gt;
&lt;br /&gt;
Par exempe un signal est contenu dans include avec le nom interface.h, le cpp correspondant se trouve dans src/interface.cpp&lt;br /&gt;
La ligne de commande nécessaire sera : &lt;br /&gt;
moc include/interface.h -o src/moc_interface.cpp&lt;br /&gt;
&lt;br /&gt;
Cette commande génére un fichier cpp qui rend le signal utilisable.&lt;br /&gt;
&lt;br /&gt;
=== Détection de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039;&lt;br /&gt;
* [http://opencv.willowgarage.com/wiki/FaceDetection Tutoriel pour la détection de visage par OpenCV]&lt;br /&gt;
* [http://www.cs.princeton.edu/courses/archive/fall08/cos429/CourseMaterials/Precept1/facedetect.pdf Tutoriel pour la détection de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après nous être inspirés de ces tutoriels, voici comment la détection de visages est implémentée dans notre projet :&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Déclaration des variables&amp;lt;/span&amp;gt;&lt;br /&gt;
    char Filexml[]=&amp;quot;haarcascade_frontalface_alt.xml&amp;quot;;&lt;br /&gt;
    CvHaarClassifierCascade* cascade = 0;&lt;br /&gt;
    IplImage* frame = 0;&lt;br /&gt;
    struct stat buf;&lt;br /&gt;
    int statResult = stat(Filexml,&amp;amp;buf);&lt;br /&gt;
    char s[] = &amp;quot;picture.jpg&amp;quot;;&lt;br /&gt;
    int nbFrame = 0;&lt;br /&gt;
    CvCapture* capture;&lt;br /&gt;
    IplImage *subImg;&lt;br /&gt;
    CvSeq *faceRectSeq;&lt;br /&gt;
    CvMemStorage *storage = cvCreateMemStorage(0);&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Teste si le fichier d&#039;entrée est bien chargé&amp;lt;/span&amp;gt;&lt;br /&gt;
    if (statResult ||buf.st_ino&amp;lt;0) {&lt;br /&gt;
        printf(&amp;quot;xml non trouvé&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un nouveau Haar classifier :&lt;br /&gt;
        // Crée des classes permettant d&#039;identifier des objets dans des rectangles d&#039;images&lt;br /&gt;
        // Le système s&#039;entraine sur les images du fichier xml&amp;lt;/span&amp;gt;&lt;br /&gt;
        cascade = (CvHaarClassifierCascade*) cvLoad(Filexml);&lt;br /&gt;
    }&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des visages en continue, à partir de la webcam&amp;lt;/span&amp;gt;&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Capture de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        capture = cvCaptureFromCAM(1);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un IplImage à partir de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        frame = cvQueryFrame(capture);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée une fenêtre pour afficher les visages détectés&amp;lt;/span&amp;gt;&lt;br /&gt;
        cvNamedWindow(&amp;quot;Sample Program&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        cvNamedWindow(&amp;quot;Visage&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des objets dans l&#039;image de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        faceRectSeq = cvHaarDetectObjects(frame,cascade,storage,1.2, 3,CV_HAAR_DO_CANNY_PRUNING,cvSize(50,50));&lt;br /&gt;
        CvRect *r;&lt;br /&gt;
        for ( int i = 0; i &amp;lt; (faceRectSeq? faceRectSeq-&amp;gt;total:0); i++ )&lt;br /&gt;
        {&lt;br /&gt;
            r = (CvRect*)cvGetSeqElem(faceRectSeq,i);&lt;br /&gt;
            CvPoint p1 = { r-&amp;gt;x, r-&amp;gt;y };&lt;br /&gt;
            CvPoint p2 = { r-&amp;gt;x + r-&amp;gt;width, r-&amp;gt;y + r-&amp;gt;height };&lt;br /&gt;
            cvRectangle(frame,p1,p2,CV_RGB(0,255,0),1,4,0);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupération de l&#039;image à l&#039;interieur du rectangle r&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvSetImageROI(frame, *r);&lt;br /&gt;
            subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
            cvCopy(frame, subImg, NULL);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// On enregistre l&#039;image du visage&amp;lt;/span&amp;gt;&lt;br /&gt;
            saveTrainImg(frame, subImg, nbFrame);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Affiche l&#039;image dans le rectangle, et l&#039;image de la caméra dans son intégralité&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvShowImage(&amp;quot;Visage&amp;quot;, subImg);&lt;br /&gt;
            cvResetImageROI(frame);&lt;br /&gt;
            cvShowImage(&amp;quot;Sample Program&amp;quot;, frame);&lt;br /&gt;
        }&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Fermeture de l&#039;application sur commande Echap&amp;lt;/span&amp;gt;&lt;br /&gt;
        int c = cvWaitKey(10);&lt;br /&gt;
        if( (char)c == 27 )&lt;br /&gt;
        {&lt;br /&gt;
            cvSaveImage(s, frame);&lt;br /&gt;
            exit(0);&lt;br /&gt;
        }&lt;br /&gt;
        nbFrame++;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Traitement des images ===&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Copie l&#039;image source &#039;&#039;frame&#039;&#039; dans &#039;&#039;subImg&#039;&#039; pour traitement&amp;lt;/span&amp;gt;&lt;br /&gt;
  subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
  cvCopy(frame, subImg, NULL);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le nom de fichier pour l&#039;enregistrement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  string Result;&lt;br /&gt;
  ostringstream convert;&lt;br /&gt;
  ostringstream convertIdPersonne;&lt;br /&gt;
  convert &amp;lt;&amp;lt; nbFrame;&lt;br /&gt;
  convertIdPersonne &amp;lt;&amp;lt;idPersonne;&lt;br /&gt;
  Result = &amp;quot;imgResizedGray\\picture&amp;quot;+convertIdPersonne.str()+&amp;quot;&amp;quot;+convert.str()+&amp;quot;.jpg&amp;quot;;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variables nécessaires au traitement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dst = cvCreateImage(cvSize(400, 400),subImg-&amp;gt;depth,3)&lt;br /&gt;
  IplImage *dstGray = cvCreateImage(cvSize(400, 400),dst-&amp;gt;depth,1);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Redimensionne l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvResize(subImg,dst, CV_INTER_LINEAR );&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Convertie en matrice et en niveaux de gris&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvCvtColor(dst, dstGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Enregistre l&#039;image retraitée&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvSaveImage(Result.c_str(), dstGray);&lt;br /&gt;
  return Result;&lt;br /&gt;
&lt;br /&gt;
=== Identification de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039; [http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html Tutoriel pour la reconnaissance de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
L&#039;identification de visage consiste à reconnaitre un utilisateur dans un ensemble de visages connu. Plusieurs algorithmes existent pour comparer un visage à un autre : Eigenfaces, Fisherfaces, Local Binary Patterns Histograms,...&lt;br /&gt;
&lt;br /&gt;
Dans notre solution, nous utilisons la technique Fisherfaces. Il faut générer un modèle, permettant de lier chaque identité à un set d&#039;images lui correspondant. A la phase d&#039;identification, l&#039;image test (visage) sera comparée avec ce modèle. On va sélectionner le visage le plus proche du visage test, selon un certain calcul de distance. Il est possible d&#039;améliorer les résultats en jouant sur le seuil d&#039;acceptation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Création du modèle &#039;&#039;&#039;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteurs permettant de stocker l&#039;ensemble des images et des noms des utilisateurs pour le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Mat&amp;gt; images;&lt;br /&gt;
  vector&amp;lt;int&amp;gt; labels;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Va chercher les données dans notre fichier de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Personne&amp;gt; personnes = collection-&amp;gt;getPersonnes();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteur contenant les images de notre système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Image&amp;gt; imageRefs;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Parcours de l&#039;ensemble des personnes du système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  Personne personne;&lt;br /&gt;
  for(int i=0;i&amp;lt;(int)personnes.size();i++){&lt;br /&gt;
     personne = personnes[i];&lt;br /&gt;
     imageRefs = personne.getImageReferences();&lt;br /&gt;
     for(int j=0;j&amp;lt;(int)imageRefs.size();j++){&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupère l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
        IplImage* src = cvLoadImage(imageRefs[j].getChemin().c_str(), CV_LOAD_IMAGE_GRAYSCALE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Transforme l&#039;image en matrice&amp;lt;/span&amp;gt;&lt;br /&gt;
        Mat matDst=src;&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Stocke l&#039;image dans le vecteur &#039;&#039;images&#039;&#039; et la lie à l&#039;identité dans le vecteur &#039;&#039;labels&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
        images.push_back(matDst); labels.push_back(personne.getId());&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le modèle avec la technique Fisherfaces&amp;lt;/span&amp;gt;&lt;br /&gt;
  Ptr&amp;lt;FaceRecognizer&amp;gt; model =  createFisherFaceRecognizer();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Entraine/génère le modèle en fonction des vecteurs créés&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;train(images, labels);&lt;br /&gt;
  return model;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Identification du visage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Formatage de l&#039;image du visage test&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dstTest = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,3);&lt;br /&gt;
  IplImage *dstTestGray = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,1);&lt;br /&gt;
  cvResize(subImg,dstTest, CV_INTER_LINEAR );&lt;br /&gt;
  cvCvtColor(dstTest, dstTestGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Création de la matrice de l&#039;image de visage test pour comparaison avec le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  Mat matTest=dstTestGray;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variable stockant la confiance accordée au résultat&amp;lt;/span&amp;gt;&lt;br /&gt;
  double confidence = -1.0;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Identité résultat prédite&amp;lt;/span&amp;gt;&lt;br /&gt;
  int predicted = -1;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Demande la prédiction à partir du modèle cv::FaceRecognizer:&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;predict(matTest, predicted, confidence);&lt;br /&gt;
&lt;br /&gt;
=== Persistance des données ===&lt;br /&gt;
Pour réaliser un système de reconnaissance faciale, il faut mettre en place une base des utilisateurs. Lorsqu&#039;une personne souhaitera être authentifiée (ou identifiée), la comparaison sera faite avec les individus présents dans cette base. Pour chaque individu, nous lui associons une liste d&#039;images, captures de son visage. Le système de reconnaissance d&#039;OpenCV fonctionnant directement avec des images, nous les stockons directement en format JPG dans un dossier &amp;quot;imgResizedGray&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Format de données ====&lt;br /&gt;
Les données sont stockées en XML (fichier Personnes.xml dans le dossier data). Pour chaque personne, nous enregistrons son nom, prénom, un identifiant unique (généré automatiquement), et une liste d&#039;images associées (date + chemin). Voici un exemple de fichier:&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;ListePersonnes&amp;gt;&lt;br /&gt;
    &amp;lt;Personne&amp;gt;&lt;br /&gt;
        &amp;lt;Nom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Mercier&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Nom&amp;gt;&lt;br /&gt;
        &amp;lt;Prenom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Jean-Francois&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Prenom&amp;gt;&lt;br /&gt;
        &amp;lt;Id&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        1&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois2.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
    &amp;lt;/Personne&amp;gt;&lt;br /&gt;
 &amp;lt;/ListePersonnes&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
Une fois parsées, les données sont en mémoire dans la classe &amp;quot;Connexion&amp;quot;. Les modifications des données effectuées dans cette structure sont enregistrée en même temps dans le fichier xml.&lt;br /&gt;
&lt;br /&gt;
==== Librairie utilisée ====&lt;br /&gt;
La librairie utilisée pour parser le fichier xml est tinyXML. L&#039;import de la librairie est très simple puisque ce sont des classes C++ à ajouter dans le projet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;tinystr.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxml.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlerror.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlparser.cpp&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La documentation est disponible [http://www.grinninglizard.com/tinyxml/ ici].&lt;br /&gt;
Quelques éléments sur le fonctionnement de la librairie:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Chargement d&#039;un fichier XML :&amp;lt;/li&amp;gt; &lt;br /&gt;
 TiXmlDocument doc = TiXmlDocument(xmlFile);&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise fille (dans ce cas c&#039;est &amp;lt;ListePersonnes&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlHandle hdl(&amp;amp;doc);&lt;br /&gt;
 TiXmlElement *elem1 = hdl.FirstChildElement(&amp;quot;ListePersonnes&amp;quot;).Element();&lt;br /&gt;
 //Si l&#039;élément cherché est non trouvé&lt;br /&gt;
 if(!elem1) return false;&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise soeur (on passe de &amp;lt;Nom&amp;gt; à &amp;lt;Prenom&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlElement *elem1=elem1-&amp;gt;NextSiblingElement(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
&amp;lt;li&amp;gt; Modification du fichier XML (ajout d&#039;une balise fille &amp;lt;Personne&amp;gt; ainsi que ses balises filles &amp;lt;Nom&amp;gt;, &amp;lt;Prenom&amp;gt;, &amp;lt;Id&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 TiXmlText* newText;&lt;br /&gt;
 TiXmlElement new_personne(&amp;quot;Personne&amp;quot;);&lt;br /&gt;
 TiXmlElement new_nom(&amp;quot;Nom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_prenom(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_id(&amp;quot;Id&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 //Récupération des informations de la personne&lt;br /&gt;
 newText = new TiXmlText(firstName.c_str());&lt;br /&gt;
 new_nom.InsertEndChild(*newText);&lt;br /&gt;
 newText = new TiXmlText(lastName.c_str());&lt;br /&gt;
 new_prenom.InsertEndChild(*newText);&lt;br /&gt;
 oss &amp;lt;&amp;lt;id;&lt;br /&gt;
 newText = new TiXmlText(oss.str().c_str());&lt;br /&gt;
 new_id.InsertEndChild(*newText);&lt;br /&gt;
 &lt;br /&gt;
 //Création des balises filles de &amp;lt;Personne&amp;gt;&lt;br /&gt;
 new_personne.InsertEndChild(new_nom);&lt;br /&gt;
 new_personne.InsertEndChild(new_prenom);&lt;br /&gt;
 new_personne.InsertEndChild(new_id);&lt;br /&gt;
 &lt;br /&gt;
 //Création de la balise fille &amp;lt;Personne&amp;gt;&lt;br /&gt;
 elem1-&amp;gt;InsertEndChild(new_personne);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Sauvegarde du fichier XML :&amp;lt;/li&amp;gt;&lt;br /&gt;
 doc.SaveFile(xmlFile);&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10178</id>
		<title>PAGE WIKI ETUDIANTS 2012-13 RECONNAISSANCE FACIALE</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10178"/>
		<updated>2013-03-22T09:48:11Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Installation de QT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description du projet==&lt;br /&gt;
Le principe est de permettre d&#039;identifier un utilisateur. Le système dispose d&#039;une base de données contenant l&#039;ensemble des utilisateurs connus et leur visage. Le système doit reconnaitre l&#039;utilisateur test dans la base de données.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scénario type :&#039;&#039;&#039; Une personne se présente au système. Le système détecte son visage et analyse la situation. Il répond alors de 2 manières possibles :&lt;br /&gt;
* La personne est vraisemblablement Monsieur X&lt;br /&gt;
* La personne n&#039;est pas dans la base de données&lt;br /&gt;
&lt;br /&gt;
==Composition de l&#039;équipe==&lt;br /&gt;
&#039;&#039;&#039;Chef de projet :&#039;&#039;&#039; Camille OSWALD&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Equipiers :&#039;&#039;&#039;&lt;br /&gt;
* Marie CHEVALLIER&lt;br /&gt;
* Fabien ELOY&lt;br /&gt;
* Christopher GNATTO&lt;br /&gt;
* Maxence RAOUX&lt;br /&gt;
* Sylvain VIGIER&lt;br /&gt;
* Clément WIRTH&lt;br /&gt;
&lt;br /&gt;
==Gestion du projet==&lt;br /&gt;
&lt;br /&gt;
 {|class=&amp;quot;wikitable organisation Bio-Face&amp;quot;&lt;br /&gt;
 |+ Grands temps de développement du projet&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Apprentissage&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Détection&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Technologie&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Sous-équipe&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Etat&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Base de données&lt;br /&gt;
 | X&lt;br /&gt;
 | -&lt;br /&gt;
 | TinyXml&lt;br /&gt;
 | Fabien &amp;amp; Christopher &amp;amp; Sylvain&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Acquisition de données&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Sylvain &amp;amp; Christopher&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Détection de visages&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Maxence &amp;amp; Camille &amp;amp; Clément&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Authentification&lt;br /&gt;
 | -&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Camille&lt;br /&gt;
 | A tester&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Documentation&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Wiki air&lt;br /&gt;
 | Marie&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Interface&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Maxence &amp;amp; Clément&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Synchro. Interface-Auth.&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Camille &amp;amp; Christopher &amp;amp; Sylvain &amp;amp; Fabien&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Technologies et matériel utilisés===&lt;br /&gt;
* C++&lt;br /&gt;
* librairies et frameworks : [http://opencv.org/ OpenCV], [http://qt-project.org/ Qt Project], [http://www.grinninglizard.com/tinyxml/ TinyXml]&lt;br /&gt;
* webcam&lt;br /&gt;
&lt;br /&gt;
===Chronologie de développement===&lt;br /&gt;
# Détection avec quelques images en base&lt;br /&gt;
#* Nous commençons par élaborer un modèle avec une petite base pour nous permettre de faire des tests. Nous agrandirons la base pour davantage de tests par la suite.&lt;br /&gt;
#* L&#039;acquisition des données de la webcam est très facilement gérée par OpenCV&lt;br /&gt;
#* La détection de visage se base sur la méthode de [http://fr.wikipedia.org/wiki/M%C3%A9thode_de_Viola_et_Jones Viola et Jones], aussi géré par OpenCV&lt;br /&gt;
#* Se focaliser sur la phase critique : l&#039;identification de visages&lt;br /&gt;
# Gérer la phase d&#039;apprentissage du système&amp;lt;br&amp;gt;&lt;br /&gt;
# optimiser le système (statistiques, réglage du seuil,…)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fonctionnement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la librairie OpenCv ===&lt;br /&gt;
&lt;br /&gt;
Comme ce projet nécéssitait l&#039;utilisation d&#039;une kinect, nous avions décidé de développer sous Windows.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc tout d&#039;abord essayé d&#039;utiliser Visual Studio pour développer notre projet. Par la suite, nous avons choisi de passer par un autre éditeur : Codeblocks.&lt;br /&gt;
&lt;br /&gt;
1) Utilisation de Visual Studio (2012)&lt;br /&gt;
&lt;br /&gt;
Après avoir réussi à inclure les librairies dans notre code, nous avons rencontrés les problèmes suivants : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problèmes rencontrés :&lt;br /&gt;
* Difficulté de comprendre le fonctionnement du compilateur de visual studio, notamment lorsqu&#039;il faut ajouter de nouveaux fichiers&lt;br /&gt;
* Problème lors du fonctionnement des objets utilisés par opencv (Exception au lancement, ou détection des visages non effectuées) pour certaines machines.&lt;br /&gt;
* La librairie devait se trouver sur au même endroit pour toutes les machines&lt;br /&gt;
&lt;br /&gt;
2) Utilisation de Code Blocks&lt;br /&gt;
&lt;br /&gt;
Pour une meilleure compréhension et un projet fonctionnant sur des machines différentes avec des librairies qui ne sont pas installées aux mêmes endroits, nous avons choisi de porter le projet sur codeblocks.&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, nous avons utilisé Codeblocks 12.11 avec MinGW inclu (version 4.7.1).&lt;br /&gt;
&lt;br /&gt;
==== Compilation de la librairie OpenCv ====&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;éviter les problèmes d&#039;utilisation de la librairie, il était nécessaire de recompiler la librairie avec le même compilateur que nous utilisons pour notre projet (ici MinGW fourni avec CodeBlocks).&lt;br /&gt;
&lt;br /&gt;
Pour compiler la librairie, nous avons utilisé l&#039;utilitaire Cmake.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de configurations de Cmake étant déjà fourni avec opencv (fichiers CMakeLists.txt), son utilisation devient très simple. Nous avons suivi le tutoriel ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Lancement de Cmake-gui&lt;br /&gt;
* Dans le champs Source Code, spécifier le chemin de la librairie openCv (exemple : C:\opencv-2.4.3)&lt;br /&gt;
* Dans le champs build, mettre le chemin ou la librairie compilée sera enregistrée (exemple : C:\openCV-build)&lt;br /&gt;
* Cliquer ensuite sur configure (créer le nouveau dossier)&lt;br /&gt;
* Spécification du générateur : MinGW Makefiles&lt;br /&gt;
* Sélectionner &amp;quot;Specify native compilers&amp;quot;&lt;br /&gt;
* Définir le compilateur C (ex : C:/Program Files/CodeBlocks/MinGW/bin/gcc.exe)&lt;br /&gt;
* Définir le compilateur C++ (ex: C:/Program Files/CodeBlocks/MinGW/bin/g++.exe)&lt;br /&gt;
* Cliquer sur Finish&lt;br /&gt;
* Cliquer sur generate&lt;br /&gt;
* Fermer Cmake&lt;br /&gt;
* Ouvrir une fenêtre de commande et aller dans le dossier que vous avez spécifié dans le champs build (ici : C:\openCV-build)&lt;br /&gt;
* Executer &amp;quot;ming32-make&amp;quot; (prend du temps et nécessite peut être d&#039;avoir le répertoire bin de MinGW dans le PATH)&lt;br /&gt;
* Enfin executer &amp;quot;mingw32-make install&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Configuration de codeblocks ====&lt;br /&gt;
&lt;br /&gt;
Pour configurer codeblocks, nous avons suivi ce tutoriel : http://opencv.willowgarage.com/wiki/CodeBlocks&lt;br /&gt;
&lt;br /&gt;
Afin que chacun puisse installer sa librairie openCv où bon lui semble, nous avons décidé de configurer chacun notre CodeBlocks. La démarche suivie est la suivante :&lt;br /&gt;
&lt;br /&gt;
* Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot; &lt;br /&gt;
* Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
* Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de notre openCv recompilé&lt;br /&gt;
* Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de notre openCv recompilé&lt;br /&gt;
* Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies .dll.a contenues dans le dossier lib.&lt;br /&gt;
* Inclure le dossier bin de notre openCv recompilé dans la variable système PATH (nécessite peut être un redemmarrage)&lt;br /&gt;
&lt;br /&gt;
Après ces étapes nous pouvons inclure les librairies openCV dans n&#039;importe quel projet Codeblocks.&lt;br /&gt;
&lt;br /&gt;
=== La bibliothèque Qt ===&lt;br /&gt;
&lt;br /&gt;
=== Installation de QT ===&lt;br /&gt;
&lt;br /&gt;
Installer QT : &lt;br /&gt;
* Télécharger Qt 5.0.1(MinGW 4.7) ou une version compatible avec MinGW 4.7 depuis le site [http://qt-project.org/downloads qt-project]&lt;br /&gt;
* Installer QT depuis l’exécutable téléchargé. &lt;br /&gt;
&lt;br /&gt;
Intégré QT à Codeblocks de la même manière qu&#039;OpenCV. C&#039;est à dire : &lt;br /&gt;
* Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot;&lt;br /&gt;
* Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
* Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/include)&lt;br /&gt;
* Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/lib)&lt;br /&gt;
* Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies a contenues dans le dossier lib.&lt;br /&gt;
&lt;br /&gt;
== Utilisation de QT ==&lt;br /&gt;
&lt;br /&gt;
Les inclusions de bibliothèque se fond en précisant le bon chemin, par exemple pour : &lt;br /&gt;
 QLabel : #include &amp;lt;QtWidgets/QLabel&amp;gt; &lt;br /&gt;
 QWidget : #include &amp;lt;QtWidgets/QWidget&amp;gt;&lt;br /&gt;
 QPixmap : #include &amp;lt;QtGui/QPixmap&amp;gt;&lt;br /&gt;
etc...&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne les signaux et les slots, propre a QT. Une manipulation est nécessaire à leurs bon fonctionnement. &lt;br /&gt;
Comprendre leurs fonctionnement sur [http://www.siteduzero.com/informatique/tutoriels/programmez-avec-le-langage-c/creer-ses-propres-signaux-et-slots le site du zéro par exemple] puis il est nécessaire de lancer une commande pour que le signal marche.&lt;br /&gt;
&lt;br /&gt;
Depuis la racine du projet exécutez la commande : &lt;br /&gt;
moc &amp;lt;chemin vers le .h comprenant le signal&amp;gt; -o &amp;lt;chemin vers les sources du cpp&amp;gt;\moc_&amp;lt;nom du .h&amp;gt;.cpp&lt;br /&gt;
&lt;br /&gt;
Par exempe un signal est contenu dans include avec le nom interface.h, le cpp correspondant se trouve dans src/interface.cpp&lt;br /&gt;
La ligne de commande nécessaire sera : &lt;br /&gt;
moc include/interface.h -o src/moc_interface.cpp&lt;br /&gt;
&lt;br /&gt;
Cette commande génére un fichier cpp qui rend le signal utilisable.&lt;br /&gt;
&lt;br /&gt;
=== Détection de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039;&lt;br /&gt;
* [http://opencv.willowgarage.com/wiki/FaceDetection Tutoriel pour la détection de visage par OpenCV]&lt;br /&gt;
* [http://www.cs.princeton.edu/courses/archive/fall08/cos429/CourseMaterials/Precept1/facedetect.pdf Tutoriel pour la détection de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après nous être inspirés de ces tutoriels, voici comment la détection de visages est implémentée dans notre projet :&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Déclaration des variables&amp;lt;/span&amp;gt;&lt;br /&gt;
    char Filexml[]=&amp;quot;haarcascade_frontalface_alt.xml&amp;quot;;&lt;br /&gt;
    CvHaarClassifierCascade* cascade = 0;&lt;br /&gt;
    IplImage* frame = 0;&lt;br /&gt;
    struct stat buf;&lt;br /&gt;
    int statResult = stat(Filexml,&amp;amp;buf);&lt;br /&gt;
    char s[] = &amp;quot;picture.jpg&amp;quot;;&lt;br /&gt;
    int nbFrame = 0;&lt;br /&gt;
    CvCapture* capture;&lt;br /&gt;
    IplImage *subImg;&lt;br /&gt;
    CvSeq *faceRectSeq;&lt;br /&gt;
    CvMemStorage *storage = cvCreateMemStorage(0);&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Teste si le fichier d&#039;entrée est bien chargé&amp;lt;/span&amp;gt;&lt;br /&gt;
    if (statResult ||buf.st_ino&amp;lt;0) {&lt;br /&gt;
        printf(&amp;quot;xml non trouvé&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un nouveau Haar classifier :&lt;br /&gt;
        // Crée des classes permettant d&#039;identifier des objets dans des rectangles d&#039;images&lt;br /&gt;
        // Le système s&#039;entraine sur les images du fichier xml&amp;lt;/span&amp;gt;&lt;br /&gt;
        cascade = (CvHaarClassifierCascade*) cvLoad(Filexml);&lt;br /&gt;
    }&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des visages en continue, à partir de la webcam&amp;lt;/span&amp;gt;&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Capture de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        capture = cvCaptureFromCAM(1);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un IplImage à partir de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        frame = cvQueryFrame(capture);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée une fenêtre pour afficher les visages détectés&amp;lt;/span&amp;gt;&lt;br /&gt;
        cvNamedWindow(&amp;quot;Sample Program&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        cvNamedWindow(&amp;quot;Visage&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des objets dans l&#039;image de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        faceRectSeq = cvHaarDetectObjects(frame,cascade,storage,1.2, 3,CV_HAAR_DO_CANNY_PRUNING,cvSize(50,50));&lt;br /&gt;
        CvRect *r;&lt;br /&gt;
        for ( int i = 0; i &amp;lt; (faceRectSeq? faceRectSeq-&amp;gt;total:0); i++ )&lt;br /&gt;
        {&lt;br /&gt;
            r = (CvRect*)cvGetSeqElem(faceRectSeq,i);&lt;br /&gt;
            CvPoint p1 = { r-&amp;gt;x, r-&amp;gt;y };&lt;br /&gt;
            CvPoint p2 = { r-&amp;gt;x + r-&amp;gt;width, r-&amp;gt;y + r-&amp;gt;height };&lt;br /&gt;
            cvRectangle(frame,p1,p2,CV_RGB(0,255,0),1,4,0);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupération de l&#039;image à l&#039;interieur du rectangle r&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvSetImageROI(frame, *r);&lt;br /&gt;
            subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
            cvCopy(frame, subImg, NULL);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// On enregistre l&#039;image du visage&amp;lt;/span&amp;gt;&lt;br /&gt;
            saveTrainImg(frame, subImg, nbFrame);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Affiche l&#039;image dans le rectangle, et l&#039;image de la caméra dans son intégralité&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvShowImage(&amp;quot;Visage&amp;quot;, subImg);&lt;br /&gt;
            cvResetImageROI(frame);&lt;br /&gt;
            cvShowImage(&amp;quot;Sample Program&amp;quot;, frame);&lt;br /&gt;
        }&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Fermeture de l&#039;application sur commande Echap&amp;lt;/span&amp;gt;&lt;br /&gt;
        int c = cvWaitKey(10);&lt;br /&gt;
        if( (char)c == 27 )&lt;br /&gt;
        {&lt;br /&gt;
            cvSaveImage(s, frame);&lt;br /&gt;
            exit(0);&lt;br /&gt;
        }&lt;br /&gt;
        nbFrame++;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Traitement des images ===&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Copie l&#039;image source &#039;&#039;frame&#039;&#039; dans &#039;&#039;subImg&#039;&#039; pour traitement&amp;lt;/span&amp;gt;&lt;br /&gt;
  subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
  cvCopy(frame, subImg, NULL);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le nom de fichier pour l&#039;enregistrement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  string Result;&lt;br /&gt;
  ostringstream convert;&lt;br /&gt;
  ostringstream convertIdPersonne;&lt;br /&gt;
  convert &amp;lt;&amp;lt; nbFrame;&lt;br /&gt;
  convertIdPersonne &amp;lt;&amp;lt;idPersonne;&lt;br /&gt;
  Result = &amp;quot;imgResizedGray\\picture&amp;quot;+convertIdPersonne.str()+&amp;quot;&amp;quot;+convert.str()+&amp;quot;.jpg&amp;quot;;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variables nécessaires au traitement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dst = cvCreateImage(cvSize(400, 400),subImg-&amp;gt;depth,3)&lt;br /&gt;
  IplImage *dstGray = cvCreateImage(cvSize(400, 400),dst-&amp;gt;depth,1);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Redimensionne l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvResize(subImg,dst, CV_INTER_LINEAR );&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Convertie en matrice et en niveaux de gris&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvCvtColor(dst, dstGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Enregistre l&#039;image retraitée&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvSaveImage(Result.c_str(), dstGray);&lt;br /&gt;
  return Result;&lt;br /&gt;
&lt;br /&gt;
=== Identification de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039; [http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html Tutoriel pour la reconnaissance de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
L&#039;identification de visage consiste à reconnaitre un utilisateur dans un ensemble de visages connu. Plusieurs algorithmes existent pour comparer un visage à un autre : Eigenfaces, Fisherfaces, Local Binary Patterns Histograms,...&lt;br /&gt;
&lt;br /&gt;
Dans notre solution, nous utilisons la technique Fisherfaces. Il faut générer un modèle, permettant de lier chaque identité à un set d&#039;images lui correspondant. A la phase d&#039;identification, l&#039;image test (visage) sera comparée avec ce modèle. On va sélectionner le visage le plus proche du visage test, selon un certain calcul de distance. Il est possible d&#039;améliorer les résultats en jouant sur le seuil d&#039;acceptation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Création du modèle &#039;&#039;&#039;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteurs permettant de stocker l&#039;ensemble des images et des noms des utilisateurs pour le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Mat&amp;gt; images;&lt;br /&gt;
  vector&amp;lt;int&amp;gt; labels;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Va chercher les données dans notre fichier de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Personne&amp;gt; personnes = collection-&amp;gt;getPersonnes();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteur contenant les images de notre système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Image&amp;gt; imageRefs;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Parcours de l&#039;ensemble des personnes du système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  Personne personne;&lt;br /&gt;
  for(int i=0;i&amp;lt;(int)personnes.size();i++){&lt;br /&gt;
     personne = personnes[i];&lt;br /&gt;
     imageRefs = personne.getImageReferences();&lt;br /&gt;
     for(int j=0;j&amp;lt;(int)imageRefs.size();j++){&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupère l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
        IplImage* src = cvLoadImage(imageRefs[j].getChemin().c_str(), CV_LOAD_IMAGE_GRAYSCALE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Transforme l&#039;image en matrice&amp;lt;/span&amp;gt;&lt;br /&gt;
        Mat matDst=src;&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Stocke l&#039;image dans le vecteur &#039;&#039;images&#039;&#039; et la lie à l&#039;identité dans le vecteur &#039;&#039;labels&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
        images.push_back(matDst); labels.push_back(personne.getId());&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le modèle avec la technique Fisherfaces&amp;lt;/span&amp;gt;&lt;br /&gt;
  Ptr&amp;lt;FaceRecognizer&amp;gt; model =  createFisherFaceRecognizer();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Entraine/génère le modèle en fonction des vecteurs créés&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;train(images, labels);&lt;br /&gt;
  return model;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Identification du visage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Formatage de l&#039;image du visage test&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dstTest = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,3);&lt;br /&gt;
  IplImage *dstTestGray = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,1);&lt;br /&gt;
  cvResize(subImg,dstTest, CV_INTER_LINEAR );&lt;br /&gt;
  cvCvtColor(dstTest, dstTestGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Création de la matrice de l&#039;image de visage test pour comparaison avec le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  Mat matTest=dstTestGray;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variable stockant la confiance accordée au résultat&amp;lt;/span&amp;gt;&lt;br /&gt;
  double confidence = -1.0;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Identité résultat prédite&amp;lt;/span&amp;gt;&lt;br /&gt;
  int predicted = -1;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Demande la prédiction à partir du modèle cv::FaceRecognizer:&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;predict(matTest, predicted, confidence);&lt;br /&gt;
&lt;br /&gt;
=== Persistance des données ===&lt;br /&gt;
Pour réaliser un système de reconnaissance faciale, il faut mettre en place une base des utilisateurs. Lorsqu&#039;une personne souhaitera être authentifiée (ou identifiée), la comparaison sera faite avec les individus présents dans cette base. Pour chaque individu, nous lui associons une liste d&#039;images, captures de son visage. Le système de reconnaissance d&#039;OpenCV fonctionnant directement avec des images, nous les stockons directement en format JPG dans un dossier &amp;quot;imgResizedGray&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Format de données ====&lt;br /&gt;
Les données sont stockées en XML (fichier Personnes.xml dans le dossier data). Pour chaque personne, nous enregistrons son nom, prénom, un identifiant unique (généré automatiquement), et une liste d&#039;images associées (date + chemin). Voici un exemple de fichier:&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;ListePersonnes&amp;gt;&lt;br /&gt;
    &amp;lt;Personne&amp;gt;&lt;br /&gt;
        &amp;lt;Nom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Mercier&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Nom&amp;gt;&lt;br /&gt;
        &amp;lt;Prenom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Jean-Francois&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Prenom&amp;gt;&lt;br /&gt;
        &amp;lt;Id&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        1&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois2.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
    &amp;lt;/Personne&amp;gt;&lt;br /&gt;
 &amp;lt;/ListePersonnes&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
Une fois parsées, les données sont en mémoire dans la classe &amp;quot;Connexion&amp;quot;. Les modifications des données effectuées dans cette structure sont enregistrée en même temps dans le fichier xml.&lt;br /&gt;
&lt;br /&gt;
==== Librairie utilisée ====&lt;br /&gt;
La librairie utilisée pour parser le fichier xml est tinyXML. L&#039;import de la librairie est très simple puisque ce sont des classes C++ à ajouter dans le projet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;tinystr.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxml.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlerror.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlparser.cpp&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La documentation est disponible [http://www.grinninglizard.com/tinyxml/ ici].&lt;br /&gt;
Quelques éléments sur le fonctionnement de la librairie:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Chargement d&#039;un fichier XML :&amp;lt;/li&amp;gt; &lt;br /&gt;
 TiXmlDocument doc = TiXmlDocument(xmlFile);&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise fille (dans ce cas c&#039;est &amp;lt;ListePersonnes&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlHandle hdl(&amp;amp;doc);&lt;br /&gt;
 TiXmlElement *elem1 = hdl.FirstChildElement(&amp;quot;ListePersonnes&amp;quot;).Element();&lt;br /&gt;
 //Si l&#039;élément cherché est non trouvé&lt;br /&gt;
 if(!elem1) return false;&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise soeur (on passe de &amp;lt;Nom&amp;gt; à &amp;lt;Prenom&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlElement *elem1=elem1-&amp;gt;NextSiblingElement(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
&amp;lt;li&amp;gt; Modification du fichier XML (ajout d&#039;une balise fille &amp;lt;Personne&amp;gt; ainsi que ses balises filles &amp;lt;Nom&amp;gt;, &amp;lt;Prenom&amp;gt;, &amp;lt;Id&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 TiXmlText* newText;&lt;br /&gt;
 TiXmlElement new_personne(&amp;quot;Personne&amp;quot;);&lt;br /&gt;
 TiXmlElement new_nom(&amp;quot;Nom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_prenom(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_id(&amp;quot;Id&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 //Récupération des informations de la personne&lt;br /&gt;
 newText = new TiXmlText(firstName.c_str());&lt;br /&gt;
 new_nom.InsertEndChild(*newText);&lt;br /&gt;
 newText = new TiXmlText(lastName.c_str());&lt;br /&gt;
 new_prenom.InsertEndChild(*newText);&lt;br /&gt;
 oss &amp;lt;&amp;lt;id;&lt;br /&gt;
 newText = new TiXmlText(oss.str().c_str());&lt;br /&gt;
 new_id.InsertEndChild(*newText);&lt;br /&gt;
 &lt;br /&gt;
 //Création des balises filles de &amp;lt;Personne&amp;gt;&lt;br /&gt;
 new_personne.InsertEndChild(new_nom);&lt;br /&gt;
 new_personne.InsertEndChild(new_prenom);&lt;br /&gt;
 new_personne.InsertEndChild(new_id);&lt;br /&gt;
 &lt;br /&gt;
 //Création de la balise fille &amp;lt;Personne&amp;gt;&lt;br /&gt;
 elem1-&amp;gt;InsertEndChild(new_personne);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Sauvegarde du fichier XML :&amp;lt;/li&amp;gt;&lt;br /&gt;
 doc.SaveFile(xmlFile);&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10177</id>
		<title>PAGE WIKI ETUDIANTS 2012-13 RECONNAISSANCE FACIALE</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10177"/>
		<updated>2013-03-22T09:47:46Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Utilisation de QT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description du projet==&lt;br /&gt;
Le principe est de permettre d&#039;identifier un utilisateur. Le système dispose d&#039;une base de données contenant l&#039;ensemble des utilisateurs connus et leur visage. Le système doit reconnaitre l&#039;utilisateur test dans la base de données.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scénario type :&#039;&#039;&#039; Une personne se présente au système. Le système détecte son visage et analyse la situation. Il répond alors de 2 manières possibles :&lt;br /&gt;
* La personne est vraisemblablement Monsieur X&lt;br /&gt;
* La personne n&#039;est pas dans la base de données&lt;br /&gt;
&lt;br /&gt;
==Composition de l&#039;équipe==&lt;br /&gt;
&#039;&#039;&#039;Chef de projet :&#039;&#039;&#039; Camille OSWALD&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Equipiers :&#039;&#039;&#039;&lt;br /&gt;
* Marie CHEVALLIER&lt;br /&gt;
* Fabien ELOY&lt;br /&gt;
* Christopher GNATTO&lt;br /&gt;
* Maxence RAOUX&lt;br /&gt;
* Sylvain VIGIER&lt;br /&gt;
* Clément WIRTH&lt;br /&gt;
&lt;br /&gt;
==Gestion du projet==&lt;br /&gt;
&lt;br /&gt;
 {|class=&amp;quot;wikitable organisation Bio-Face&amp;quot;&lt;br /&gt;
 |+ Grands temps de développement du projet&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Apprentissage&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Détection&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Technologie&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Sous-équipe&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Etat&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Base de données&lt;br /&gt;
 | X&lt;br /&gt;
 | -&lt;br /&gt;
 | TinyXml&lt;br /&gt;
 | Fabien &amp;amp; Christopher &amp;amp; Sylvain&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Acquisition de données&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Sylvain &amp;amp; Christopher&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Détection de visages&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Maxence &amp;amp; Camille &amp;amp; Clément&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Authentification&lt;br /&gt;
 | -&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Camille&lt;br /&gt;
 | A tester&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Documentation&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Wiki air&lt;br /&gt;
 | Marie&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Interface&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Maxence &amp;amp; Clément&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Synchro. Interface-Auth.&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Camille &amp;amp; Christopher &amp;amp; Sylvain &amp;amp; Fabien&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Technologies et matériel utilisés===&lt;br /&gt;
* C++&lt;br /&gt;
* librairies et frameworks : [http://opencv.org/ OpenCV], [http://qt-project.org/ Qt Project], [http://www.grinninglizard.com/tinyxml/ TinyXml]&lt;br /&gt;
* webcam&lt;br /&gt;
&lt;br /&gt;
===Chronologie de développement===&lt;br /&gt;
# Détection avec quelques images en base&lt;br /&gt;
#* Nous commençons par élaborer un modèle avec une petite base pour nous permettre de faire des tests. Nous agrandirons la base pour davantage de tests par la suite.&lt;br /&gt;
#* L&#039;acquisition des données de la webcam est très facilement gérée par OpenCV&lt;br /&gt;
#* La détection de visage se base sur la méthode de [http://fr.wikipedia.org/wiki/M%C3%A9thode_de_Viola_et_Jones Viola et Jones], aussi géré par OpenCV&lt;br /&gt;
#* Se focaliser sur la phase critique : l&#039;identification de visages&lt;br /&gt;
# Gérer la phase d&#039;apprentissage du système&amp;lt;br&amp;gt;&lt;br /&gt;
# optimiser le système (statistiques, réglage du seuil,…)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fonctionnement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la librairie OpenCv ===&lt;br /&gt;
&lt;br /&gt;
Comme ce projet nécéssitait l&#039;utilisation d&#039;une kinect, nous avions décidé de développer sous Windows.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc tout d&#039;abord essayé d&#039;utiliser Visual Studio pour développer notre projet. Par la suite, nous avons choisi de passer par un autre éditeur : Codeblocks.&lt;br /&gt;
&lt;br /&gt;
1) Utilisation de Visual Studio (2012)&lt;br /&gt;
&lt;br /&gt;
Après avoir réussi à inclure les librairies dans notre code, nous avons rencontrés les problèmes suivants : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problèmes rencontrés :&lt;br /&gt;
* Difficulté de comprendre le fonctionnement du compilateur de visual studio, notamment lorsqu&#039;il faut ajouter de nouveaux fichiers&lt;br /&gt;
* Problème lors du fonctionnement des objets utilisés par opencv (Exception au lancement, ou détection des visages non effectuées) pour certaines machines.&lt;br /&gt;
* La librairie devait se trouver sur au même endroit pour toutes les machines&lt;br /&gt;
&lt;br /&gt;
2) Utilisation de Code Blocks&lt;br /&gt;
&lt;br /&gt;
Pour une meilleure compréhension et un projet fonctionnant sur des machines différentes avec des librairies qui ne sont pas installées aux mêmes endroits, nous avons choisi de porter le projet sur codeblocks.&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, nous avons utilisé Codeblocks 12.11 avec MinGW inclu (version 4.7.1).&lt;br /&gt;
&lt;br /&gt;
==== Compilation de la librairie OpenCv ====&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;éviter les problèmes d&#039;utilisation de la librairie, il était nécessaire de recompiler la librairie avec le même compilateur que nous utilisons pour notre projet (ici MinGW fourni avec CodeBlocks).&lt;br /&gt;
&lt;br /&gt;
Pour compiler la librairie, nous avons utilisé l&#039;utilitaire Cmake.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de configurations de Cmake étant déjà fourni avec opencv (fichiers CMakeLists.txt), son utilisation devient très simple. Nous avons suivi le tutoriel ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Lancement de Cmake-gui&lt;br /&gt;
* Dans le champs Source Code, spécifier le chemin de la librairie openCv (exemple : C:\opencv-2.4.3)&lt;br /&gt;
* Dans le champs build, mettre le chemin ou la librairie compilée sera enregistrée (exemple : C:\openCV-build)&lt;br /&gt;
* Cliquer ensuite sur configure (créer le nouveau dossier)&lt;br /&gt;
* Spécification du générateur : MinGW Makefiles&lt;br /&gt;
* Sélectionner &amp;quot;Specify native compilers&amp;quot;&lt;br /&gt;
* Définir le compilateur C (ex : C:/Program Files/CodeBlocks/MinGW/bin/gcc.exe)&lt;br /&gt;
* Définir le compilateur C++ (ex: C:/Program Files/CodeBlocks/MinGW/bin/g++.exe)&lt;br /&gt;
* Cliquer sur Finish&lt;br /&gt;
* Cliquer sur generate&lt;br /&gt;
* Fermer Cmake&lt;br /&gt;
* Ouvrir une fenêtre de commande et aller dans le dossier que vous avez spécifié dans le champs build (ici : C:\openCV-build)&lt;br /&gt;
* Executer &amp;quot;ming32-make&amp;quot; (prend du temps et nécessite peut être d&#039;avoir le répertoire bin de MinGW dans le PATH)&lt;br /&gt;
* Enfin executer &amp;quot;mingw32-make install&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Configuration de codeblocks ====&lt;br /&gt;
&lt;br /&gt;
Pour configurer codeblocks, nous avons suivi ce tutoriel : http://opencv.willowgarage.com/wiki/CodeBlocks&lt;br /&gt;
&lt;br /&gt;
Afin que chacun puisse installer sa librairie openCv où bon lui semble, nous avons décidé de configurer chacun notre CodeBlocks. La démarche suivie est la suivante :&lt;br /&gt;
&lt;br /&gt;
* Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot; &lt;br /&gt;
* Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
* Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de notre openCv recompilé&lt;br /&gt;
* Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de notre openCv recompilé&lt;br /&gt;
* Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies .dll.a contenues dans le dossier lib.&lt;br /&gt;
* Inclure le dossier bin de notre openCv recompilé dans la variable système PATH (nécessite peut être un redemmarrage)&lt;br /&gt;
&lt;br /&gt;
Après ces étapes nous pouvons inclure les librairies openCV dans n&#039;importe quel projet Codeblocks.&lt;br /&gt;
&lt;br /&gt;
=== La bibliothèque Qt ===&lt;br /&gt;
&lt;br /&gt;
== Installation de QT ==&lt;br /&gt;
&lt;br /&gt;
Installer QT : &lt;br /&gt;
* Télécharger Qt 5.0.1(MinGW 4.7) ou une version compatible avec MinGW 4.7 depuis le site [http://qt-project.org/downloads qt-project]&lt;br /&gt;
* Installer QT depuis l’exécutable téléchargé. &lt;br /&gt;
&lt;br /&gt;
Intégré QT à Codeblocks de la même manière qu&#039;OpenCV. C&#039;est à dire : &lt;br /&gt;
* Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot;&lt;br /&gt;
* Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
* Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/include)&lt;br /&gt;
* Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/lib)&lt;br /&gt;
* Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies a contenues dans le dossier lib.&lt;br /&gt;
&lt;br /&gt;
== Utilisation de QT ==&lt;br /&gt;
&lt;br /&gt;
Les inclusions de bibliothèque se fond en précisant le bon chemin, par exemple pour : &lt;br /&gt;
 QLabel : #include &amp;lt;QtWidgets/QLabel&amp;gt; &lt;br /&gt;
 QWidget : #include &amp;lt;QtWidgets/QWidget&amp;gt;&lt;br /&gt;
 QPixmap : #include &amp;lt;QtGui/QPixmap&amp;gt;&lt;br /&gt;
etc...&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne les signaux et les slots, propre a QT. Une manipulation est nécessaire à leurs bon fonctionnement. &lt;br /&gt;
Comprendre leurs fonctionnement sur [http://www.siteduzero.com/informatique/tutoriels/programmez-avec-le-langage-c/creer-ses-propres-signaux-et-slots le site du zéro par exemple] puis il est nécessaire de lancer une commande pour que le signal marche.&lt;br /&gt;
&lt;br /&gt;
Depuis la racine du projet exécutez la commande : &lt;br /&gt;
moc &amp;lt;chemin vers le .h comprenant le signal&amp;gt; -o &amp;lt;chemin vers les sources du cpp&amp;gt;\moc_&amp;lt;nom du .h&amp;gt;.cpp&lt;br /&gt;
&lt;br /&gt;
Par exempe un signal est contenu dans include avec le nom interface.h, le cpp correspondant se trouve dans src/interface.cpp&lt;br /&gt;
La ligne de commande nécessaire sera : &lt;br /&gt;
moc include/interface.h -o src/moc_interface.cpp&lt;br /&gt;
&lt;br /&gt;
Cette commande génére un fichier cpp qui rend le signal utilisable.&lt;br /&gt;
&lt;br /&gt;
=== Détection de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039;&lt;br /&gt;
* [http://opencv.willowgarage.com/wiki/FaceDetection Tutoriel pour la détection de visage par OpenCV]&lt;br /&gt;
* [http://www.cs.princeton.edu/courses/archive/fall08/cos429/CourseMaterials/Precept1/facedetect.pdf Tutoriel pour la détection de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après nous être inspirés de ces tutoriels, voici comment la détection de visages est implémentée dans notre projet :&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Déclaration des variables&amp;lt;/span&amp;gt;&lt;br /&gt;
    char Filexml[]=&amp;quot;haarcascade_frontalface_alt.xml&amp;quot;;&lt;br /&gt;
    CvHaarClassifierCascade* cascade = 0;&lt;br /&gt;
    IplImage* frame = 0;&lt;br /&gt;
    struct stat buf;&lt;br /&gt;
    int statResult = stat(Filexml,&amp;amp;buf);&lt;br /&gt;
    char s[] = &amp;quot;picture.jpg&amp;quot;;&lt;br /&gt;
    int nbFrame = 0;&lt;br /&gt;
    CvCapture* capture;&lt;br /&gt;
    IplImage *subImg;&lt;br /&gt;
    CvSeq *faceRectSeq;&lt;br /&gt;
    CvMemStorage *storage = cvCreateMemStorage(0);&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Teste si le fichier d&#039;entrée est bien chargé&amp;lt;/span&amp;gt;&lt;br /&gt;
    if (statResult ||buf.st_ino&amp;lt;0) {&lt;br /&gt;
        printf(&amp;quot;xml non trouvé&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un nouveau Haar classifier :&lt;br /&gt;
        // Crée des classes permettant d&#039;identifier des objets dans des rectangles d&#039;images&lt;br /&gt;
        // Le système s&#039;entraine sur les images du fichier xml&amp;lt;/span&amp;gt;&lt;br /&gt;
        cascade = (CvHaarClassifierCascade*) cvLoad(Filexml);&lt;br /&gt;
    }&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des visages en continue, à partir de la webcam&amp;lt;/span&amp;gt;&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Capture de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        capture = cvCaptureFromCAM(1);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un IplImage à partir de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        frame = cvQueryFrame(capture);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée une fenêtre pour afficher les visages détectés&amp;lt;/span&amp;gt;&lt;br /&gt;
        cvNamedWindow(&amp;quot;Sample Program&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        cvNamedWindow(&amp;quot;Visage&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des objets dans l&#039;image de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        faceRectSeq = cvHaarDetectObjects(frame,cascade,storage,1.2, 3,CV_HAAR_DO_CANNY_PRUNING,cvSize(50,50));&lt;br /&gt;
        CvRect *r;&lt;br /&gt;
        for ( int i = 0; i &amp;lt; (faceRectSeq? faceRectSeq-&amp;gt;total:0); i++ )&lt;br /&gt;
        {&lt;br /&gt;
            r = (CvRect*)cvGetSeqElem(faceRectSeq,i);&lt;br /&gt;
            CvPoint p1 = { r-&amp;gt;x, r-&amp;gt;y };&lt;br /&gt;
            CvPoint p2 = { r-&amp;gt;x + r-&amp;gt;width, r-&amp;gt;y + r-&amp;gt;height };&lt;br /&gt;
            cvRectangle(frame,p1,p2,CV_RGB(0,255,0),1,4,0);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupération de l&#039;image à l&#039;interieur du rectangle r&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvSetImageROI(frame, *r);&lt;br /&gt;
            subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
            cvCopy(frame, subImg, NULL);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// On enregistre l&#039;image du visage&amp;lt;/span&amp;gt;&lt;br /&gt;
            saveTrainImg(frame, subImg, nbFrame);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Affiche l&#039;image dans le rectangle, et l&#039;image de la caméra dans son intégralité&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvShowImage(&amp;quot;Visage&amp;quot;, subImg);&lt;br /&gt;
            cvResetImageROI(frame);&lt;br /&gt;
            cvShowImage(&amp;quot;Sample Program&amp;quot;, frame);&lt;br /&gt;
        }&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Fermeture de l&#039;application sur commande Echap&amp;lt;/span&amp;gt;&lt;br /&gt;
        int c = cvWaitKey(10);&lt;br /&gt;
        if( (char)c == 27 )&lt;br /&gt;
        {&lt;br /&gt;
            cvSaveImage(s, frame);&lt;br /&gt;
            exit(0);&lt;br /&gt;
        }&lt;br /&gt;
        nbFrame++;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Traitement des images ===&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Copie l&#039;image source &#039;&#039;frame&#039;&#039; dans &#039;&#039;subImg&#039;&#039; pour traitement&amp;lt;/span&amp;gt;&lt;br /&gt;
  subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
  cvCopy(frame, subImg, NULL);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le nom de fichier pour l&#039;enregistrement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  string Result;&lt;br /&gt;
  ostringstream convert;&lt;br /&gt;
  ostringstream convertIdPersonne;&lt;br /&gt;
  convert &amp;lt;&amp;lt; nbFrame;&lt;br /&gt;
  convertIdPersonne &amp;lt;&amp;lt;idPersonne;&lt;br /&gt;
  Result = &amp;quot;imgResizedGray\\picture&amp;quot;+convertIdPersonne.str()+&amp;quot;&amp;quot;+convert.str()+&amp;quot;.jpg&amp;quot;;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variables nécessaires au traitement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dst = cvCreateImage(cvSize(400, 400),subImg-&amp;gt;depth,3)&lt;br /&gt;
  IplImage *dstGray = cvCreateImage(cvSize(400, 400),dst-&amp;gt;depth,1);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Redimensionne l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvResize(subImg,dst, CV_INTER_LINEAR );&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Convertie en matrice et en niveaux de gris&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvCvtColor(dst, dstGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Enregistre l&#039;image retraitée&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvSaveImage(Result.c_str(), dstGray);&lt;br /&gt;
  return Result;&lt;br /&gt;
&lt;br /&gt;
=== Identification de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039; [http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html Tutoriel pour la reconnaissance de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
L&#039;identification de visage consiste à reconnaitre un utilisateur dans un ensemble de visages connu. Plusieurs algorithmes existent pour comparer un visage à un autre : Eigenfaces, Fisherfaces, Local Binary Patterns Histograms,...&lt;br /&gt;
&lt;br /&gt;
Dans notre solution, nous utilisons la technique Fisherfaces. Il faut générer un modèle, permettant de lier chaque identité à un set d&#039;images lui correspondant. A la phase d&#039;identification, l&#039;image test (visage) sera comparée avec ce modèle. On va sélectionner le visage le plus proche du visage test, selon un certain calcul de distance. Il est possible d&#039;améliorer les résultats en jouant sur le seuil d&#039;acceptation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Création du modèle &#039;&#039;&#039;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteurs permettant de stocker l&#039;ensemble des images et des noms des utilisateurs pour le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Mat&amp;gt; images;&lt;br /&gt;
  vector&amp;lt;int&amp;gt; labels;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Va chercher les données dans notre fichier de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Personne&amp;gt; personnes = collection-&amp;gt;getPersonnes();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteur contenant les images de notre système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Image&amp;gt; imageRefs;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Parcours de l&#039;ensemble des personnes du système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  Personne personne;&lt;br /&gt;
  for(int i=0;i&amp;lt;(int)personnes.size();i++){&lt;br /&gt;
     personne = personnes[i];&lt;br /&gt;
     imageRefs = personne.getImageReferences();&lt;br /&gt;
     for(int j=0;j&amp;lt;(int)imageRefs.size();j++){&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupère l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
        IplImage* src = cvLoadImage(imageRefs[j].getChemin().c_str(), CV_LOAD_IMAGE_GRAYSCALE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Transforme l&#039;image en matrice&amp;lt;/span&amp;gt;&lt;br /&gt;
        Mat matDst=src;&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Stocke l&#039;image dans le vecteur &#039;&#039;images&#039;&#039; et la lie à l&#039;identité dans le vecteur &#039;&#039;labels&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
        images.push_back(matDst); labels.push_back(personne.getId());&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le modèle avec la technique Fisherfaces&amp;lt;/span&amp;gt;&lt;br /&gt;
  Ptr&amp;lt;FaceRecognizer&amp;gt; model =  createFisherFaceRecognizer();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Entraine/génère le modèle en fonction des vecteurs créés&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;train(images, labels);&lt;br /&gt;
  return model;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Identification du visage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Formatage de l&#039;image du visage test&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dstTest = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,3);&lt;br /&gt;
  IplImage *dstTestGray = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,1);&lt;br /&gt;
  cvResize(subImg,dstTest, CV_INTER_LINEAR );&lt;br /&gt;
  cvCvtColor(dstTest, dstTestGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Création de la matrice de l&#039;image de visage test pour comparaison avec le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  Mat matTest=dstTestGray;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variable stockant la confiance accordée au résultat&amp;lt;/span&amp;gt;&lt;br /&gt;
  double confidence = -1.0;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Identité résultat prédite&amp;lt;/span&amp;gt;&lt;br /&gt;
  int predicted = -1;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Demande la prédiction à partir du modèle cv::FaceRecognizer:&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;predict(matTest, predicted, confidence);&lt;br /&gt;
&lt;br /&gt;
=== Persistance des données ===&lt;br /&gt;
Pour réaliser un système de reconnaissance faciale, il faut mettre en place une base des utilisateurs. Lorsqu&#039;une personne souhaitera être authentifiée (ou identifiée), la comparaison sera faite avec les individus présents dans cette base. Pour chaque individu, nous lui associons une liste d&#039;images, captures de son visage. Le système de reconnaissance d&#039;OpenCV fonctionnant directement avec des images, nous les stockons directement en format JPG dans un dossier &amp;quot;imgResizedGray&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Format de données ====&lt;br /&gt;
Les données sont stockées en XML (fichier Personnes.xml dans le dossier data). Pour chaque personne, nous enregistrons son nom, prénom, un identifiant unique (généré automatiquement), et une liste d&#039;images associées (date + chemin). Voici un exemple de fichier:&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;ListePersonnes&amp;gt;&lt;br /&gt;
    &amp;lt;Personne&amp;gt;&lt;br /&gt;
        &amp;lt;Nom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Mercier&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Nom&amp;gt;&lt;br /&gt;
        &amp;lt;Prenom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Jean-Francois&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Prenom&amp;gt;&lt;br /&gt;
        &amp;lt;Id&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        1&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois2.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
    &amp;lt;/Personne&amp;gt;&lt;br /&gt;
 &amp;lt;/ListePersonnes&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
Une fois parsées, les données sont en mémoire dans la classe &amp;quot;Connexion&amp;quot;. Les modifications des données effectuées dans cette structure sont enregistrée en même temps dans le fichier xml.&lt;br /&gt;
&lt;br /&gt;
==== Librairie utilisée ====&lt;br /&gt;
La librairie utilisée pour parser le fichier xml est tinyXML. L&#039;import de la librairie est très simple puisque ce sont des classes C++ à ajouter dans le projet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;tinystr.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxml.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlerror.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlparser.cpp&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La documentation est disponible [http://www.grinninglizard.com/tinyxml/ ici].&lt;br /&gt;
Quelques éléments sur le fonctionnement de la librairie:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Chargement d&#039;un fichier XML :&amp;lt;/li&amp;gt; &lt;br /&gt;
 TiXmlDocument doc = TiXmlDocument(xmlFile);&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise fille (dans ce cas c&#039;est &amp;lt;ListePersonnes&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlHandle hdl(&amp;amp;doc);&lt;br /&gt;
 TiXmlElement *elem1 = hdl.FirstChildElement(&amp;quot;ListePersonnes&amp;quot;).Element();&lt;br /&gt;
 //Si l&#039;élément cherché est non trouvé&lt;br /&gt;
 if(!elem1) return false;&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise soeur (on passe de &amp;lt;Nom&amp;gt; à &amp;lt;Prenom&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlElement *elem1=elem1-&amp;gt;NextSiblingElement(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
&amp;lt;li&amp;gt; Modification du fichier XML (ajout d&#039;une balise fille &amp;lt;Personne&amp;gt; ainsi que ses balises filles &amp;lt;Nom&amp;gt;, &amp;lt;Prenom&amp;gt;, &amp;lt;Id&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 TiXmlText* newText;&lt;br /&gt;
 TiXmlElement new_personne(&amp;quot;Personne&amp;quot;);&lt;br /&gt;
 TiXmlElement new_nom(&amp;quot;Nom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_prenom(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_id(&amp;quot;Id&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 //Récupération des informations de la personne&lt;br /&gt;
 newText = new TiXmlText(firstName.c_str());&lt;br /&gt;
 new_nom.InsertEndChild(*newText);&lt;br /&gt;
 newText = new TiXmlText(lastName.c_str());&lt;br /&gt;
 new_prenom.InsertEndChild(*newText);&lt;br /&gt;
 oss &amp;lt;&amp;lt;id;&lt;br /&gt;
 newText = new TiXmlText(oss.str().c_str());&lt;br /&gt;
 new_id.InsertEndChild(*newText);&lt;br /&gt;
 &lt;br /&gt;
 //Création des balises filles de &amp;lt;Personne&amp;gt;&lt;br /&gt;
 new_personne.InsertEndChild(new_nom);&lt;br /&gt;
 new_personne.InsertEndChild(new_prenom);&lt;br /&gt;
 new_personne.InsertEndChild(new_id);&lt;br /&gt;
 &lt;br /&gt;
 //Création de la balise fille &amp;lt;Personne&amp;gt;&lt;br /&gt;
 elem1-&amp;gt;InsertEndChild(new_personne);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Sauvegarde du fichier XML :&amp;lt;/li&amp;gt;&lt;br /&gt;
 doc.SaveFile(xmlFile);&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10176</id>
		<title>PAGE WIKI ETUDIANTS 2012-13 RECONNAISSANCE FACIALE</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10176"/>
		<updated>2013-03-22T09:47:21Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Installation de QT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description du projet==&lt;br /&gt;
Le principe est de permettre d&#039;identifier un utilisateur. Le système dispose d&#039;une base de données contenant l&#039;ensemble des utilisateurs connus et leur visage. Le système doit reconnaitre l&#039;utilisateur test dans la base de données.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scénario type :&#039;&#039;&#039; Une personne se présente au système. Le système détecte son visage et analyse la situation. Il répond alors de 2 manières possibles :&lt;br /&gt;
* La personne est vraisemblablement Monsieur X&lt;br /&gt;
* La personne n&#039;est pas dans la base de données&lt;br /&gt;
&lt;br /&gt;
==Composition de l&#039;équipe==&lt;br /&gt;
&#039;&#039;&#039;Chef de projet :&#039;&#039;&#039; Camille OSWALD&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Equipiers :&#039;&#039;&#039;&lt;br /&gt;
* Marie CHEVALLIER&lt;br /&gt;
* Fabien ELOY&lt;br /&gt;
* Christopher GNATTO&lt;br /&gt;
* Maxence RAOUX&lt;br /&gt;
* Sylvain VIGIER&lt;br /&gt;
* Clément WIRTH&lt;br /&gt;
&lt;br /&gt;
==Gestion du projet==&lt;br /&gt;
&lt;br /&gt;
 {|class=&amp;quot;wikitable organisation Bio-Face&amp;quot;&lt;br /&gt;
 |+ Grands temps de développement du projet&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Apprentissage&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Détection&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Technologie&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Sous-équipe&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Etat&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Base de données&lt;br /&gt;
 | X&lt;br /&gt;
 | -&lt;br /&gt;
 | TinyXml&lt;br /&gt;
 | Fabien &amp;amp; Christopher &amp;amp; Sylvain&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Acquisition de données&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Sylvain &amp;amp; Christopher&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Détection de visages&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Maxence &amp;amp; Camille &amp;amp; Clément&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Authentification&lt;br /&gt;
 | -&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Camille&lt;br /&gt;
 | A tester&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Documentation&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Wiki air&lt;br /&gt;
 | Marie&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Interface&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Maxence &amp;amp; Clément&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Synchro. Interface-Auth.&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Camille &amp;amp; Christopher &amp;amp; Sylvain &amp;amp; Fabien&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Technologies et matériel utilisés===&lt;br /&gt;
* C++&lt;br /&gt;
* librairies et frameworks : [http://opencv.org/ OpenCV], [http://qt-project.org/ Qt Project], [http://www.grinninglizard.com/tinyxml/ TinyXml]&lt;br /&gt;
* webcam&lt;br /&gt;
&lt;br /&gt;
===Chronologie de développement===&lt;br /&gt;
# Détection avec quelques images en base&lt;br /&gt;
#* Nous commençons par élaborer un modèle avec une petite base pour nous permettre de faire des tests. Nous agrandirons la base pour davantage de tests par la suite.&lt;br /&gt;
#* L&#039;acquisition des données de la webcam est très facilement gérée par OpenCV&lt;br /&gt;
#* La détection de visage se base sur la méthode de [http://fr.wikipedia.org/wiki/M%C3%A9thode_de_Viola_et_Jones Viola et Jones], aussi géré par OpenCV&lt;br /&gt;
#* Se focaliser sur la phase critique : l&#039;identification de visages&lt;br /&gt;
# Gérer la phase d&#039;apprentissage du système&amp;lt;br&amp;gt;&lt;br /&gt;
# optimiser le système (statistiques, réglage du seuil,…)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fonctionnement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la librairie OpenCv ===&lt;br /&gt;
&lt;br /&gt;
Comme ce projet nécéssitait l&#039;utilisation d&#039;une kinect, nous avions décidé de développer sous Windows.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc tout d&#039;abord essayé d&#039;utiliser Visual Studio pour développer notre projet. Par la suite, nous avons choisi de passer par un autre éditeur : Codeblocks.&lt;br /&gt;
&lt;br /&gt;
1) Utilisation de Visual Studio (2012)&lt;br /&gt;
&lt;br /&gt;
Après avoir réussi à inclure les librairies dans notre code, nous avons rencontrés les problèmes suivants : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problèmes rencontrés :&lt;br /&gt;
* Difficulté de comprendre le fonctionnement du compilateur de visual studio, notamment lorsqu&#039;il faut ajouter de nouveaux fichiers&lt;br /&gt;
* Problème lors du fonctionnement des objets utilisés par opencv (Exception au lancement, ou détection des visages non effectuées) pour certaines machines.&lt;br /&gt;
* La librairie devait se trouver sur au même endroit pour toutes les machines&lt;br /&gt;
&lt;br /&gt;
2) Utilisation de Code Blocks&lt;br /&gt;
&lt;br /&gt;
Pour une meilleure compréhension et un projet fonctionnant sur des machines différentes avec des librairies qui ne sont pas installées aux mêmes endroits, nous avons choisi de porter le projet sur codeblocks.&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, nous avons utilisé Codeblocks 12.11 avec MinGW inclu (version 4.7.1).&lt;br /&gt;
&lt;br /&gt;
==== Compilation de la librairie OpenCv ====&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;éviter les problèmes d&#039;utilisation de la librairie, il était nécessaire de recompiler la librairie avec le même compilateur que nous utilisons pour notre projet (ici MinGW fourni avec CodeBlocks).&lt;br /&gt;
&lt;br /&gt;
Pour compiler la librairie, nous avons utilisé l&#039;utilitaire Cmake.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de configurations de Cmake étant déjà fourni avec opencv (fichiers CMakeLists.txt), son utilisation devient très simple. Nous avons suivi le tutoriel ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Lancement de Cmake-gui&lt;br /&gt;
* Dans le champs Source Code, spécifier le chemin de la librairie openCv (exemple : C:\opencv-2.4.3)&lt;br /&gt;
* Dans le champs build, mettre le chemin ou la librairie compilée sera enregistrée (exemple : C:\openCV-build)&lt;br /&gt;
* Cliquer ensuite sur configure (créer le nouveau dossier)&lt;br /&gt;
* Spécification du générateur : MinGW Makefiles&lt;br /&gt;
* Sélectionner &amp;quot;Specify native compilers&amp;quot;&lt;br /&gt;
* Définir le compilateur C (ex : C:/Program Files/CodeBlocks/MinGW/bin/gcc.exe)&lt;br /&gt;
* Définir le compilateur C++ (ex: C:/Program Files/CodeBlocks/MinGW/bin/g++.exe)&lt;br /&gt;
* Cliquer sur Finish&lt;br /&gt;
* Cliquer sur generate&lt;br /&gt;
* Fermer Cmake&lt;br /&gt;
* Ouvrir une fenêtre de commande et aller dans le dossier que vous avez spécifié dans le champs build (ici : C:\openCV-build)&lt;br /&gt;
* Executer &amp;quot;ming32-make&amp;quot; (prend du temps et nécessite peut être d&#039;avoir le répertoire bin de MinGW dans le PATH)&lt;br /&gt;
* Enfin executer &amp;quot;mingw32-make install&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Configuration de codeblocks ====&lt;br /&gt;
&lt;br /&gt;
Pour configurer codeblocks, nous avons suivi ce tutoriel : http://opencv.willowgarage.com/wiki/CodeBlocks&lt;br /&gt;
&lt;br /&gt;
Afin que chacun puisse installer sa librairie openCv où bon lui semble, nous avons décidé de configurer chacun notre CodeBlocks. La démarche suivie est la suivante :&lt;br /&gt;
&lt;br /&gt;
* Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot; &lt;br /&gt;
* Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
* Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de notre openCv recompilé&lt;br /&gt;
* Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de notre openCv recompilé&lt;br /&gt;
* Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies .dll.a contenues dans le dossier lib.&lt;br /&gt;
* Inclure le dossier bin de notre openCv recompilé dans la variable système PATH (nécessite peut être un redemmarrage)&lt;br /&gt;
&lt;br /&gt;
Après ces étapes nous pouvons inclure les librairies openCV dans n&#039;importe quel projet Codeblocks.&lt;br /&gt;
&lt;br /&gt;
=== La bibliothèque Qt ===&lt;br /&gt;
&lt;br /&gt;
== Installation de QT ==&lt;br /&gt;
&lt;br /&gt;
Installer QT : &lt;br /&gt;
* Télécharger Qt 5.0.1(MinGW 4.7) ou une version compatible avec MinGW 4.7 depuis le site [http://qt-project.org/downloads qt-project]&lt;br /&gt;
* Installer QT depuis l’exécutable téléchargé. &lt;br /&gt;
&lt;br /&gt;
Intégré QT à Codeblocks de la même manière qu&#039;OpenCV. C&#039;est à dire : &lt;br /&gt;
* Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot;&lt;br /&gt;
* Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
* Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/include)&lt;br /&gt;
* Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/lib)&lt;br /&gt;
* Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies a contenues dans le dossier lib.&lt;br /&gt;
&lt;br /&gt;
== Utilisation de QT ==&lt;br /&gt;
&lt;br /&gt;
Les inclusions de bibliothèque se fond en précisant le bon chemin, par exemple pour : &lt;br /&gt;
 * QLabel : #include &amp;lt;QtWidgets/QLabel&amp;gt; &lt;br /&gt;
 * QWidget : #include &amp;lt;QtWidgets/QWidget&amp;gt;&lt;br /&gt;
 * QPixmap : #include &amp;lt;QtGui/QPixmap&amp;gt;&lt;br /&gt;
etc...&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne les signaux et les slots, propre a QT. Une manipulation est nécessaire à leurs bon fonctionnement. &lt;br /&gt;
Comprendre leurs fonctionnement sur [http://www.siteduzero.com/informatique/tutoriels/programmez-avec-le-langage-c/creer-ses-propres-signaux-et-slots le site du zéro par exemple] puis il est nécessaire de lancer une commande pour que le signal marche.&lt;br /&gt;
&lt;br /&gt;
Depuis la racine du projet exécutez la commande : &lt;br /&gt;
moc &amp;lt;chemin vers le .h comprenant le signal&amp;gt; -o &amp;lt;chemin vers les sources du cpp&amp;gt;\moc_&amp;lt;nom du .h&amp;gt;.cpp&lt;br /&gt;
&lt;br /&gt;
Par exempe un signal est contenu dans include avec le nom interface.h, le cpp correspondant se trouve dans src/interface.cpp&lt;br /&gt;
La ligne de commande nécessaire sera : &lt;br /&gt;
moc include/interface.h -o src/moc_interface.cpp&lt;br /&gt;
&lt;br /&gt;
Cette commande génére un fichier cpp qui rend le signal utilisable.&lt;br /&gt;
&lt;br /&gt;
=== Détection de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039;&lt;br /&gt;
* [http://opencv.willowgarage.com/wiki/FaceDetection Tutoriel pour la détection de visage par OpenCV]&lt;br /&gt;
* [http://www.cs.princeton.edu/courses/archive/fall08/cos429/CourseMaterials/Precept1/facedetect.pdf Tutoriel pour la détection de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après nous être inspirés de ces tutoriels, voici comment la détection de visages est implémentée dans notre projet :&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Déclaration des variables&amp;lt;/span&amp;gt;&lt;br /&gt;
    char Filexml[]=&amp;quot;haarcascade_frontalface_alt.xml&amp;quot;;&lt;br /&gt;
    CvHaarClassifierCascade* cascade = 0;&lt;br /&gt;
    IplImage* frame = 0;&lt;br /&gt;
    struct stat buf;&lt;br /&gt;
    int statResult = stat(Filexml,&amp;amp;buf);&lt;br /&gt;
    char s[] = &amp;quot;picture.jpg&amp;quot;;&lt;br /&gt;
    int nbFrame = 0;&lt;br /&gt;
    CvCapture* capture;&lt;br /&gt;
    IplImage *subImg;&lt;br /&gt;
    CvSeq *faceRectSeq;&lt;br /&gt;
    CvMemStorage *storage = cvCreateMemStorage(0);&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Teste si le fichier d&#039;entrée est bien chargé&amp;lt;/span&amp;gt;&lt;br /&gt;
    if (statResult ||buf.st_ino&amp;lt;0) {&lt;br /&gt;
        printf(&amp;quot;xml non trouvé&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un nouveau Haar classifier :&lt;br /&gt;
        // Crée des classes permettant d&#039;identifier des objets dans des rectangles d&#039;images&lt;br /&gt;
        // Le système s&#039;entraine sur les images du fichier xml&amp;lt;/span&amp;gt;&lt;br /&gt;
        cascade = (CvHaarClassifierCascade*) cvLoad(Filexml);&lt;br /&gt;
    }&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des visages en continue, à partir de la webcam&amp;lt;/span&amp;gt;&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Capture de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        capture = cvCaptureFromCAM(1);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un IplImage à partir de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        frame = cvQueryFrame(capture);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée une fenêtre pour afficher les visages détectés&amp;lt;/span&amp;gt;&lt;br /&gt;
        cvNamedWindow(&amp;quot;Sample Program&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        cvNamedWindow(&amp;quot;Visage&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des objets dans l&#039;image de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        faceRectSeq = cvHaarDetectObjects(frame,cascade,storage,1.2, 3,CV_HAAR_DO_CANNY_PRUNING,cvSize(50,50));&lt;br /&gt;
        CvRect *r;&lt;br /&gt;
        for ( int i = 0; i &amp;lt; (faceRectSeq? faceRectSeq-&amp;gt;total:0); i++ )&lt;br /&gt;
        {&lt;br /&gt;
            r = (CvRect*)cvGetSeqElem(faceRectSeq,i);&lt;br /&gt;
            CvPoint p1 = { r-&amp;gt;x, r-&amp;gt;y };&lt;br /&gt;
            CvPoint p2 = { r-&amp;gt;x + r-&amp;gt;width, r-&amp;gt;y + r-&amp;gt;height };&lt;br /&gt;
            cvRectangle(frame,p1,p2,CV_RGB(0,255,0),1,4,0);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupération de l&#039;image à l&#039;interieur du rectangle r&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvSetImageROI(frame, *r);&lt;br /&gt;
            subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
            cvCopy(frame, subImg, NULL);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// On enregistre l&#039;image du visage&amp;lt;/span&amp;gt;&lt;br /&gt;
            saveTrainImg(frame, subImg, nbFrame);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Affiche l&#039;image dans le rectangle, et l&#039;image de la caméra dans son intégralité&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvShowImage(&amp;quot;Visage&amp;quot;, subImg);&lt;br /&gt;
            cvResetImageROI(frame);&lt;br /&gt;
            cvShowImage(&amp;quot;Sample Program&amp;quot;, frame);&lt;br /&gt;
        }&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Fermeture de l&#039;application sur commande Echap&amp;lt;/span&amp;gt;&lt;br /&gt;
        int c = cvWaitKey(10);&lt;br /&gt;
        if( (char)c == 27 )&lt;br /&gt;
        {&lt;br /&gt;
            cvSaveImage(s, frame);&lt;br /&gt;
            exit(0);&lt;br /&gt;
        }&lt;br /&gt;
        nbFrame++;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Traitement des images ===&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Copie l&#039;image source &#039;&#039;frame&#039;&#039; dans &#039;&#039;subImg&#039;&#039; pour traitement&amp;lt;/span&amp;gt;&lt;br /&gt;
  subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
  cvCopy(frame, subImg, NULL);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le nom de fichier pour l&#039;enregistrement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  string Result;&lt;br /&gt;
  ostringstream convert;&lt;br /&gt;
  ostringstream convertIdPersonne;&lt;br /&gt;
  convert &amp;lt;&amp;lt; nbFrame;&lt;br /&gt;
  convertIdPersonne &amp;lt;&amp;lt;idPersonne;&lt;br /&gt;
  Result = &amp;quot;imgResizedGray\\picture&amp;quot;+convertIdPersonne.str()+&amp;quot;&amp;quot;+convert.str()+&amp;quot;.jpg&amp;quot;;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variables nécessaires au traitement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dst = cvCreateImage(cvSize(400, 400),subImg-&amp;gt;depth,3)&lt;br /&gt;
  IplImage *dstGray = cvCreateImage(cvSize(400, 400),dst-&amp;gt;depth,1);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Redimensionne l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvResize(subImg,dst, CV_INTER_LINEAR );&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Convertie en matrice et en niveaux de gris&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvCvtColor(dst, dstGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Enregistre l&#039;image retraitée&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvSaveImage(Result.c_str(), dstGray);&lt;br /&gt;
  return Result;&lt;br /&gt;
&lt;br /&gt;
=== Identification de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039; [http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html Tutoriel pour la reconnaissance de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
L&#039;identification de visage consiste à reconnaitre un utilisateur dans un ensemble de visages connu. Plusieurs algorithmes existent pour comparer un visage à un autre : Eigenfaces, Fisherfaces, Local Binary Patterns Histograms,...&lt;br /&gt;
&lt;br /&gt;
Dans notre solution, nous utilisons la technique Fisherfaces. Il faut générer un modèle, permettant de lier chaque identité à un set d&#039;images lui correspondant. A la phase d&#039;identification, l&#039;image test (visage) sera comparée avec ce modèle. On va sélectionner le visage le plus proche du visage test, selon un certain calcul de distance. Il est possible d&#039;améliorer les résultats en jouant sur le seuil d&#039;acceptation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Création du modèle &#039;&#039;&#039;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteurs permettant de stocker l&#039;ensemble des images et des noms des utilisateurs pour le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Mat&amp;gt; images;&lt;br /&gt;
  vector&amp;lt;int&amp;gt; labels;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Va chercher les données dans notre fichier de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Personne&amp;gt; personnes = collection-&amp;gt;getPersonnes();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteur contenant les images de notre système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Image&amp;gt; imageRefs;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Parcours de l&#039;ensemble des personnes du système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  Personne personne;&lt;br /&gt;
  for(int i=0;i&amp;lt;(int)personnes.size();i++){&lt;br /&gt;
     personne = personnes[i];&lt;br /&gt;
     imageRefs = personne.getImageReferences();&lt;br /&gt;
     for(int j=0;j&amp;lt;(int)imageRefs.size();j++){&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupère l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
        IplImage* src = cvLoadImage(imageRefs[j].getChemin().c_str(), CV_LOAD_IMAGE_GRAYSCALE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Transforme l&#039;image en matrice&amp;lt;/span&amp;gt;&lt;br /&gt;
        Mat matDst=src;&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Stocke l&#039;image dans le vecteur &#039;&#039;images&#039;&#039; et la lie à l&#039;identité dans le vecteur &#039;&#039;labels&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
        images.push_back(matDst); labels.push_back(personne.getId());&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le modèle avec la technique Fisherfaces&amp;lt;/span&amp;gt;&lt;br /&gt;
  Ptr&amp;lt;FaceRecognizer&amp;gt; model =  createFisherFaceRecognizer();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Entraine/génère le modèle en fonction des vecteurs créés&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;train(images, labels);&lt;br /&gt;
  return model;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Identification du visage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Formatage de l&#039;image du visage test&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dstTest = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,3);&lt;br /&gt;
  IplImage *dstTestGray = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,1);&lt;br /&gt;
  cvResize(subImg,dstTest, CV_INTER_LINEAR );&lt;br /&gt;
  cvCvtColor(dstTest, dstTestGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Création de la matrice de l&#039;image de visage test pour comparaison avec le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  Mat matTest=dstTestGray;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variable stockant la confiance accordée au résultat&amp;lt;/span&amp;gt;&lt;br /&gt;
  double confidence = -1.0;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Identité résultat prédite&amp;lt;/span&amp;gt;&lt;br /&gt;
  int predicted = -1;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Demande la prédiction à partir du modèle cv::FaceRecognizer:&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;predict(matTest, predicted, confidence);&lt;br /&gt;
&lt;br /&gt;
=== Persistance des données ===&lt;br /&gt;
Pour réaliser un système de reconnaissance faciale, il faut mettre en place une base des utilisateurs. Lorsqu&#039;une personne souhaitera être authentifiée (ou identifiée), la comparaison sera faite avec les individus présents dans cette base. Pour chaque individu, nous lui associons une liste d&#039;images, captures de son visage. Le système de reconnaissance d&#039;OpenCV fonctionnant directement avec des images, nous les stockons directement en format JPG dans un dossier &amp;quot;imgResizedGray&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Format de données ====&lt;br /&gt;
Les données sont stockées en XML (fichier Personnes.xml dans le dossier data). Pour chaque personne, nous enregistrons son nom, prénom, un identifiant unique (généré automatiquement), et une liste d&#039;images associées (date + chemin). Voici un exemple de fichier:&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;ListePersonnes&amp;gt;&lt;br /&gt;
    &amp;lt;Personne&amp;gt;&lt;br /&gt;
        &amp;lt;Nom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Mercier&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Nom&amp;gt;&lt;br /&gt;
        &amp;lt;Prenom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Jean-Francois&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Prenom&amp;gt;&lt;br /&gt;
        &amp;lt;Id&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        1&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois2.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
    &amp;lt;/Personne&amp;gt;&lt;br /&gt;
 &amp;lt;/ListePersonnes&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
Une fois parsées, les données sont en mémoire dans la classe &amp;quot;Connexion&amp;quot;. Les modifications des données effectuées dans cette structure sont enregistrée en même temps dans le fichier xml.&lt;br /&gt;
&lt;br /&gt;
==== Librairie utilisée ====&lt;br /&gt;
La librairie utilisée pour parser le fichier xml est tinyXML. L&#039;import de la librairie est très simple puisque ce sont des classes C++ à ajouter dans le projet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;tinystr.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxml.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlerror.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlparser.cpp&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La documentation est disponible [http://www.grinninglizard.com/tinyxml/ ici].&lt;br /&gt;
Quelques éléments sur le fonctionnement de la librairie:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Chargement d&#039;un fichier XML :&amp;lt;/li&amp;gt; &lt;br /&gt;
 TiXmlDocument doc = TiXmlDocument(xmlFile);&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise fille (dans ce cas c&#039;est &amp;lt;ListePersonnes&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlHandle hdl(&amp;amp;doc);&lt;br /&gt;
 TiXmlElement *elem1 = hdl.FirstChildElement(&amp;quot;ListePersonnes&amp;quot;).Element();&lt;br /&gt;
 //Si l&#039;élément cherché est non trouvé&lt;br /&gt;
 if(!elem1) return false;&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise soeur (on passe de &amp;lt;Nom&amp;gt; à &amp;lt;Prenom&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlElement *elem1=elem1-&amp;gt;NextSiblingElement(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
&amp;lt;li&amp;gt; Modification du fichier XML (ajout d&#039;une balise fille &amp;lt;Personne&amp;gt; ainsi que ses balises filles &amp;lt;Nom&amp;gt;, &amp;lt;Prenom&amp;gt;, &amp;lt;Id&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 TiXmlText* newText;&lt;br /&gt;
 TiXmlElement new_personne(&amp;quot;Personne&amp;quot;);&lt;br /&gt;
 TiXmlElement new_nom(&amp;quot;Nom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_prenom(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_id(&amp;quot;Id&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 //Récupération des informations de la personne&lt;br /&gt;
 newText = new TiXmlText(firstName.c_str());&lt;br /&gt;
 new_nom.InsertEndChild(*newText);&lt;br /&gt;
 newText = new TiXmlText(lastName.c_str());&lt;br /&gt;
 new_prenom.InsertEndChild(*newText);&lt;br /&gt;
 oss &amp;lt;&amp;lt;id;&lt;br /&gt;
 newText = new TiXmlText(oss.str().c_str());&lt;br /&gt;
 new_id.InsertEndChild(*newText);&lt;br /&gt;
 &lt;br /&gt;
 //Création des balises filles de &amp;lt;Personne&amp;gt;&lt;br /&gt;
 new_personne.InsertEndChild(new_nom);&lt;br /&gt;
 new_personne.InsertEndChild(new_prenom);&lt;br /&gt;
 new_personne.InsertEndChild(new_id);&lt;br /&gt;
 &lt;br /&gt;
 //Création de la balise fille &amp;lt;Personne&amp;gt;&lt;br /&gt;
 elem1-&amp;gt;InsertEndChild(new_personne);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Sauvegarde du fichier XML :&amp;lt;/li&amp;gt;&lt;br /&gt;
 doc.SaveFile(xmlFile);&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10175</id>
		<title>PAGE WIKI ETUDIANTS 2012-13 RECONNAISSANCE FACIALE</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=PAGE_WIKI_ETUDIANTS_2012-13_RECONNAISSANCE_FACIALE&amp;diff=10175"/>
		<updated>2013-03-22T09:45:02Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Utilisation de Qt project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description du projet==&lt;br /&gt;
Le principe est de permettre d&#039;identifier un utilisateur. Le système dispose d&#039;une base de données contenant l&#039;ensemble des utilisateurs connus et leur visage. Le système doit reconnaitre l&#039;utilisateur test dans la base de données.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scénario type :&#039;&#039;&#039; Une personne se présente au système. Le système détecte son visage et analyse la situation. Il répond alors de 2 manières possibles :&lt;br /&gt;
* La personne est vraisemblablement Monsieur X&lt;br /&gt;
* La personne n&#039;est pas dans la base de données&lt;br /&gt;
&lt;br /&gt;
==Composition de l&#039;équipe==&lt;br /&gt;
&#039;&#039;&#039;Chef de projet :&#039;&#039;&#039; Camille OSWALD&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Equipiers :&#039;&#039;&#039;&lt;br /&gt;
* Marie CHEVALLIER&lt;br /&gt;
* Fabien ELOY&lt;br /&gt;
* Christopher GNATTO&lt;br /&gt;
* Maxence RAOUX&lt;br /&gt;
* Sylvain VIGIER&lt;br /&gt;
* Clément WIRTH&lt;br /&gt;
&lt;br /&gt;
==Gestion du projet==&lt;br /&gt;
&lt;br /&gt;
 {|class=&amp;quot;wikitable organisation Bio-Face&amp;quot;&lt;br /&gt;
 |+ Grands temps de développement du projet&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Apprentissage&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Détection&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Technologie&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Sous-équipe&lt;br /&gt;
 !scope=&amp;quot;col&amp;quot;| Etat&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Base de données&lt;br /&gt;
 | X&lt;br /&gt;
 | -&lt;br /&gt;
 | TinyXml&lt;br /&gt;
 | Fabien &amp;amp; Christopher &amp;amp; Sylvain&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Acquisition de données&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Sylvain &amp;amp; Christopher&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Détection de visages&lt;br /&gt;
 | X&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Maxence &amp;amp; Camille &amp;amp; Clément&lt;br /&gt;
 | FAIT&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Authentification&lt;br /&gt;
 | -&lt;br /&gt;
 | X&lt;br /&gt;
 | OpenCV&lt;br /&gt;
 | Marie &amp;amp; Camille&lt;br /&gt;
 | A tester&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Documentation&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Wiki air&lt;br /&gt;
 | Marie&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Interface&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Maxence &amp;amp; Clément&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |-&lt;br /&gt;
 !scope=&amp;quot;row&amp;quot;| Synchro. Interface-Auth.&lt;br /&gt;
 | -&lt;br /&gt;
 | -&lt;br /&gt;
 | Qt project&lt;br /&gt;
 | Camille &amp;amp; Christopher &amp;amp; Sylvain &amp;amp; Fabien&lt;br /&gt;
 | En cours&lt;br /&gt;
&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Technologies et matériel utilisés===&lt;br /&gt;
* C++&lt;br /&gt;
* librairies et frameworks : [http://opencv.org/ OpenCV], [http://qt-project.org/ Qt Project], [http://www.grinninglizard.com/tinyxml/ TinyXml]&lt;br /&gt;
* webcam&lt;br /&gt;
&lt;br /&gt;
===Chronologie de développement===&lt;br /&gt;
# Détection avec quelques images en base&lt;br /&gt;
#* Nous commençons par élaborer un modèle avec une petite base pour nous permettre de faire des tests. Nous agrandirons la base pour davantage de tests par la suite.&lt;br /&gt;
#* L&#039;acquisition des données de la webcam est très facilement gérée par OpenCV&lt;br /&gt;
#* La détection de visage se base sur la méthode de [http://fr.wikipedia.org/wiki/M%C3%A9thode_de_Viola_et_Jones Viola et Jones], aussi géré par OpenCV&lt;br /&gt;
#* Se focaliser sur la phase critique : l&#039;identification de visages&lt;br /&gt;
# Gérer la phase d&#039;apprentissage du système&amp;lt;br&amp;gt;&lt;br /&gt;
# optimiser le système (statistiques, réglage du seuil,…)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fonctionnement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de la librairie OpenCv ===&lt;br /&gt;
&lt;br /&gt;
Comme ce projet nécéssitait l&#039;utilisation d&#039;une kinect, nous avions décidé de développer sous Windows.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc tout d&#039;abord essayé d&#039;utiliser Visual Studio pour développer notre projet. Par la suite, nous avons choisi de passer par un autre éditeur : Codeblocks.&lt;br /&gt;
&lt;br /&gt;
1) Utilisation de Visual Studio (2012)&lt;br /&gt;
&lt;br /&gt;
Après avoir réussi à inclure les librairies dans notre code, nous avons rencontrés les problèmes suivants : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problèmes rencontrés :&lt;br /&gt;
* Difficulté de comprendre le fonctionnement du compilateur de visual studio, notamment lorsqu&#039;il faut ajouter de nouveaux fichiers&lt;br /&gt;
* Problème lors du fonctionnement des objets utilisés par opencv (Exception au lancement, ou détection des visages non effectuées) pour certaines machines.&lt;br /&gt;
* La librairie devait se trouver sur au même endroit pour toutes les machines&lt;br /&gt;
&lt;br /&gt;
2) Utilisation de Code Blocks&lt;br /&gt;
&lt;br /&gt;
Pour une meilleure compréhension et un projet fonctionnant sur des machines différentes avec des librairies qui ne sont pas installées aux mêmes endroits, nous avons choisi de porter le projet sur codeblocks.&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, nous avons utilisé Codeblocks 12.11 avec MinGW inclu (version 4.7.1).&lt;br /&gt;
&lt;br /&gt;
==== Compilation de la librairie OpenCv ====&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;éviter les problèmes d&#039;utilisation de la librairie, il était nécessaire de recompiler la librairie avec le même compilateur que nous utilisons pour notre projet (ici MinGW fourni avec CodeBlocks).&lt;br /&gt;
&lt;br /&gt;
Pour compiler la librairie, nous avons utilisé l&#039;utilitaire Cmake.&lt;br /&gt;
&lt;br /&gt;
Les fichiers de configurations de Cmake étant déjà fourni avec opencv (fichiers CMakeLists.txt), son utilisation devient très simple. Nous avons suivi le tutoriel ci-dessous :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Lancement de Cmake-gui&lt;br /&gt;
* Dans le champs Source Code, spécifier le chemin de la librairie openCv (exemple : C:\opencv-2.4.3)&lt;br /&gt;
* Dans le champs build, mettre le chemin ou la librairie compilée sera enregistrée (exemple : C:\openCV-build)&lt;br /&gt;
* Cliquer ensuite sur configure (créer le nouveau dossier)&lt;br /&gt;
* Spécification du générateur : MinGW Makefiles&lt;br /&gt;
* Sélectionner &amp;quot;Specify native compilers&amp;quot;&lt;br /&gt;
* Définir le compilateur C (ex : C:/Program Files/CodeBlocks/MinGW/bin/gcc.exe)&lt;br /&gt;
* Définir le compilateur C++ (ex: C:/Program Files/CodeBlocks/MinGW/bin/g++.exe)&lt;br /&gt;
* Cliquer sur Finish&lt;br /&gt;
* Cliquer sur generate&lt;br /&gt;
* Fermer Cmake&lt;br /&gt;
* Ouvrir une fenêtre de commande et aller dans le dossier que vous avez spécifié dans le champs build (ici : C:\openCV-build)&lt;br /&gt;
* Executer &amp;quot;ming32-make&amp;quot; (prend du temps et nécessite peut être d&#039;avoir le répertoire bin de MinGW dans le PATH)&lt;br /&gt;
* Enfin executer &amp;quot;mingw32-make install&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Configuration de codeblocks ====&lt;br /&gt;
&lt;br /&gt;
Pour configurer codeblocks, nous avons suivi ce tutoriel : http://opencv.willowgarage.com/wiki/CodeBlocks&lt;br /&gt;
&lt;br /&gt;
Afin que chacun puisse installer sa librairie openCv où bon lui semble, nous avons décidé de configurer chacun notre CodeBlocks. La démarche suivie est la suivante :&lt;br /&gt;
&lt;br /&gt;
* Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot; &lt;br /&gt;
* Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
* Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de notre openCv recompilé&lt;br /&gt;
* Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de notre openCv recompilé&lt;br /&gt;
* Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies .dll.a contenues dans le dossier lib.&lt;br /&gt;
* Inclure le dossier bin de notre openCv recompilé dans la variable système PATH (nécessite peut être un redemmarrage)&lt;br /&gt;
&lt;br /&gt;
Après ces étapes nous pouvons inclure les librairies openCV dans n&#039;importe quel projet Codeblocks.&lt;br /&gt;
&lt;br /&gt;
=== La bibliothèque Qt ===&lt;br /&gt;
&lt;br /&gt;
== Installation de QT ==&lt;br /&gt;
&lt;br /&gt;
* Télécharger Qt 5.0.1(MinGW 4.7) ou une version compatible avec MinGW 4.7 depuis le site [http://qt-project.org/downloads qt-project]&lt;br /&gt;
* Installer QT depuis l’exécutable téléchargé. &lt;br /&gt;
* Intégré QT à Codeblocks de la même manière qu&#039;OpenCV. C&#039;est à dire : &lt;br /&gt;
 - Menu &amp;quot;settings&amp;quot; / &amp;quot;Compiler&amp;quot;&lt;br /&gt;
 - Onglet &amp;quot;search directories&amp;quot;&lt;br /&gt;
 - Dans le sous onglet &amp;quot;Compiler&amp;quot;, spécifier le dossier include de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/include)&lt;br /&gt;
 - Dans le sous onglet &amp;quot;Linker&amp;quot;, spécifier le dossier lib de QT (&amp;lt;chemin d&#039;installation de QT&amp;gt;/QT5.0.1/5.0.1/mingw47_32/lib)&lt;br /&gt;
 - Aller dans l&#039;onglet &amp;quot;linker settings&amp;quot; et ajouter toutes les libraies a contenues dans le dossier lib.&lt;br /&gt;
&lt;br /&gt;
== Utilisation de QT ==&lt;br /&gt;
&lt;br /&gt;
Les inclusions de bibliothèque se fond en précisant le bon chemin, par exemple pour : &lt;br /&gt;
 * QLabel : #include &amp;lt;QtWidgets/QLabel&amp;gt; &lt;br /&gt;
 * QWidget : #include &amp;lt;QtWidgets/QWidget&amp;gt;&lt;br /&gt;
 * QPixmap : #include &amp;lt;QtGui/QPixmap&amp;gt;&lt;br /&gt;
etc...&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne les signaux et les slots, propre a QT. Une manipulation est nécessaire à leurs bon fonctionnement. &lt;br /&gt;
Comprendre leurs fonctionnement sur [http://www.siteduzero.com/informatique/tutoriels/programmez-avec-le-langage-c/creer-ses-propres-signaux-et-slots le site du zéro par exemple] puis il est nécessaire de lancer une commande pour que le signal marche.&lt;br /&gt;
&lt;br /&gt;
Depuis la racine du projet exécutez la commande : &lt;br /&gt;
moc &amp;lt;chemin vers le .h comprenant le signal&amp;gt; -o &amp;lt;chemin vers les sources du cpp&amp;gt;\moc_&amp;lt;nom du .h&amp;gt;.cpp&lt;br /&gt;
&lt;br /&gt;
Par exempe un signal est contenu dans include avec le nom interface.h, le cpp correspondant se trouve dans src/interface.cpp&lt;br /&gt;
La ligne de commande nécessaire sera : &lt;br /&gt;
moc include/interface.h -o src/moc_interface.cpp&lt;br /&gt;
&lt;br /&gt;
Cette commande génére un fichier cpp qui rend le signal utilisable.&lt;br /&gt;
&lt;br /&gt;
=== Détection de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039;&lt;br /&gt;
* [http://opencv.willowgarage.com/wiki/FaceDetection Tutoriel pour la détection de visage par OpenCV]&lt;br /&gt;
* [http://www.cs.princeton.edu/courses/archive/fall08/cos429/CourseMaterials/Precept1/facedetect.pdf Tutoriel pour la détection de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après nous être inspirés de ces tutoriels, voici comment la détection de visages est implémentée dans notre projet :&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Déclaration des variables&amp;lt;/span&amp;gt;&lt;br /&gt;
    char Filexml[]=&amp;quot;haarcascade_frontalface_alt.xml&amp;quot;;&lt;br /&gt;
    CvHaarClassifierCascade* cascade = 0;&lt;br /&gt;
    IplImage* frame = 0;&lt;br /&gt;
    struct stat buf;&lt;br /&gt;
    int statResult = stat(Filexml,&amp;amp;buf);&lt;br /&gt;
    char s[] = &amp;quot;picture.jpg&amp;quot;;&lt;br /&gt;
    int nbFrame = 0;&lt;br /&gt;
    CvCapture* capture;&lt;br /&gt;
    IplImage *subImg;&lt;br /&gt;
    CvSeq *faceRectSeq;&lt;br /&gt;
    CvMemStorage *storage = cvCreateMemStorage(0);&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Teste si le fichier d&#039;entrée est bien chargé&amp;lt;/span&amp;gt;&lt;br /&gt;
    if (statResult ||buf.st_ino&amp;lt;0) {&lt;br /&gt;
        printf(&amp;quot;xml non trouvé&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un nouveau Haar classifier :&lt;br /&gt;
        // Crée des classes permettant d&#039;identifier des objets dans des rectangles d&#039;images&lt;br /&gt;
        // Le système s&#039;entraine sur les images du fichier xml&amp;lt;/span&amp;gt;&lt;br /&gt;
        cascade = (CvHaarClassifierCascade*) cvLoad(Filexml);&lt;br /&gt;
    }&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des visages en continue, à partir de la webcam&amp;lt;/span&amp;gt;&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Capture de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        capture = cvCaptureFromCAM(1);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée un IplImage à partir de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        frame = cvQueryFrame(capture);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée une fenêtre pour afficher les visages détectés&amp;lt;/span&amp;gt;&lt;br /&gt;
        cvNamedWindow(&amp;quot;Sample Program&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        cvNamedWindow(&amp;quot;Visage&amp;quot;, CV_WINDOW_AUTOSIZE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Détection des objets dans l&#039;image de la caméra&amp;lt;/span&amp;gt;&lt;br /&gt;
        faceRectSeq = cvHaarDetectObjects(frame,cascade,storage,1.2, 3,CV_HAAR_DO_CANNY_PRUNING,cvSize(50,50));&lt;br /&gt;
        CvRect *r;&lt;br /&gt;
        for ( int i = 0; i &amp;lt; (faceRectSeq? faceRectSeq-&amp;gt;total:0); i++ )&lt;br /&gt;
        {&lt;br /&gt;
            r = (CvRect*)cvGetSeqElem(faceRectSeq,i);&lt;br /&gt;
            CvPoint p1 = { r-&amp;gt;x, r-&amp;gt;y };&lt;br /&gt;
            CvPoint p2 = { r-&amp;gt;x + r-&amp;gt;width, r-&amp;gt;y + r-&amp;gt;height };&lt;br /&gt;
            cvRectangle(frame,p1,p2,CV_RGB(0,255,0),1,4,0);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupération de l&#039;image à l&#039;interieur du rectangle r&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvSetImageROI(frame, *r);&lt;br /&gt;
            subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
            cvCopy(frame, subImg, NULL);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// On enregistre l&#039;image du visage&amp;lt;/span&amp;gt;&lt;br /&gt;
            saveTrainImg(frame, subImg, nbFrame);&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Affiche l&#039;image dans le rectangle, et l&#039;image de la caméra dans son intégralité&amp;lt;/span&amp;gt;&lt;br /&gt;
            cvShowImage(&amp;quot;Visage&amp;quot;, subImg);&lt;br /&gt;
            cvResetImageROI(frame);&lt;br /&gt;
            cvShowImage(&amp;quot;Sample Program&amp;quot;, frame);&lt;br /&gt;
        }&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Fermeture de l&#039;application sur commande Echap&amp;lt;/span&amp;gt;&lt;br /&gt;
        int c = cvWaitKey(10);&lt;br /&gt;
        if( (char)c == 27 )&lt;br /&gt;
        {&lt;br /&gt;
            cvSaveImage(s, frame);&lt;br /&gt;
            exit(0);&lt;br /&gt;
        }&lt;br /&gt;
        nbFrame++;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Traitement des images ===&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Copie l&#039;image source &#039;&#039;frame&#039;&#039; dans &#039;&#039;subImg&#039;&#039; pour traitement&amp;lt;/span&amp;gt;&lt;br /&gt;
  subImg = cvCreateImage(cvGetSize(frame), frame-&amp;gt;depth, frame-&amp;gt;nChannels);&lt;br /&gt;
  cvCopy(frame, subImg, NULL);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le nom de fichier pour l&#039;enregistrement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  string Result;&lt;br /&gt;
  ostringstream convert;&lt;br /&gt;
  ostringstream convertIdPersonne;&lt;br /&gt;
  convert &amp;lt;&amp;lt; nbFrame;&lt;br /&gt;
  convertIdPersonne &amp;lt;&amp;lt;idPersonne;&lt;br /&gt;
  Result = &amp;quot;imgResizedGray\\picture&amp;quot;+convertIdPersonne.str()+&amp;quot;&amp;quot;+convert.str()+&amp;quot;.jpg&amp;quot;;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variables nécessaires au traitement de l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dst = cvCreateImage(cvSize(400, 400),subImg-&amp;gt;depth,3)&lt;br /&gt;
  IplImage *dstGray = cvCreateImage(cvSize(400, 400),dst-&amp;gt;depth,1);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Redimensionne l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvResize(subImg,dst, CV_INTER_LINEAR );&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Convertie en matrice et en niveaux de gris&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvCvtColor(dst, dstGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Enregistre l&#039;image retraitée&amp;lt;/span&amp;gt;&lt;br /&gt;
  cvSaveImage(Result.c_str(), dstGray);&lt;br /&gt;
  return Result;&lt;br /&gt;
&lt;br /&gt;
=== Identification de visages ===&lt;br /&gt;
&amp;lt;u&amp;gt;&#039;&#039;Référence&amp;lt;/u&amp;gt; : &#039;&#039; [http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html Tutoriel pour la reconnaissance de visage]&amp;lt;br&amp;gt;&lt;br /&gt;
L&#039;identification de visage consiste à reconnaitre un utilisateur dans un ensemble de visages connu. Plusieurs algorithmes existent pour comparer un visage à un autre : Eigenfaces, Fisherfaces, Local Binary Patterns Histograms,...&lt;br /&gt;
&lt;br /&gt;
Dans notre solution, nous utilisons la technique Fisherfaces. Il faut générer un modèle, permettant de lier chaque identité à un set d&#039;images lui correspondant. A la phase d&#039;identification, l&#039;image test (visage) sera comparée avec ce modèle. On va sélectionner le visage le plus proche du visage test, selon un certain calcul de distance. Il est possible d&#039;améliorer les résultats en jouant sur le seuil d&#039;acceptation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Création du modèle &#039;&#039;&#039;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteurs permettant de stocker l&#039;ensemble des images et des noms des utilisateurs pour le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Mat&amp;gt; images;&lt;br /&gt;
  vector&amp;lt;int&amp;gt; labels;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Va chercher les données dans notre fichier de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Personne&amp;gt; personnes = collection-&amp;gt;getPersonnes();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Vecteur contenant les images de notre système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  vector&amp;lt;Image&amp;gt; imageRefs;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Parcours de l&#039;ensemble des personnes du système de données&amp;lt;/span&amp;gt;&lt;br /&gt;
  Personne personne;&lt;br /&gt;
  for(int i=0;i&amp;lt;(int)personnes.size();i++){&lt;br /&gt;
     personne = personnes[i];&lt;br /&gt;
     imageRefs = personne.getImageReferences();&lt;br /&gt;
     for(int j=0;j&amp;lt;(int)imageRefs.size();j++){&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Récupère l&#039;image&amp;lt;/span&amp;gt;&lt;br /&gt;
        IplImage* src = cvLoadImage(imageRefs[j].getChemin().c_str(), CV_LOAD_IMAGE_GRAYSCALE);&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Transforme l&#039;image en matrice&amp;lt;/span&amp;gt;&lt;br /&gt;
        Mat matDst=src;&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Stocke l&#039;image dans le vecteur &#039;&#039;images&#039;&#039; et la lie à l&#039;identité dans le vecteur &#039;&#039;labels&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
        images.push_back(matDst); labels.push_back(personne.getId());&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Crée le modèle avec la technique Fisherfaces&amp;lt;/span&amp;gt;&lt;br /&gt;
  Ptr&amp;lt;FaceRecognizer&amp;gt; model =  createFisherFaceRecognizer();&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Entraine/génère le modèle en fonction des vecteurs créés&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;train(images, labels);&lt;br /&gt;
  return model;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Identification du visage&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Formatage de l&#039;image du visage test&amp;lt;/span&amp;gt;&lt;br /&gt;
  IplImage *dstTest = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,3);&lt;br /&gt;
  IplImage *dstTestGray = cvCreateImage(cvSize(400 , 400),subImg-&amp;gt;depth,1);&lt;br /&gt;
  cvResize(subImg,dstTest, CV_INTER_LINEAR );&lt;br /&gt;
  cvCvtColor(dstTest, dstTestGray, CV_RGB2GRAY);&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Création de la matrice de l&#039;image de visage test pour comparaison avec le modèle&amp;lt;/span&amp;gt;&lt;br /&gt;
  Mat matTest=dstTestGray;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Variable stockant la confiance accordée au résultat&amp;lt;/span&amp;gt;&lt;br /&gt;
  double confidence = -1.0;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Identité résultat prédite&amp;lt;/span&amp;gt;&lt;br /&gt;
  int predicted = -1;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:grey&amp;quot;&amp;gt;// Demande la prédiction à partir du modèle cv::FaceRecognizer:&amp;lt;/span&amp;gt;&lt;br /&gt;
  model-&amp;gt;predict(matTest, predicted, confidence);&lt;br /&gt;
&lt;br /&gt;
=== Persistance des données ===&lt;br /&gt;
Pour réaliser un système de reconnaissance faciale, il faut mettre en place une base des utilisateurs. Lorsqu&#039;une personne souhaitera être authentifiée (ou identifiée), la comparaison sera faite avec les individus présents dans cette base. Pour chaque individu, nous lui associons une liste d&#039;images, captures de son visage. Le système de reconnaissance d&#039;OpenCV fonctionnant directement avec des images, nous les stockons directement en format JPG dans un dossier &amp;quot;imgResizedGray&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Format de données ====&lt;br /&gt;
Les données sont stockées en XML (fichier Personnes.xml dans le dossier data). Pour chaque personne, nous enregistrons son nom, prénom, un identifiant unique (généré automatiquement), et une liste d&#039;images associées (date + chemin). Voici un exemple de fichier:&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;ListePersonnes&amp;gt;&lt;br /&gt;
    &amp;lt;Personne&amp;gt;&lt;br /&gt;
        &amp;lt;Nom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Mercier&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Nom&amp;gt;&lt;br /&gt;
        &amp;lt;Prenom&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
            Jean-Francois&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Prenom&amp;gt;&lt;br /&gt;
        &amp;lt;Id&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        1&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
        &amp;lt;Image&amp;gt;&lt;br /&gt;
            &amp;lt;Chemin&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                MercierJean-Francois2.jpg&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Chemin&amp;gt;&lt;br /&gt;
            &amp;lt;Date&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
                DD/MM/YYYY HH:MM:SS&lt;br /&gt;
            &amp;lt;span style=&amp;quot;color:purple&amp;quot;&amp;gt;&amp;lt;/Date&amp;gt;&lt;br /&gt;
        &amp;lt;/Image&amp;gt;&lt;br /&gt;
    &amp;lt;/Personne&amp;gt;&lt;br /&gt;
 &amp;lt;/ListePersonnes&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
Une fois parsées, les données sont en mémoire dans la classe &amp;quot;Connexion&amp;quot;. Les modifications des données effectuées dans cette structure sont enregistrée en même temps dans le fichier xml.&lt;br /&gt;
&lt;br /&gt;
==== Librairie utilisée ====&lt;br /&gt;
La librairie utilisée pour parser le fichier xml est tinyXML. L&#039;import de la librairie est très simple puisque ce sont des classes C++ à ajouter dans le projet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;tinystr.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxml.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlerror.cpp&lt;br /&gt;
&amp;lt;li&amp;gt;tinyxmlparser.cpp&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La documentation est disponible [http://www.grinninglizard.com/tinyxml/ ici].&lt;br /&gt;
Quelques éléments sur le fonctionnement de la librairie:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Chargement d&#039;un fichier XML :&amp;lt;/li&amp;gt; &lt;br /&gt;
 TiXmlDocument doc = TiXmlDocument(xmlFile);&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise fille (dans ce cas c&#039;est &amp;lt;ListePersonnes&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlHandle hdl(&amp;amp;doc);&lt;br /&gt;
 TiXmlElement *elem1 = hdl.FirstChildElement(&amp;quot;ListePersonnes&amp;quot;).Element();&lt;br /&gt;
 //Si l&#039;élément cherché est non trouvé&lt;br /&gt;
 if(!elem1) return false;&lt;br /&gt;
&amp;lt;li&amp;gt; Accès à une balise soeur (on passe de &amp;lt;Nom&amp;gt; à &amp;lt;Prenom&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
 TiXmlElement *elem1=elem1-&amp;gt;NextSiblingElement(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
&amp;lt;li&amp;gt; Modification du fichier XML (ajout d&#039;une balise fille &amp;lt;Personne&amp;gt; ainsi que ses balises filles &amp;lt;Nom&amp;gt;, &amp;lt;Prenom&amp;gt;, &amp;lt;Id&amp;gt;) :&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 TiXmlText* newText;&lt;br /&gt;
 TiXmlElement new_personne(&amp;quot;Personne&amp;quot;);&lt;br /&gt;
 TiXmlElement new_nom(&amp;quot;Nom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_prenom(&amp;quot;Prenom&amp;quot;);&lt;br /&gt;
 TiXmlElement new_id(&amp;quot;Id&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
 //Récupération des informations de la personne&lt;br /&gt;
 newText = new TiXmlText(firstName.c_str());&lt;br /&gt;
 new_nom.InsertEndChild(*newText);&lt;br /&gt;
 newText = new TiXmlText(lastName.c_str());&lt;br /&gt;
 new_prenom.InsertEndChild(*newText);&lt;br /&gt;
 oss &amp;lt;&amp;lt;id;&lt;br /&gt;
 newText = new TiXmlText(oss.str().c_str());&lt;br /&gt;
 new_id.InsertEndChild(*newText);&lt;br /&gt;
 &lt;br /&gt;
 //Création des balises filles de &amp;lt;Personne&amp;gt;&lt;br /&gt;
 new_personne.InsertEndChild(new_nom);&lt;br /&gt;
 new_personne.InsertEndChild(new_prenom);&lt;br /&gt;
 new_personne.InsertEndChild(new_id);&lt;br /&gt;
 &lt;br /&gt;
 //Création de la balise fille &amp;lt;Personne&amp;gt;&lt;br /&gt;
 elem1-&amp;gt;InsertEndChild(new_personne);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Sauvegarde du fichier XML :&amp;lt;/li&amp;gt;&lt;br /&gt;
 doc.SaveFile(xmlFile);&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=9645</id>
		<title>Fusion multi-capteurs pour table tactile</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=9645"/>
		<updated>2013-03-13T13:40:26Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Semaine 9 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Enseignants: Didier Donsez&lt;br /&gt;
&lt;br /&gt;
Client: DIGITALE&lt;br /&gt;
&lt;br /&gt;
Eleves RICM5: Maxence Raoux (Responsable Communication), Léopold Dauvergne&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif de ce projet est de mettre en place des méthodes permettant à la table tactile de Digitale d’interagir avec son environnement extérieur sans action physique des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
=Projet=&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Capteurs==&lt;br /&gt;
&lt;br /&gt;
Suite aux différentes recherches effectuées, nous avons choisit d&#039;utiliser des capteurs à ultrasons. Ceux ci permettre d&#039;avoir une bonne précision et possède le meilleur rapport qualité/prix existant sur le marché.&lt;br /&gt;
&lt;br /&gt;
Le capteur choisi pour les expérimentations est le HC-SR04 que voici : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:HC-SR04-lg.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ses caractéristiques sont : &lt;br /&gt;
&lt;br /&gt;
- Power Supply :5V DC&lt;br /&gt;
&lt;br /&gt;
- Quiescent Current : &amp;lt;2mA&lt;br /&gt;
&lt;br /&gt;
- Effectual Angle: &amp;lt;15°&lt;br /&gt;
&lt;br /&gt;
- Ranging Distance : 2cm – 500 cm/1&amp;quot; - 16ft&lt;br /&gt;
&lt;br /&gt;
- Resolution : 0.3 cm&lt;br /&gt;
&lt;br /&gt;
La datasheet est disponible [http://jaktek.com/wp-content/uploads/2011/12/HC-SR04.pdf ici].&lt;br /&gt;
&lt;br /&gt;
Les capteurs seront idéalement placé sous l&#039;écran de la table, le long des bordures, comme dans l&#039;illustration ci dessous:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaTablesSensors.jpg|500px|thumb|center|Les capteurs sont représentés par les triangles noirs.]]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
Pour la partie software, nous avons utilisé le langage C# et avons développés plusieurs modules orientés autour d&#039;un bus à messages dont voici un schéma:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaBUSSONARTABLE.jpg|600px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Concernant le bus à messages, nous utilisons un produit développé par le CENA  nommé Ivy. Le site internet du projet est disponible [http://www.tls.cena.fr/products/ivy/ ici]. Pour rendre l&#039;utilisation de la bibliothèque Ivy plus agréable à utiliser, et l&#039;adapter au projet, nous avons créer une bibliothèque qui est utilisée dans chaque module. Elle permet par exemple de faire une connexion automatique sur le port et adresse réseau de l&#039;application, mais surtout d&#039;améliorer la réception et envoi de messages sur le bus Ivy. En effet cette bibliothèque gère les messages sous forme d&#039;objets et non de comme de simple chaînes de caractères. De plus cela rend l&#039;application plus maintenable puisque toute la gestion des messages est écrire dans une unique bibliothèque. &lt;br /&gt;
&lt;br /&gt;
Le module d&#039;écoute des capteurs permet de récupérer l&#039;information générée par les Arduinos connectés aux différents ports COM et d&#039;envoyer ces informations &amp;quot;brutes&amp;quot; sur le bus Ivy. Pour récupérer les informations provenant des capteurs, nous avons modifié [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ce programme] destiné à la plateforme Arduino. &lt;br /&gt;
Ce module possède une interface graphique de configuration pour sélectionner les ports COM sur lesquels sont connectés les Arduinos. Actuellement un seul est sélectionnable dans l&#039;interface et un seul thread d’écoute est lancé. Mais l&#039;évolution du programme vers plusieurs se résume à une ligne de code si nécessaire. &lt;br /&gt;
&lt;br /&gt;
Le module de traitement permet de récupérer les informations des capteurs envoyés sur le bus et de les traiter. Dans le cadre de notre projet il ne reçoit et traite seulement les messages envoyés par les capteurs ultra-sons. Une évolution vers différent type de capteurs se résumerai donc à l&#039;abonnement sur le bus Ivy d&#039;autre type de messages et à leurs traitements. Le traitement des informations consistes à générer des messages de plus haut niveau et ainsi abstraire les informations qui proviennes des capteurs, cela permet donc de proposer plusieurs services qui sont chacun basés sur un ou plusieurs types de capteurs. Ces informations sont ensuite à nouveau transférées sur le bus Ivy. Pour notre projet deux messages sont générés. Présence et position. Présence signale l&#039;arrivé et le départ d&#039;une personne, et position donne la position de la personne autour de la table ainsi que sa distance par rapport à elle. &lt;br /&gt;
&lt;br /&gt;
L&#039;application client est dans notre cas une application de démonstration technologique qui affiche des fenêtres suivant le mouvement des utilisateurs autour de la table. Elle est basée sur le sdk Microsoft Surface.&lt;br /&gt;
&lt;br /&gt;
=Suivi=&lt;br /&gt;
&lt;br /&gt;
==Semaine 5== &lt;br /&gt;
* Définition des objectifs du projet&lt;br /&gt;
* Mise en place du dépôts&lt;br /&gt;
* Création d&#039;un projet vide contenant une application Microsoft Surface vide : SonarTable.&lt;br /&gt;
* Mise en place de réunion hebdomadaire pour avoir un bon suivis du projet.&lt;br /&gt;
&lt;br /&gt;
==Semaine 6==&lt;br /&gt;
* Connexion à l&#039;arduino via le port COM. &lt;br /&gt;
* Création du projet SerialPortListener pour écouter l&#039;Arduino.   &lt;br /&gt;
* Apprentissage de la bibliothèque Ivy et création de la bibliothèque IvyCom.&lt;br /&gt;
* Compilation de la bibliothèque ivy pour qu&#039;elle soit disponible sur l&#039;architecture x64 demandé par les applications Surface.&lt;br /&gt;
* Création d&#039;évenements c# pour créer le dialogue entre la  bibliothèque IvyCom et les projets qui l&#039;utilise. &lt;br /&gt;
* Création d&#039;une interface pour paramétrer SerialPortListener &lt;br /&gt;
&lt;br /&gt;
==Semaine 7==&lt;br /&gt;
* Conversion du projet SerialPortListener en x64&lt;br /&gt;
* Création de la bibliothèque MiddleWare pour traiter les message reçut de l&#039;Arduino et envoyer un évènement c# à l&#039;application SonarTable. &lt;br /&gt;
* Création des classes Personnes et Personne pour traiter les différentes personnes présente autour de la table. &lt;br /&gt;
* Création de nombreuse fonction dans les classe Personnes et Personne. Tel que : &lt;br /&gt;
** Ajouter / Supprimer capteurs&lt;br /&gt;
** Recherche personne par id&lt;br /&gt;
**Recherche personne par capteur&lt;br /&gt;
** Ajout / Suppression de personnes ...&lt;br /&gt;
* Création d&#039;un buffer pour sauvegarder par personnes les messages voulus.&lt;br /&gt;
* Début d&#039;algorithme de décision dans MiddleWare pour la conversion de message type Arduino de SerialPortListener par des messages utilisables par l&#039;application SonarTable.&lt;br /&gt;
* Affichage de fenêtres dans l&#039;application SonarTable affichant les données des messages reçuts.&lt;br /&gt;
&lt;br /&gt;
==Semaine 8==&lt;br /&gt;
* Grosse amélioration de l&#039;algorithme de décision&lt;br /&gt;
* Nombreuse correction de bug&lt;br /&gt;
* Placement des fenêtres sur la l&#039;application SonarTable selon la valeurs des messages. &lt;br /&gt;
* Réflexion sur un changement de structure : &lt;br /&gt;
MiddleWare ne communiquera plus comme une bibliothèque avec SonarTable mais via le bus ivy.&lt;br /&gt;
&lt;br /&gt;
==Semaine 9==&lt;br /&gt;
* Mise en place de la nouvelle structure.&lt;br /&gt;
* Changement de la gestion des fenêtres sur SonarTable dû aux changements de la structure (plus simple)&lt;br /&gt;
* Mise en place de variable de configurations pour l&#039;algorithme de décision : &lt;br /&gt;
** nbAbsenceAcceptee : Nombre de messages d’absences acceptés. Cette variable est dû à des erreurs de distance parfois envoyée par les capteurs.&lt;br /&gt;
** distanceDifferenceAcceptee : Correspond à la distance envoyée entre deux capteurs qui permet de différencier une personne d&#039;une autre.  &lt;br /&gt;
** reglageInterval : Nombre de capteurs à proximité nécessaire pour considérer le déplacement d&#039;une fenêtre.&lt;br /&gt;
&lt;br /&gt;
==Semaine 10==&lt;br /&gt;
* Amélioration de la connexion via le bus ivy&lt;br /&gt;
* Amélioration de la position des fenêtres sur SonarTable.&lt;br /&gt;
* Orientation des fenêtres sur SonarTable.&lt;br /&gt;
* Optimisation de l&#039;algorithme&lt;br /&gt;
* Correction de bugs.&lt;br /&gt;
* Début de rapport&lt;br /&gt;
&lt;br /&gt;
==Semaine 11==&lt;br /&gt;
* Création d&#039;une nouvelle application qui affiche les valeurs reçut par l&#039;Arduino. &lt;br /&gt;
* Ecriture du rapport.&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=9644</id>
		<title>Fusion multi-capteurs pour table tactile</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=9644"/>
		<updated>2013-03-13T13:40:08Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Semaine 7 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Enseignants: Didier Donsez&lt;br /&gt;
&lt;br /&gt;
Client: DIGITALE&lt;br /&gt;
&lt;br /&gt;
Eleves RICM5: Maxence Raoux (Responsable Communication), Léopold Dauvergne&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif de ce projet est de mettre en place des méthodes permettant à la table tactile de Digitale d’interagir avec son environnement extérieur sans action physique des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
=Projet=&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Capteurs==&lt;br /&gt;
&lt;br /&gt;
Suite aux différentes recherches effectuées, nous avons choisit d&#039;utiliser des capteurs à ultrasons. Ceux ci permettre d&#039;avoir une bonne précision et possède le meilleur rapport qualité/prix existant sur le marché.&lt;br /&gt;
&lt;br /&gt;
Le capteur choisi pour les expérimentations est le HC-SR04 que voici : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:HC-SR04-lg.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ses caractéristiques sont : &lt;br /&gt;
&lt;br /&gt;
- Power Supply :5V DC&lt;br /&gt;
&lt;br /&gt;
- Quiescent Current : &amp;lt;2mA&lt;br /&gt;
&lt;br /&gt;
- Effectual Angle: &amp;lt;15°&lt;br /&gt;
&lt;br /&gt;
- Ranging Distance : 2cm – 500 cm/1&amp;quot; - 16ft&lt;br /&gt;
&lt;br /&gt;
- Resolution : 0.3 cm&lt;br /&gt;
&lt;br /&gt;
La datasheet est disponible [http://jaktek.com/wp-content/uploads/2011/12/HC-SR04.pdf ici].&lt;br /&gt;
&lt;br /&gt;
Les capteurs seront idéalement placé sous l&#039;écran de la table, le long des bordures, comme dans l&#039;illustration ci dessous:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaTablesSensors.jpg|500px|thumb|center|Les capteurs sont représentés par les triangles noirs.]]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
Pour la partie software, nous avons utilisé le langage C# et avons développés plusieurs modules orientés autour d&#039;un bus à messages dont voici un schéma:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaBUSSONARTABLE.jpg|600px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Concernant le bus à messages, nous utilisons un produit développé par le CENA  nommé Ivy. Le site internet du projet est disponible [http://www.tls.cena.fr/products/ivy/ ici]. Pour rendre l&#039;utilisation de la bibliothèque Ivy plus agréable à utiliser, et l&#039;adapter au projet, nous avons créer une bibliothèque qui est utilisée dans chaque module. Elle permet par exemple de faire une connexion automatique sur le port et adresse réseau de l&#039;application, mais surtout d&#039;améliorer la réception et envoi de messages sur le bus Ivy. En effet cette bibliothèque gère les messages sous forme d&#039;objets et non de comme de simple chaînes de caractères. De plus cela rend l&#039;application plus maintenable puisque toute la gestion des messages est écrire dans une unique bibliothèque. &lt;br /&gt;
&lt;br /&gt;
Le module d&#039;écoute des capteurs permet de récupérer l&#039;information générée par les Arduinos connectés aux différents ports COM et d&#039;envoyer ces informations &amp;quot;brutes&amp;quot; sur le bus Ivy. Pour récupérer les informations provenant des capteurs, nous avons modifié [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ce programme] destiné à la plateforme Arduino. &lt;br /&gt;
Ce module possède une interface graphique de configuration pour sélectionner les ports COM sur lesquels sont connectés les Arduinos. Actuellement un seul est sélectionnable dans l&#039;interface et un seul thread d’écoute est lancé. Mais l&#039;évolution du programme vers plusieurs se résume à une ligne de code si nécessaire. &lt;br /&gt;
&lt;br /&gt;
Le module de traitement permet de récupérer les informations des capteurs envoyés sur le bus et de les traiter. Dans le cadre de notre projet il ne reçoit et traite seulement les messages envoyés par les capteurs ultra-sons. Une évolution vers différent type de capteurs se résumerai donc à l&#039;abonnement sur le bus Ivy d&#039;autre type de messages et à leurs traitements. Le traitement des informations consistes à générer des messages de plus haut niveau et ainsi abstraire les informations qui proviennes des capteurs, cela permet donc de proposer plusieurs services qui sont chacun basés sur un ou plusieurs types de capteurs. Ces informations sont ensuite à nouveau transférées sur le bus Ivy. Pour notre projet deux messages sont générés. Présence et position. Présence signale l&#039;arrivé et le départ d&#039;une personne, et position donne la position de la personne autour de la table ainsi que sa distance par rapport à elle. &lt;br /&gt;
&lt;br /&gt;
L&#039;application client est dans notre cas une application de démonstration technologique qui affiche des fenêtres suivant le mouvement des utilisateurs autour de la table. Elle est basée sur le sdk Microsoft Surface.&lt;br /&gt;
&lt;br /&gt;
=Suivi=&lt;br /&gt;
&lt;br /&gt;
==Semaine 5== &lt;br /&gt;
* Définition des objectifs du projet&lt;br /&gt;
* Mise en place du dépôts&lt;br /&gt;
* Création d&#039;un projet vide contenant une application Microsoft Surface vide : SonarTable.&lt;br /&gt;
* Mise en place de réunion hebdomadaire pour avoir un bon suivis du projet.&lt;br /&gt;
&lt;br /&gt;
==Semaine 6==&lt;br /&gt;
* Connexion à l&#039;arduino via le port COM. &lt;br /&gt;
* Création du projet SerialPortListener pour écouter l&#039;Arduino.   &lt;br /&gt;
* Apprentissage de la bibliothèque Ivy et création de la bibliothèque IvyCom.&lt;br /&gt;
* Compilation de la bibliothèque ivy pour qu&#039;elle soit disponible sur l&#039;architecture x64 demandé par les applications Surface.&lt;br /&gt;
* Création d&#039;évenements c# pour créer le dialogue entre la  bibliothèque IvyCom et les projets qui l&#039;utilise. &lt;br /&gt;
* Création d&#039;une interface pour paramétrer SerialPortListener &lt;br /&gt;
&lt;br /&gt;
==Semaine 7==&lt;br /&gt;
* Conversion du projet SerialPortListener en x64&lt;br /&gt;
* Création de la bibliothèque MiddleWare pour traiter les message reçut de l&#039;Arduino et envoyer un évènement c# à l&#039;application SonarTable. &lt;br /&gt;
* Création des classes Personnes et Personne pour traiter les différentes personnes présente autour de la table. &lt;br /&gt;
* Création de nombreuse fonction dans les classe Personnes et Personne. Tel que : &lt;br /&gt;
** Ajouter / Supprimer capteurs&lt;br /&gt;
** Recherche personne par id&lt;br /&gt;
**Recherche personne par capteur&lt;br /&gt;
** Ajout / Suppression de personnes ...&lt;br /&gt;
* Création d&#039;un buffer pour sauvegarder par personnes les messages voulus.&lt;br /&gt;
* Début d&#039;algorithme de décision dans MiddleWare pour la conversion de message type Arduino de SerialPortListener par des messages utilisables par l&#039;application SonarTable.&lt;br /&gt;
* Affichage de fenêtres dans l&#039;application SonarTable affichant les données des messages reçuts.&lt;br /&gt;
&lt;br /&gt;
==Semaine 8==&lt;br /&gt;
* Grosse amélioration de l&#039;algorithme de décision&lt;br /&gt;
* Nombreuse correction de bug&lt;br /&gt;
* Placement des fenêtres sur la l&#039;application SonarTable selon la valeurs des messages. &lt;br /&gt;
* Réflexion sur un changement de structure : &lt;br /&gt;
MiddleWare ne communiquera plus comme une bibliothèque avec SonarTable mais via le bus ivy.&lt;br /&gt;
&lt;br /&gt;
==Semaine 9==&lt;br /&gt;
* Mise en place de la nouvelle structure.&lt;br /&gt;
* Changement de la gestion des fenêtres sur SonarTable dû aux changements de la structure (plus simple)&lt;br /&gt;
* Mise en place de variable de configurations pour l&#039;algorithme de décision : &lt;br /&gt;
- nbAbsenceAcceptee : Nombre de messages d’absences acceptés. Cette variable est dû à des erreurs de distance parfois envoyée par les capteurs.&lt;br /&gt;
- distanceDifferenceAcceptee : Correspond à la distance envoyée entre deux capteurs qui permet de différencier une personne d&#039;une autre.  &lt;br /&gt;
- reglageInterval : Nombre de capteurs à proximité nécessaire pour considérer le déplacement d&#039;une fenêtre. &lt;br /&gt;
&lt;br /&gt;
==Semaine 10==&lt;br /&gt;
* Amélioration de la connexion via le bus ivy&lt;br /&gt;
* Amélioration de la position des fenêtres sur SonarTable.&lt;br /&gt;
* Orientation des fenêtres sur SonarTable.&lt;br /&gt;
* Optimisation de l&#039;algorithme&lt;br /&gt;
* Correction de bugs.&lt;br /&gt;
* Début de rapport&lt;br /&gt;
&lt;br /&gt;
==Semaine 11==&lt;br /&gt;
* Création d&#039;une nouvelle application qui affiche les valeurs reçut par l&#039;Arduino. &lt;br /&gt;
* Ecriture du rapport.&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=9643</id>
		<title>Fusion multi-capteurs pour table tactile</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=9643"/>
		<updated>2013-03-13T13:39:40Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Suivi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Enseignants: Didier Donsez&lt;br /&gt;
&lt;br /&gt;
Client: DIGITALE&lt;br /&gt;
&lt;br /&gt;
Eleves RICM5: Maxence Raoux (Responsable Communication), Léopold Dauvergne&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif de ce projet est de mettre en place des méthodes permettant à la table tactile de Digitale d’interagir avec son environnement extérieur sans action physique des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
=Projet=&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application doit être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Capteurs==&lt;br /&gt;
&lt;br /&gt;
Suite aux différentes recherches effectuées, nous avons choisit d&#039;utiliser des capteurs à ultrasons. Ceux ci permettre d&#039;avoir une bonne précision et possède le meilleur rapport qualité/prix existant sur le marché.&lt;br /&gt;
&lt;br /&gt;
Le capteur choisi pour les expérimentations est le HC-SR04 que voici : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:HC-SR04-lg.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ses caractéristiques sont : &lt;br /&gt;
&lt;br /&gt;
- Power Supply :5V DC&lt;br /&gt;
&lt;br /&gt;
- Quiescent Current : &amp;lt;2mA&lt;br /&gt;
&lt;br /&gt;
- Effectual Angle: &amp;lt;15°&lt;br /&gt;
&lt;br /&gt;
- Ranging Distance : 2cm – 500 cm/1&amp;quot; - 16ft&lt;br /&gt;
&lt;br /&gt;
- Resolution : 0.3 cm&lt;br /&gt;
&lt;br /&gt;
La datasheet est disponible [http://jaktek.com/wp-content/uploads/2011/12/HC-SR04.pdf ici].&lt;br /&gt;
&lt;br /&gt;
Les capteurs seront idéalement placé sous l&#039;écran de la table, le long des bordures, comme dans l&#039;illustration ci dessous:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaTablesSensors.jpg|500px|thumb|center|Les capteurs sont représentés par les triangles noirs.]]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
Pour la partie software, nous avons utilisé le langage C# et avons développés plusieurs modules orientés autour d&#039;un bus à messages dont voici un schéma:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaBUSSONARTABLE.jpg|600px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Concernant le bus à messages, nous utilisons un produit développé par le CENA  nommé Ivy. Le site internet du projet est disponible [http://www.tls.cena.fr/products/ivy/ ici]. Pour rendre l&#039;utilisation de la bibliothèque Ivy plus agréable à utiliser, et l&#039;adapter au projet, nous avons créer une bibliothèque qui est utilisée dans chaque module. Elle permet par exemple de faire une connexion automatique sur le port et adresse réseau de l&#039;application, mais surtout d&#039;améliorer la réception et envoi de messages sur le bus Ivy. En effet cette bibliothèque gère les messages sous forme d&#039;objets et non de comme de simple chaînes de caractères. De plus cela rend l&#039;application plus maintenable puisque toute la gestion des messages est écrire dans une unique bibliothèque. &lt;br /&gt;
&lt;br /&gt;
Le module d&#039;écoute des capteurs permet de récupérer l&#039;information générée par les Arduinos connectés aux différents ports COM et d&#039;envoyer ces informations &amp;quot;brutes&amp;quot; sur le bus Ivy. Pour récupérer les informations provenant des capteurs, nous avons modifié [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ce programme] destiné à la plateforme Arduino. &lt;br /&gt;
Ce module possède une interface graphique de configuration pour sélectionner les ports COM sur lesquels sont connectés les Arduinos. Actuellement un seul est sélectionnable dans l&#039;interface et un seul thread d’écoute est lancé. Mais l&#039;évolution du programme vers plusieurs se résume à une ligne de code si nécessaire. &lt;br /&gt;
&lt;br /&gt;
Le module de traitement permet de récupérer les informations des capteurs envoyés sur le bus et de les traiter. Dans le cadre de notre projet il ne reçoit et traite seulement les messages envoyés par les capteurs ultra-sons. Une évolution vers différent type de capteurs se résumerai donc à l&#039;abonnement sur le bus Ivy d&#039;autre type de messages et à leurs traitements. Le traitement des informations consistes à générer des messages de plus haut niveau et ainsi abstraire les informations qui proviennes des capteurs, cela permet donc de proposer plusieurs services qui sont chacun basés sur un ou plusieurs types de capteurs. Ces informations sont ensuite à nouveau transférées sur le bus Ivy. Pour notre projet deux messages sont générés. Présence et position. Présence signale l&#039;arrivé et le départ d&#039;une personne, et position donne la position de la personne autour de la table ainsi que sa distance par rapport à elle. &lt;br /&gt;
&lt;br /&gt;
L&#039;application client est dans notre cas une application de démonstration technologique qui affiche des fenêtres suivant le mouvement des utilisateurs autour de la table. Elle est basée sur le sdk Microsoft Surface.&lt;br /&gt;
&lt;br /&gt;
=Suivi=&lt;br /&gt;
&lt;br /&gt;
==Semaine 5== &lt;br /&gt;
* Définition des objectifs du projet&lt;br /&gt;
* Mise en place du dépôts&lt;br /&gt;
* Création d&#039;un projet vide contenant une application Microsoft Surface vide : SonarTable.&lt;br /&gt;
* Mise en place de réunion hebdomadaire pour avoir un bon suivis du projet.&lt;br /&gt;
&lt;br /&gt;
==Semaine 6==&lt;br /&gt;
* Connexion à l&#039;arduino via le port COM. &lt;br /&gt;
* Création du projet SerialPortListener pour écouter l&#039;Arduino.   &lt;br /&gt;
* Apprentissage de la bibliothèque Ivy et création de la bibliothèque IvyCom.&lt;br /&gt;
* Compilation de la bibliothèque ivy pour qu&#039;elle soit disponible sur l&#039;architecture x64 demandé par les applications Surface.&lt;br /&gt;
* Création d&#039;évenements c# pour créer le dialogue entre la  bibliothèque IvyCom et les projets qui l&#039;utilise. &lt;br /&gt;
* Création d&#039;une interface pour paramétrer SerialPortListener &lt;br /&gt;
&lt;br /&gt;
==Semaine 7==&lt;br /&gt;
* Conversion du projet SerialPortListener en x64&lt;br /&gt;
* Création de la bibliothèque MiddleWare pour traiter les message reçut de l&#039;Arduino et envoyer un évènement c# à l&#039;application SonarTable. &lt;br /&gt;
* Création des classes Personnes et Personne pour traiter les différentes personnes présente autour de la table. &lt;br /&gt;
* Création de nombreuse fonction dans les classe Personnes et Personne. Tel que : &lt;br /&gt;
- Ajouter / Supprimer capteurs&lt;br /&gt;
- Recherche personne par id&lt;br /&gt;
- Recherche personne par capteur&lt;br /&gt;
- Ajout / Suppression de personnes ...&lt;br /&gt;
* Création d&#039;un buffer pour sauvegarder par personnes les messages voulus.&lt;br /&gt;
* Début d&#039;algorithme de décision dans MiddleWare pour la conversion de message type Arduino de SerialPortListener par des messages utilisables par l&#039;application SonarTable.&lt;br /&gt;
* Affichage de fenêtres dans l&#039;application SonarTable affichant les données des messages reçuts. &lt;br /&gt;
&lt;br /&gt;
==Semaine 8==&lt;br /&gt;
* Grosse amélioration de l&#039;algorithme de décision&lt;br /&gt;
* Nombreuse correction de bug&lt;br /&gt;
* Placement des fenêtres sur la l&#039;application SonarTable selon la valeurs des messages. &lt;br /&gt;
* Réflexion sur un changement de structure : &lt;br /&gt;
MiddleWare ne communiquera plus comme une bibliothèque avec SonarTable mais via le bus ivy.&lt;br /&gt;
&lt;br /&gt;
==Semaine 9==&lt;br /&gt;
* Mise en place de la nouvelle structure.&lt;br /&gt;
* Changement de la gestion des fenêtres sur SonarTable dû aux changements de la structure (plus simple)&lt;br /&gt;
* Mise en place de variable de configurations pour l&#039;algorithme de décision : &lt;br /&gt;
- nbAbsenceAcceptee : Nombre de messages d’absences acceptés. Cette variable est dû à des erreurs de distance parfois envoyée par les capteurs.&lt;br /&gt;
- distanceDifferenceAcceptee : Correspond à la distance envoyée entre deux capteurs qui permet de différencier une personne d&#039;une autre.  &lt;br /&gt;
- reglageInterval : Nombre de capteurs à proximité nécessaire pour considérer le déplacement d&#039;une fenêtre. &lt;br /&gt;
&lt;br /&gt;
==Semaine 10==&lt;br /&gt;
* Amélioration de la connexion via le bus ivy&lt;br /&gt;
* Amélioration de la position des fenêtres sur SonarTable.&lt;br /&gt;
* Orientation des fenêtres sur SonarTable.&lt;br /&gt;
* Optimisation de l&#039;algorithme&lt;br /&gt;
* Correction de bugs.&lt;br /&gt;
* Début de rapport&lt;br /&gt;
&lt;br /&gt;
==Semaine 11==&lt;br /&gt;
* Création d&#039;une nouvelle application qui affiche les valeurs reçut par l&#039;Arduino. &lt;br /&gt;
* Ecriture du rapport.&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=9538</id>
		<title>Fusion multi-capteurs pour table tactile</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=9538"/>
		<updated>2013-03-08T12:09:07Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Enseignants: Didier Donsez&lt;br /&gt;
&lt;br /&gt;
Client: DIGITALE&lt;br /&gt;
&lt;br /&gt;
Eleves RICM5: Maxence Raoux (Responsable Communication), Léopold Dauvergne&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif de ce projet est de mettre en place des méthodes permettant à la table tactile de Digitale d’interagir avec son environnement extérieur sans action physique des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
=Projet=&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application se devant d&#039;être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Capteurs==&lt;br /&gt;
&lt;br /&gt;
Suite aux différentes recherches effectuées, nous avons choisit d&#039;utiliser des capteurs à ultrasons. Ceux ci permettre d&#039;avoir une bonne précision et possède le meilleur rapport qualité/prix existant sur le marché.&lt;br /&gt;
&lt;br /&gt;
Le capteur choisi pour les expérimentations est le HC-SR04 que voici : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:HC-SR04-lg.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ses caractéristiques sont : &lt;br /&gt;
&lt;br /&gt;
- Power Supply :5V DC&lt;br /&gt;
&lt;br /&gt;
- Quiescent Current : &amp;lt;2mA&lt;br /&gt;
&lt;br /&gt;
- Effectual Angle: &amp;lt;15°&lt;br /&gt;
&lt;br /&gt;
- Ranging Distance : 2cm – 500 cm/1&amp;quot; - 16ft&lt;br /&gt;
&lt;br /&gt;
- Resolution : 0.3 cm&lt;br /&gt;
&lt;br /&gt;
La datasheet est disponible [http://jaktek.com/wp-content/uploads/2011/12/HC-SR04.pdf ici].&lt;br /&gt;
&lt;br /&gt;
Les capteurs seront idéalement placé sous l&#039;écran de la table, le long des bordures, comme dans l&#039;illustration ci dessous:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaTablesSensors.jpg|500px|thumb|center|Les capteurs sont représentés par les triangles noirs.]]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
Pour la partie software, nous avons utilisé le langage C# et avons développés plusieurs modules orientés autour d&#039;un bus à messages dont voici un schéma:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaBUSSONARTABLE.jpg|600px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Concernant le bus à messages, nous utilisons un produit développé par le CENA  nommé Ivy. Le site internet du projet est disponible [http://www.tls.cena.fr/products/ivy/ ici]. Pour rendre l&#039;utilisation de la bibliothèque Ivy plus agréable à utiliser, et l&#039;adapter au projet, nous avons créer une bibliothèque qui est utilisée dans chaque module. Elle permet par exemple de faire une connexion automatique sur le port et adresse réseau de l&#039;application, mais surtout d&#039;améliorer la réception et envoi de messages sur le bus Ivy. En effet cette bibliothèque gère les messages sous forme d&#039;objets et non de comme de simple chaînes de caractères. De plus cela rend l&#039;application plus maintenable puisque toute la gestion des messages est écrire dans une unique bibliothèque. &lt;br /&gt;
&lt;br /&gt;
Le module d&#039;écoute des capteurs permet de récupérer l&#039;information générée par les Arduinos connectés aux différents ports COM et d&#039;envoyer ces informations &amp;quot;brutes&amp;quot; sur le bus Ivy. Pour récupérer les informations provenant des capteurs, nous avons modifié [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ce programme] destiné à la plateforme Arduino. &lt;br /&gt;
Ce module possède une interface graphique de configuration pour sélectionner les ports COM sur lesquels sont connectés les Arduinos. Actuellement un seul est sélectionnable dans l&#039;interface et un seul thread d’écoute est lancé. Mais l&#039;évolution du programme vers plusieurs se résume à une ligne de code si nécessaire. &lt;br /&gt;
&lt;br /&gt;
Le module de traitement permet de récupérer les informations des capteurs envoyés sur le bus et de les traiter. Dans le cadre de notre projet il ne reçoit et traite seulement les messages envoyés par les capteurs ultra-sons. Une évolution vers différent type de capteurs se résumerai donc à l&#039;abonnement sur le bus Ivy d&#039;autre type de messages et à leurs traitements. Le traitement des informations consistes à générer des messages de plus haut niveau et ainsi abstraire les informations qui proviennes des capteurs, cela permet donc de proposer plusieurs services qui sont chacun basés sur un ou plusieurs types de capteurs. Ces informations sont ensuite à nouveau transférées sur le bus Ivy. Pour notre projet deux messages sont générés. Présence et position. Présence signale l&#039;arrivé et le départ d&#039;une personne, et position donne la position de la personne autour de la table ainsi que sa distance par rapport à elle. &lt;br /&gt;
&lt;br /&gt;
L&#039;application client est dans notre cas une application de démonstration technologique qui affiche des fenêtres suivant le mouvement des utilisateurs autour de la table. Elle est basée sur le sdk Microsoft Surface.&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=9525</id>
		<title>Fusion multi-capteurs pour table tactile</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Fusion_multi-capteurs_pour_table_tactile&amp;diff=9525"/>
		<updated>2013-03-08T09:57:14Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Enseignants: Didier Donsez&lt;br /&gt;
&lt;br /&gt;
Client: DIGITALE&lt;br /&gt;
&lt;br /&gt;
Eleves RICM5: Maxence Raoux (Responsable Communication), Léopold Dauvergne&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif de ce projet est de mettre en place des méthodes permettant à la table tactile de Digitale d’interagir avec son environnement extérieur sans action physique des utilisateurs.&lt;br /&gt;
&lt;br /&gt;
=Projet=&lt;br /&gt;
&lt;br /&gt;
Pour arriver à remplir l&#039;objectif, il faut recourir à l&#039;utilisation de capteurs disposés autour de la table. L&#039;application se devant d&#039;être évolutive, une architecture modulaire sera à mettre en place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Capteurs==&lt;br /&gt;
&lt;br /&gt;
Suite aux différentes recherches effectuées, nous avons choisit d&#039;utiliser des capteurs à ultrasons. Ceux ci permettre d&#039;avoir une bonne précision et possède le meilleur rapport qualité/prix existant sur le marché.&lt;br /&gt;
&lt;br /&gt;
Le capteur choisi pour les expérimentations est le HC-SR04 que voici : &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:HC-SR04-lg.jpg|400px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ses caractéristiques sont : &lt;br /&gt;
&lt;br /&gt;
- Power Supply :5V DC&lt;br /&gt;
&lt;br /&gt;
- Quiescent Current : &amp;lt;2mA&lt;br /&gt;
&lt;br /&gt;
- Effectual Angle: &amp;lt;15°&lt;br /&gt;
&lt;br /&gt;
- Ranging Distance : 2cm – 500 cm/1&amp;quot; - 16ft&lt;br /&gt;
&lt;br /&gt;
- Resolution : 0.3 cm&lt;br /&gt;
&lt;br /&gt;
La datasheet est disponible [http://jaktek.com/wp-content/uploads/2011/12/HC-SR04.pdf ici].&lt;br /&gt;
&lt;br /&gt;
Les capteurs seront idéalement placé sous l&#039;écran de la table, le long des bordures, comme dans l&#039;illustration ci dessous:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaTablesSensors.jpg|500px|thumb|center|Les capteurs sont représentés par les triangles noirs.]]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
Pour la partie software, nous avons utilisé le langage C# et avons développés plusieurs modules orientés autour d&#039;un bus à messages dont voici un schéma:&lt;br /&gt;
&lt;br /&gt;
[[Image:SchemaBUSSONARTABLE.jpg|600px|thumb|center|HC-SR04]]&lt;br /&gt;
&lt;br /&gt;
Concernant le bus à messages, nous utilisons un produit développé par le CENA  nommé Ivy. Le site internet du projet est disponible [http://www.tls.cena.fr/products/ivy/ ici]. Pour rendre l&#039;utilisation de la bibliothèque Ivy plus agréable à utiliser, et l&#039;adapter au projet, nous avons créer une bibliothèque qui est utilisée dans chaque module. Elle permet par exemple de faire une connexion automatique sur le port et adresse réseau de l&#039;application, mais surtout d&#039;améliorer la réception et envoi de messages sur le bus Ivy. En effet cette bibliothèque gère les messages sous forme d&#039;objets et non de comme de simple chaînes de caractères. De plus cela rend l&#039;application plus maintenable puisque toute la gestion des messages est écrire dans une unique bibliothèque. &lt;br /&gt;
&lt;br /&gt;
Le module d&#039;écoute des capteurs permet de récupérer l&#039;information générée par les Arduinos connectés aux différents ports COM et d&#039;envoyer ces informations &amp;quot;brutes&amp;quot; sur le bus Ivy. Pour récupérer les informations provenant des capteurs, nous avons modifié [http://code.google.com/p/arduino-new-ping/wiki/15_Sensors_Example ce programme] destiné à la plateforme Arduino. &lt;br /&gt;
Ce module possède une interface graphique de configuration pour sélectionner les ports COM sur lesquels sont connectés les Arduinos. Actuellement un seul est sélectionnable dans l&#039;interface et un seul thread d’écoute est lancé. Mais l&#039;évolution du programme vers plusieurs se résume à une ligne de code si nécessaire. &lt;br /&gt;
&lt;br /&gt;
Le module de traitement permet de récupérer les informations des capteurs envoyés sur le bus et de les traiter. Dans le cadre de notre projet il ne reçoit et traite seulement les messages envoyés par les capteurs ultra-sons. Une évolution vers différent type de capteurs se résumerai donc à l&#039;abonnement sur le bus Ivy d&#039;autre type de messages et à leurs traitements. Le traitement des informations consistes à générer des messages de plus haut niveau et ainsi abstraire les informations qui proviennes des capteurs, cela permet donc de proposer plusieurs services qui sont chacun basés sur un ou plusieurs types de capteurs. Ces informations sont ensuite à nouveau transférées sur le bus Ivy. Pour notre projet deux messages sont générés. Présence et position. Présence signale l&#039;arrivé et le départ d&#039;une personne, et position donne la position de la personne autour de la table ainsi que sa distance par rapport à elle. &lt;br /&gt;
&lt;br /&gt;
L&#039;application client est dans notre cas une application de démonstration technologique qui affiche des fenêtres suivant le mouvement des utilisateurs autour de la table.&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Tiled_Display&amp;diff=6722</id>
		<title>Tiled Display</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Tiled_Display&amp;diff=6722"/>
		<updated>2012-11-25T14:36:54Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Sources */  Affichages des sources sous forme de lien&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Tiled Displays=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est ce qu&#039;un tiled display ? ==&lt;br /&gt;
&lt;br /&gt;
=== Principe ===&lt;br /&gt;
Le principe est de créer un écran géant composé de plusieurs écrans plus petits. &lt;br /&gt;
&lt;br /&gt;
N&#039;importe quel écran peut être utilisé pour un wall display (il est tout de même nécessaire d&#039;adapter ensuite la technologie et les outils utilisés). Par exemple :&lt;br /&gt;
*les écrans d&#039;ordinateurs ou de télévisions&lt;br /&gt;
*plusieurs vidéoprojecteurs&lt;br /&gt;
*les écrans de téléphone mobile &lt;br /&gt;
&lt;br /&gt;
=== Exemples d&#039;utilisations ===&lt;br /&gt;
&lt;br /&gt;
Admettons que l&#039;intérêt est moindre avec un téléphone étant donnée la taille de son écran ! &lt;br /&gt;
On peut certainement en trouver une utilisation, par exemple faire une mini-table tactile... &lt;br /&gt;
&lt;br /&gt;
Les écrans de télévision sont très utilisé sur les plateaux de télévision, dans les stades ou encore dans le rue pour des affichages publicitaires par exemple. L&#039;intérêt par rapport à un vidéo-projecteur, est qu&#039;il aurait un très mauvais rendu dans ce type d&#039;environnement, à cause notamment des effets de lumières sur les plateaux de télévision et à cause de la forte luminosité dans les stades et dans la rue en plein jour. &lt;br /&gt;
&lt;br /&gt;
On peut aussi se servir d&#039;un wall display plus petit, 3, 4 écrans pour agrandir une surface de travail sur un ordinateur, utile pour les graphiste par exemple, ou encore pour jouer aux jeux vidéos. &lt;br /&gt;
&lt;br /&gt;
Une autre utilisation moins connut et de créer un énorme surface de travail avec des écrans multitouch. Cela permet de faire un mur interactif sur lequel chacun peut travailler en parallèle, tout en partageant directement leurs idées. &lt;br /&gt;
&lt;br /&gt;
=== Avantages ===&lt;br /&gt;
&lt;br /&gt;
Comme vue précédemment, le principale intérêt par rapport à un vidéoprojecteur est la luminosité. Un autre avantage important est la surface obtenue, qui peut être plus grande et quasi-illimité. &lt;br /&gt;
De plus les technlogie actuel ne permettent pas de faire autrement, les télévisions ne dépasse pas les 4 mètre et coûte extrêmement chère. (exemple : écran led à 8000€ pour 190cm de diagonal)&lt;br /&gt;
&lt;br /&gt;
== Un peu de techniques ==&lt;br /&gt;
&lt;br /&gt;
Il existes plusieurs techniques pour créer un wall display. Voici les trois plus importantes : &lt;br /&gt;
&lt;br /&gt;
=== Avoir plusieurs sorties vidéos sur son PC ===&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisateur doit avoir une ou plusieurs carte graphique et une sortie vidéo par écran. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Problèmes&#039;&#039;&lt;br /&gt;
* Le nombreux d&#039;écrans est très vite limités par les capacités de l&#039;ordinateur.&lt;br /&gt;
* Le coût peux vite devenir important.&lt;br /&gt;
&#039;&#039;Avantages&#039;&#039;&lt;br /&gt;
* Extrêmement facile à mettre en place &lt;br /&gt;
&lt;br /&gt;
=== Avec un serveur et un bon réseau ! ===&lt;br /&gt;
&lt;br /&gt;
Le flux vidéos est traité par un serveur que se charge de la diffusion vers les différents écrans. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Problèmes&#039;&#039;&lt;br /&gt;
* Demande un réseaux très haut débit dès que le nombre d&#039;écran devient important&lt;br /&gt;
* La mise en place n&#039;est pas faciles&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Avantages&#039;&#039;&lt;br /&gt;
* Une seul sortie vidéo nécessaire&lt;br /&gt;
* Moins onéreux&lt;br /&gt;
&lt;br /&gt;
=== Avec des vidéoprojecteurs ===&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation des vidéoprojecteurs ce fait dos à l&#039;écran. L&#039;image est alors inversée par les vidéoprojecteurs et les écrans se charges de présenter l&#039;image à l&#039;utilisateur. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Problèmes&#039;&#039;&lt;br /&gt;
* Très onéreux&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Avantages&#039;&#039;&lt;br /&gt;
* Moins de problèmes liée aux bordures des écrans&lt;br /&gt;
&lt;br /&gt;
== Quels sont les différents outils disponibles ? ==&lt;br /&gt;
&lt;br /&gt;
=== CGLX ===&lt;br /&gt;
&lt;br /&gt;
Pour Cross-Platform Cluster Graphics Library&lt;br /&gt;
* Open source&lt;br /&gt;
* Linux / MacOSX&lt;br /&gt;
&lt;br /&gt;
=== IceT ===&lt;br /&gt;
&lt;br /&gt;
Pour Image Composition Engine for Tiles&lt;br /&gt;
* Licence BSD&lt;br /&gt;
* Utilisé par ParaView et Vislt par exemple&lt;br /&gt;
* Windows / Linux / MacOSX&lt;br /&gt;
&lt;br /&gt;
=== Sage ===&lt;br /&gt;
&lt;br /&gt;
* Utilisé dans de nombreux logiciels par exemple VLC, VNC, MPlayer.&lt;br /&gt;
* Semble être les plus utilisés&lt;br /&gt;
* Windows / Linux&lt;br /&gt;
* Prise en main difficile&lt;br /&gt;
&lt;br /&gt;
=== Liquid Galaxy ===&lt;br /&gt;
&lt;br /&gt;
Crée et mise en place par google. Permet de créer un wall display de leurs logiciels Google Earth&lt;br /&gt;
&lt;br /&gt;
* Extrêmement simple à mettre en place&lt;br /&gt;
* Limité à Google Earth&lt;br /&gt;
&lt;br /&gt;
== Sources == &lt;br /&gt;
&lt;br /&gt;
*[http://icet.sandia.gov Site officiel IceT]&lt;br /&gt;
*[http://pixell.com Techniques wall display]&lt;br /&gt;
*[http://www.evl.uic.edu/cavern/sage/applications.php Site officiel Sage]&lt;br /&gt;
*[http://parismetropole2020.com/evenement/ Paris en wall-display grâce à Liquid Galaxy]&lt;br /&gt;
*[http://www.google.fr/earth/explore/showcase/liquidgalaxy.html Présentation - Doc : Liquid Galaxy]&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Tiled_Display&amp;diff=6721</id>
		<title>Tiled Display</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Tiled_Display&amp;diff=6721"/>
		<updated>2012-11-25T14:31:22Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Tiled Displays=&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est ce qu&#039;un tiled display ? ==&lt;br /&gt;
&lt;br /&gt;
=== Principe ===&lt;br /&gt;
Le principe est de créer un écran géant composé de plusieurs écrans plus petits. &lt;br /&gt;
&lt;br /&gt;
N&#039;importe quel écran peut être utilisé pour un wall display (il est tout de même nécessaire d&#039;adapter ensuite la technologie et les outils utilisés). Par exemple :&lt;br /&gt;
*les écrans d&#039;ordinateurs ou de télévisions&lt;br /&gt;
*plusieurs vidéoprojecteurs&lt;br /&gt;
*les écrans de téléphone mobile &lt;br /&gt;
&lt;br /&gt;
=== Exemples d&#039;utilisations ===&lt;br /&gt;
&lt;br /&gt;
Admettons que l&#039;intérêt est moindre avec un téléphone étant donnée la taille de son écran ! &lt;br /&gt;
On peut certainement en trouver une utilisation, par exemple faire une mini-table tactile... &lt;br /&gt;
&lt;br /&gt;
Les écrans de télévision sont très utilisé sur les plateaux de télévision, dans les stades ou encore dans le rue pour des affichages publicitaires par exemple. L&#039;intérêt par rapport à un vidéo-projecteur, est qu&#039;il aurait un très mauvais rendu dans ce type d&#039;environnement, à cause notamment des effets de lumières sur les plateaux de télévision et à cause de la forte luminosité dans les stades et dans la rue en plein jour. &lt;br /&gt;
&lt;br /&gt;
On peut aussi se servir d&#039;un wall display plus petit, 3, 4 écrans pour agrandir une surface de travail sur un ordinateur, utile pour les graphiste par exemple, ou encore pour jouer aux jeux vidéos. &lt;br /&gt;
&lt;br /&gt;
Une autre utilisation moins connut et de créer un énorme surface de travail avec des écrans multitouch. Cela permet de faire un mur interactif sur lequel chacun peut travailler en parallèle, tout en partageant directement leurs idées. &lt;br /&gt;
&lt;br /&gt;
=== Avantages ===&lt;br /&gt;
&lt;br /&gt;
Comme vue précédemment, le principale intérêt par rapport à un vidéoprojecteur est la luminosité. Un autre avantage important est la surface obtenue, qui peut être plus grande et quasi-illimité. &lt;br /&gt;
De plus les technlogie actuel ne permettent pas de faire autrement, les télévisions ne dépasse pas les 4 mètre et coûte extrêmement chère. (exemple : écran led à 8000€ pour 190cm de diagonal)&lt;br /&gt;
&lt;br /&gt;
== Un peu de techniques ==&lt;br /&gt;
&lt;br /&gt;
Il existes plusieurs techniques pour créer un wall display. Voici les trois plus importantes : &lt;br /&gt;
&lt;br /&gt;
=== Avoir plusieurs sorties vidéos sur son PC ===&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisateur doit avoir une ou plusieurs carte graphique et une sortie vidéo par écran. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Problèmes&#039;&#039;&lt;br /&gt;
* Le nombreux d&#039;écrans est très vite limités par les capacités de l&#039;ordinateur.&lt;br /&gt;
* Le coût peux vite devenir important.&lt;br /&gt;
&#039;&#039;Avantages&#039;&#039;&lt;br /&gt;
* Extrêmement facile à mettre en place &lt;br /&gt;
&lt;br /&gt;
=== Avec un serveur et un bon réseau ! ===&lt;br /&gt;
&lt;br /&gt;
Le flux vidéos est traité par un serveur que se charge de la diffusion vers les différents écrans. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Problèmes&#039;&#039;&lt;br /&gt;
* Demande un réseaux très haut débit dès que le nombre d&#039;écran devient important&lt;br /&gt;
* La mise en place n&#039;est pas faciles&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Avantages&#039;&#039;&lt;br /&gt;
* Une seul sortie vidéo nécessaire&lt;br /&gt;
* Moins onéreux&lt;br /&gt;
&lt;br /&gt;
=== Avec des vidéoprojecteurs ===&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation des vidéoprojecteurs ce fait dos à l&#039;écran. L&#039;image est alors inversée par les vidéoprojecteurs et les écrans se charges de présenter l&#039;image à l&#039;utilisateur. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Problèmes&#039;&#039;&lt;br /&gt;
* Très onéreux&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Avantages&#039;&#039;&lt;br /&gt;
* Moins de problèmes liée aux bordures des écrans&lt;br /&gt;
&lt;br /&gt;
== Quels sont les différents outils disponibles ? ==&lt;br /&gt;
&lt;br /&gt;
=== CGLX ===&lt;br /&gt;
&lt;br /&gt;
Pour Cross-Platform Cluster Graphics Library&lt;br /&gt;
* Open source&lt;br /&gt;
* Linux / MacOSX&lt;br /&gt;
&lt;br /&gt;
=== IceT ===&lt;br /&gt;
&lt;br /&gt;
Pour Image Composition Engine for Tiles&lt;br /&gt;
* Licence BSD&lt;br /&gt;
* Utilisé par ParaView et Vislt par exemple&lt;br /&gt;
* Windows / Linux / MacOSX&lt;br /&gt;
&lt;br /&gt;
=== Sage ===&lt;br /&gt;
&lt;br /&gt;
* Utilisé dans de nombreux logiciels par exemple VLC, VNC, MPlayer.&lt;br /&gt;
* Semble être les plus utilisés&lt;br /&gt;
* Windows / Linux&lt;br /&gt;
* Prise en main difficile&lt;br /&gt;
&lt;br /&gt;
=== Liquid Galaxy ===&lt;br /&gt;
&lt;br /&gt;
Crée et mise en place par google. Permet de créer un wall display de leurs logiciels Google Earth&lt;br /&gt;
&lt;br /&gt;
* Extrêmement simple à mettre en place&lt;br /&gt;
* Limité à Google Earth&lt;br /&gt;
&lt;br /&gt;
== Sources == &lt;br /&gt;
&lt;br /&gt;
* [vizworld.com vizworld]&lt;br /&gt;
* [vis.ucsd.edu]&lt;br /&gt;
* [icet.sandia.gov]&lt;br /&gt;
* [pixell.com]&lt;br /&gt;
* [evl.uic.edu]&lt;br /&gt;
* [parismetropole2020.com/evenement/]&lt;br /&gt;
* [google.fr/earth/explore/showcase/liquidgalaxy.html]&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Tiled_Display&amp;diff=6720</id>
		<title>Tiled Display</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Tiled_Display&amp;diff=6720"/>
		<updated>2012-11-25T13:39:15Z</updated>

		<summary type="html">&lt;p&gt;Maxence: Created page with &amp;quot;=Tiled Displays  == Qu&amp;#039;est ce qu&amp;#039;un tiled display ? ==  * Principe : Ecran géant composé e plusieurs écrans plus petits * Moyens :   + Ecrans d&amp;#039;ordinateurs  +   == Les différ…&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Tiled Displays&lt;br /&gt;
&lt;br /&gt;
== Qu&#039;est ce qu&#039;un tiled display ? ==&lt;br /&gt;
&lt;br /&gt;
* Principe : Ecran géant composé e plusieurs écrans plus petits&lt;br /&gt;
* Moyens : &lt;br /&gt;
 + Ecrans d&#039;ordinateurs&lt;br /&gt;
 + &lt;br /&gt;
&lt;br /&gt;
== Les différentes techniques ==&lt;br /&gt;
&lt;br /&gt;
== Comment ça marche ? ==&lt;br /&gt;
&lt;br /&gt;
== Quels sont les différents outils disponibles ? ==&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=BookOnCloud&amp;diff=6326</id>
		<title>BookOnCloud</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=BookOnCloud&amp;diff=6326"/>
		<updated>2012-10-23T12:54:57Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation : ==&lt;br /&gt;
Dans le cadre du projet ECOM, en RICM5, le site d&#039;e-commerce BookOnCloud voit le jour !&lt;br /&gt;
Il offre la possibilité de louer et d&#039;acheter des livres via Internet.&lt;br /&gt;
&lt;br /&gt;
== Equipe : ==&lt;br /&gt;
* HARRACHE	Salem&lt;br /&gt;
* PAZ	Elisabeth&lt;br /&gt;
* RAOUX	Maxence&lt;br /&gt;
* SEGALA-DUVERNEY	Joachim&lt;br /&gt;
&lt;br /&gt;
== Scrum ==&lt;br /&gt;
&lt;br /&gt;
* ScrumMaster : Maxence Raoux. On a choisi ce membre comme ScrumMaster car ila déjà travaillé avec une équipe qui utilisait la méthode Agile Scrum. Il pourra garantir le respect des bonnes pratiques de Scrum tout au long du projet. De plus il pourra être un bon facilitateur entre les membres de l&#039;équipe.&lt;br /&gt;
&lt;br /&gt;
* Durée sprint: 2 semaines. On a choisi une durée du sprint relativement courte afin d&#039;avoir des feedback courts de notre produit. Cela évite de s&#039;engager dans une mauvaise voie. Cependant on n&#039;a pas choisi une durée d&#039;une semaine car avec le reste de notre formation, cela nous semblait trop court.&lt;br /&gt;
&lt;br /&gt;
== Sprint 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
* Formation J2EE&lt;br /&gt;
* Réalisation d&#039;un client lourd&lt;br /&gt;
* Réalisation d&#039;un prototype d&#039;interface admin [http://imgur.com/a/popL8 Voir]&lt;br /&gt;
&lt;br /&gt;
=== Rétrospective ===&lt;br /&gt;
&lt;br /&gt;
==== Bien passée ====&lt;br /&gt;
&lt;br /&gt;
* Objectif du sprint atteint&lt;br /&gt;
* Prise d&#039;initiative des membres du projet&lt;br /&gt;
* Bonne communication entre les membres du projet&lt;br /&gt;
&lt;br /&gt;
==== A améliorer ====&lt;br /&gt;
&lt;br /&gt;
* Mauvaise répartition du travail&lt;br /&gt;
* Une démocratie pas toujours respectée&lt;br /&gt;
&lt;br /&gt;
== Sprint 2 == &lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
* Choix de l&#039;outil pour l&#039;application web&lt;br /&gt;
* Formation à l&#039;outil choisi&lt;br /&gt;
* Réalisation de la partie public du site épurée. (Accueil + Catalogue)&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=BookOnCloud&amp;diff=6325</id>
		<title>BookOnCloud</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=BookOnCloud&amp;diff=6325"/>
		<updated>2012-10-23T12:45:45Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Sprint 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation : ==&lt;br /&gt;
Dans le cadre du projet ECOM, en RICM5, le site d&#039;e-commerce BookOnCloud voit le jour !&lt;br /&gt;
Il offre la possibilité de louer et d&#039;acheter des livres via Internet.&lt;br /&gt;
&lt;br /&gt;
== Equipe : ==&lt;br /&gt;
* HARRACHE	Salem&lt;br /&gt;
* PAZ	Elisabeth&lt;br /&gt;
* RAOUX	Maxence&lt;br /&gt;
* SEGALA-DUVERNEY	Joachim&lt;br /&gt;
&lt;br /&gt;
== Scrum ==&lt;br /&gt;
&lt;br /&gt;
* ScrumMaster : Maxence Raoux. On a choisi ce membre comme ScrumMaster car ila déjà travaillé avec une équipe qui utilisait la méthode Agile Scrum. Il pourra garantir le respect des bonnes pratiques de Scrum tout au long du projet. De plus il pourra être un bon facilitateur entre les membres de l&#039;équipe.&lt;br /&gt;
&lt;br /&gt;
* Durée sprint: 2 semaines. On a choisi une durée du sprint relativement courte afin d&#039;avoir des feedback courts de notre produit. Cela évite de s&#039;engager dans une mauvaise voie. Cependant on n&#039;a pas choisi une durée d&#039;une semaine car avec le reste de notre formation, cela nous semblait trop court.&lt;br /&gt;
&lt;br /&gt;
== Sprint 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
* Formation J2EE&lt;br /&gt;
* Réalisation d&#039;un client lourd&lt;br /&gt;
* Réalisation d&#039;un prototype d&#039;interface admin [http://imgur.com/a/popL8 Voir]&lt;br /&gt;
&lt;br /&gt;
=== Rétrospective ===&lt;br /&gt;
&lt;br /&gt;
==== Bien passée ====&lt;br /&gt;
&lt;br /&gt;
* Objectif du sprint atteint&lt;br /&gt;
* Prise d&#039;initiative des membres du projet&lt;br /&gt;
* Bonne communication entre les membres du projet&lt;br /&gt;
&lt;br /&gt;
==== A améliorer ====&lt;br /&gt;
&lt;br /&gt;
* Mauvaise répartition du travail&lt;br /&gt;
* Une démocratie pas toujours respectée&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=BookOnCloud&amp;diff=6324</id>
		<title>BookOnCloud</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=BookOnCloud&amp;diff=6324"/>
		<updated>2012-10-23T12:43:09Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Présentation : ==&lt;br /&gt;
Dans le cadre du projet ECOM, en RICM5, le site d&#039;e-commerce BookOnCloud voit le jour !&lt;br /&gt;
Il offre la possibilité de louer et d&#039;acheter des livres via Internet.&lt;br /&gt;
&lt;br /&gt;
== Equipe : ==&lt;br /&gt;
* HARRACHE	Salem&lt;br /&gt;
* PAZ	Elisabeth&lt;br /&gt;
* RAOUX	Maxence&lt;br /&gt;
* SEGALA-DUVERNEY	Joachim&lt;br /&gt;
&lt;br /&gt;
== Scrum ==&lt;br /&gt;
&lt;br /&gt;
* ScrumMaster : Maxence Raoux. On a choisi ce membre comme ScrumMaster car ila déjà travaillé avec une équipe qui utilisait la méthode Agile Scrum. Il pourra garantir le respect des bonnes pratiques de Scrum tout au long du projet. De plus il pourra être un bon facilitateur entre les membres de l&#039;équipe.&lt;br /&gt;
&lt;br /&gt;
* Durée sprint: 2 semaines. On a choisi une durée du sprint relativement courte afin d&#039;avoir des feedback courts de notre produit. Cela évite de s&#039;engager dans une mauvaise voie. Cependant on n&#039;a pas choisi une durée d&#039;une semaine car avec le reste de notre formation, cela nous semblait trop court.&lt;br /&gt;
&lt;br /&gt;
== Sprint 1 ==&lt;br /&gt;
&lt;br /&gt;
* Formation J2EE&lt;br /&gt;
* Réalisation d&#039;un client lourd&lt;br /&gt;
* Réalisation d&#039;un prototype d&#039;interface admin [http://imgur.com/a/popL8 Voir]&lt;br /&gt;
&lt;br /&gt;
=== Rétrospective ===&lt;br /&gt;
&lt;br /&gt;
==== Bien passée ====&lt;br /&gt;
&lt;br /&gt;
* Objectif du sprint atteint&lt;br /&gt;
* Prise d&#039;initiative des membres du projet&lt;br /&gt;
* Bonne communication entre les membres du projet&lt;br /&gt;
&lt;br /&gt;
=== A améliorer ===&lt;br /&gt;
&lt;br /&gt;
* Mauvaise répartition du travail&lt;br /&gt;
* Une démocratie pas toujours respectée&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=5249</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=5249"/>
		<updated>2012-04-26T11:02:31Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Semaine 0==&lt;br /&gt;
*Choix du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 1==&lt;br /&gt;
*Rencontre avec Julie Fontecave-Jallon et les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Précision des spécification du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 2==&lt;br /&gt;
*Echange avec les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Prise en main d&#039;Android&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 3==&lt;br /&gt;
*Ébauche d&#039;un prototype d&#039;IHM&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 4==&lt;br /&gt;
*Prise en main avancée d&#039;Android (OpenGL)&lt;br /&gt;
*Création d&#039;un SVN&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ressources==&lt;br /&gt;
Rapport : [[File:Rapport-Raoux-Segala.pdf]]&amp;lt;br&amp;gt;&lt;br /&gt;
Poster : [[File:Poster-Raoux-Segala.pdf]]&amp;lt;br&amp;gt;&lt;br /&gt;
Flyer : [[File:Flyer-Raoux-Segala.pdf]]&amp;lt;br&amp;gt;&lt;br /&gt;
Presentation : [[File:Presentation-Raoux-Segala.pdf]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Maxence Raoux&amp;lt;br&amp;gt;&lt;br /&gt;
Joachim Segala&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://air.imag.fr/mediawiki/index.php/Education_%C3%A0_la_respiration Projet AMO : Education à la respiration]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=File:Presentation-Raoux-Segala.pdf&amp;diff=5248</id>
		<title>File:Presentation-Raoux-Segala.pdf</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=File:Presentation-Raoux-Segala.pdf&amp;diff=5248"/>
		<updated>2012-04-26T11:02:01Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=5247</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=5247"/>
		<updated>2012-04-26T10:59:22Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Semaine 0==&lt;br /&gt;
*Choix du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 1==&lt;br /&gt;
*Rencontre avec Julie Fontecave-Jallon et les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Précision des spécification du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 2==&lt;br /&gt;
*Echange avec les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Prise en main d&#039;Android&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 3==&lt;br /&gt;
*Ébauche d&#039;un prototype d&#039;IHM&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 4==&lt;br /&gt;
*Prise en main avancée d&#039;Android (OpenGL)&lt;br /&gt;
*Création d&#039;un SVN&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ressources==&lt;br /&gt;
Rapport : [[File:Rapport-Raoux-Segala.pdf]]&amp;lt;br&amp;gt;&lt;br /&gt;
Poster : [[File:Poster-Raoux-Segala.pdf]]&amp;lt;br&amp;gt;&lt;br /&gt;
Flyer : [[File:Flyer-Raoux-Segala.pdf]]&amp;lt;br&amp;gt;&lt;br /&gt;
Presentation : [[File:Presentation-Raoux-Segala]]&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Maxence Raoux&amp;lt;br&amp;gt;&lt;br /&gt;
Joachim Segala&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://air.imag.fr/mediawiki/index.php/Education_%C3%A0_la_respiration Projet AMO : Education à la respiration]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=5246</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=5246"/>
		<updated>2012-04-26T10:58:07Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Semaine 0==&lt;br /&gt;
*Choix du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 1==&lt;br /&gt;
*Rencontre avec Julie Fontecave-Jallon et les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Précision des spécification du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 2==&lt;br /&gt;
*Echange avec les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Prise en main d&#039;Android&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 3==&lt;br /&gt;
*Ébauche d&#039;un prototype d&#039;IHM&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 4==&lt;br /&gt;
*Prise en main avancée d&#039;Android (OpenGL)&lt;br /&gt;
*Création d&#039;un SVN&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ressources==&lt;br /&gt;
Rapport : [[File:Rapport-Raoux-Segala.pdf]]&amp;lt;br&amp;gt;&lt;br /&gt;
Poster : [[File:Poster-Raoux-Segala.pdf]]&amp;lt;br&amp;gt;&lt;br /&gt;
Flyer : [[File:Flyer-Raoux-Segala.pdf]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Maxence Raoux&amp;lt;br&amp;gt;&lt;br /&gt;
Joachim Segala&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://air.imag.fr/mediawiki/index.php/Education_%C3%A0_la_respiration Projet AMO : Education à la respiration]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=File:Flyer-Raoux-Segala.pdf&amp;diff=5245</id>
		<title>File:Flyer-Raoux-Segala.pdf</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=File:Flyer-Raoux-Segala.pdf&amp;diff=5245"/>
		<updated>2012-04-26T10:55:43Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=File:Poster-Raoux-Segala.pdf&amp;diff=5244</id>
		<title>File:Poster-Raoux-Segala.pdf</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=File:Poster-Raoux-Segala.pdf&amp;diff=5244"/>
		<updated>2012-04-26T10:55:06Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=File:Rapport-Raoux-Segala.pdf&amp;diff=5243</id>
		<title>File:Rapport-Raoux-Segala.pdf</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=File:Rapport-Raoux-Segala.pdf&amp;diff=5243"/>
		<updated>2012-04-26T10:54:05Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=5242</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=5242"/>
		<updated>2012-04-26T10:52:37Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Semaine 0==&lt;br /&gt;
*Choix du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 1==&lt;br /&gt;
*Rencontre avec Julie Fontecave-Jallon et les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Précision des spécification du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 2==&lt;br /&gt;
*Echange avec les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Prise en main d&#039;Android&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 3==&lt;br /&gt;
*Ébauche d&#039;un prototype d&#039;IHM&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 4==&lt;br /&gt;
*Prise en main avancée d&#039;Android (OpenGL)&lt;br /&gt;
*Création d&#039;un SVN&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ressources==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Maxence Raoux&amp;lt;br&amp;gt;&lt;br /&gt;
Joachim Segala&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://air.imag.fr/mediawiki/index.php/Education_%C3%A0_la_respiration Projet AMO : Education à la respiration]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4444</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4444"/>
		<updated>2012-02-06T16:40:18Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Semaine 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Semaine 0==&lt;br /&gt;
*Choix du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 1==&lt;br /&gt;
*Rencontre avec Julie Fontecave-Jallon et les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Précision des spécification du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 2==&lt;br /&gt;
*Echange avec les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Prise en main d&#039;Android&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 3==&lt;br /&gt;
*Ébauche d&#039;un prototype d&#039;IHM&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 4==&lt;br /&gt;
*Prise en main avancée d&#039;Android (OpenGL)&lt;br /&gt;
*Création d&#039;un SVN&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Maxence Raoux&amp;lt;br&amp;gt;&lt;br /&gt;
Joachim Segala&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://air.imag.fr/mediawiki/index.php/Education_%C3%A0_la_respiration Projet AMO : Education à la respiration]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4443</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4443"/>
		<updated>2012-02-06T16:39:40Z</updated>

		<summary type="html">&lt;p&gt;Maxence: /* Semaine 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Semaine 0==&lt;br /&gt;
*Choix du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 1==&lt;br /&gt;
*Rencontre avec Julie Fontecave-Jallon et les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Précision des spécification du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 2==&lt;br /&gt;
*Echange avec les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Prise en main d&#039;Android&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 3==&lt;br /&gt;
*Ébauche d&#039;un prototype d&#039;IHM&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 4==&lt;br /&gt;
*Prise en main avancée d&#039;Android (OpenGl)&lt;br /&gt;
*Création d&#039;un SVN&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Maxence Raoux&amp;lt;br&amp;gt;&lt;br /&gt;
Joachim Segala&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://air.imag.fr/mediawiki/index.php/Education_%C3%A0_la_respiration Projet AMO : Education à la respiration]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4441</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4441"/>
		<updated>2012-02-06T15:04:51Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Semaine 0==&lt;br /&gt;
*Choix du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 1==&lt;br /&gt;
*Rencontre avec Julie Fontecave-Jallon et les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Précision des spécification du projet&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 2==&lt;br /&gt;
*Echange avec les deux &amp;amp;eacute;tudiants 3i&lt;br /&gt;
*Prise en main d&#039;Android&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 3==&lt;br /&gt;
*Ébauche d&#039;un prototype d&#039;IHM&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Semaine 4==&lt;br /&gt;
*Prise en main avancée d&#039;Android&lt;br /&gt;
*Création d&#039;un SVN&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Maxence Raoux&amp;lt;br&amp;gt;&lt;br /&gt;
Joachim Segala&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://air.imag.fr/mediawiki/index.php/Education_%C3%A0_la_respiration Projet AMO : Education à la respiration]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4241</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4241"/>
		<updated>2012-01-17T15:10:57Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;&lt;br /&gt;
Maxence Raoux&amp;lt;br&amp;gt;&lt;br /&gt;
Joachim Segala&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://air.imag.fr/mediawiki/index.php/Education_%C3%A0_la_respiration Projet AMO : Education à la respiration]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4231</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4231"/>
		<updated>2012-01-17T14:57:02Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;&lt;br /&gt;
Maxence Raoux&amp;lt;br&amp;gt;&lt;br /&gt;
Joachim Segala&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[http://air.imag.fr/mediawiki/index.php/Education_%C3%A0_la_respiration Projet AMO : Education à la respiration]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4230</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4230"/>
		<updated>2012-01-17T14:56:02Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;&lt;br /&gt;
Maxence Raoux&amp;lt;br&amp;gt;&lt;br /&gt;
Joachim Segala&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
[http://air.imag.fr/mediawiki/index.php/Education_%C3%A0_la_respiration Projet AMO : Education à la respiration]&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4229</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4229"/>
		<updated>2012-01-17T14:55:27Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;&lt;br /&gt;
Maxence Raoux&amp;lt;br&amp;gt;&lt;br /&gt;
Joachim Segala&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;http://air.imag.fr/mediawiki/index.php/Education_%C3%A0_la_respiration&amp;gt;Projet AMO : Education à la respiration&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4227</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4227"/>
		<updated>2012-01-17T14:54:06Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Maxence Raoux&amp;lt;br&amp;gt;&lt;br /&gt;
Joachim Segala&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4224</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4224"/>
		<updated>2012-01-17T14:52:51Z</updated>

		<summary type="html">&lt;p&gt;Maxence: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Maxence Raoux&lt;br /&gt;
Joachim Segala&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
	<entry>
		<id>https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4221</id>
		<title>Proj-2011-2012-ProjetAMO</title>
		<link rel="alternate" type="text/html" href="https://air.imag.fr/index.php?title=Proj-2011-2012-ProjetAMO&amp;diff=4221"/>
		<updated>2012-01-17T14:51:38Z</updated>

		<summary type="html">&lt;p&gt;Maxence: Created page with &amp;quot;It&amp;#039;s works !&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It&#039;s works !&lt;/div&gt;</summary>
		<author><name>Maxence</name></author>
	</entry>
</feed>