ImagePulser V5.2.4
Simplification des images prises avec une webcam
|
Le but principal de ce projet est de vectoriser et de simplifier des images obtenues via webcam en utilisant des méthodes dynamiques, incluant notamment la simplification par segments. Ce processus trouve des applications variées dans la vie réelle telles que :
Nous souhaitons apporter une dimension interactive à ce projet. À cette fin, nous proposons la capture d'images via une webcam. Ces images sont ensuite converties en niveaux de gris avant d’être simplifiées grâce à différentes techniques de vectorisation et de simplification (décrites plus en détail dans la section sur les méthodes de simplification).
Notre projet, ImagePulser, s'inspire des avancées présentées lors de la conférence Google IO 2023, notamment en matière de détection d'objets dans les images. Les experts de Google ont détaillé une méthode selon laquelle les images sont d'abord filtrées et simplifiées en retirant les couleurs et les détails superflus, résultant en une image binaire composée uniquement de 0 et de 1, représentant respectivement le noir et le blanc. Cette simplification aide à préserver les informations essentielles tout en rendant les images plus accessibles pour l'analyse par un réseau neuronal, qui recherche ensuite des correspondances dans une base de données. Inspirés par cette technique de conservation d'information, nous avons développé ImagePulser pour exploiter ce principe de simplification et optimiser le traitement d'images.
Notre projet, ImagePulser, bénéficie d'une interface graphique conviviale développée pour simplifier la navigation et l'utilisation par les utilisateurs. Cette interface permet une interaction fluide et directe avec les fonctionnalités du logiciel, enrichissant l'expérience utilisateur.
L'interface a été développée en utilisant la bibliothèque GTK. Voici les étapes clés de sa mise en œuvre :
Notre système est composé de plusieurs programmes principaux qui partagent une base de code commune tout en fonctionnant de manière indépendante. Certains demandent des arguments lors de leur exécution tandis que d'autres non. Nous exploitons la fonctionnalité de sous-processus sur l'ordinateur pour activer plusieurs sous-programmes alors qu’un programme principal est déjà en cours d'exécution. Ainsi, les callbacks de l'interface graphique peuvent déclencher des processus en arrière-plan selon les besoins.
Plutôt que d'intégrer directement la logique de ces sous-programmes dans les fonctions de l'interface graphique, nous avons choisi de les maintenir séparés. Cette approche a significativement accéléré le développement en nous permettant de concentrer sur l'efficacité et la modularité du projet.
Pour atteindre les objectifs de notre projet, nous suivons les étapes ci-dessous :
Ces étapes constituent notre protocole pour transformer des images brutes en représentations simplifiées et facilement manipulables, adaptées à diverses utilisations techniques.
Pour développer notre solution de simplification d'images, nous avons décomposé le problème en sept tâches distinctes. Chaque tâche aborde un aspect spécifique du processus de simplification et de vectorisation des images. Les tâches sont organisées comme suit :
Problème : La webcam de notre ordinateur était de très haute qualité (beaucoup de pixels), ce qui a entraîné des difficultés lors de la manipulation des images capturées en raison de leur grande taille.
Solution : Nous avons réduit la résolution à 1080 pixels pour faciliter le traitement des images. Lors de l'implémentation du code sur un autre ordinateur équipé d'une webcam de moindre qualité, nous avons rencontré des erreurs de type "Call Dumped" dues à des ouvertures et fermetures répétitives de la caméra. Pour résoudre ce problème, nous avons encore diminué la résolution à 640 pixels, ce qui a permis une compatibilité avec la webcam du robot utilisé dans notre projet.
Problème : Les interactions avec l'interface graphique nécessitaient une communication efficace entre différentes tâches sans bloquer l'interface utilisateur.
Solution : Nous avons opté pour la création de différents exécutables, permettant de gérer des processus asynchrones. Cette approche a assuré une fluidité dans les interactions avec l'interface graphique, améliorant l'expérience utilisateur.
Problème : Compiler le même programme sur différents ordinateurs était un défi en raison des diverses versions de compilateurs disponibles.
Solution : Nous avons découvert que l'option -std=c++17
permettait de standardiser le processus de compilation en spécifiant la version du compilateur C++ à utiliser. De plus, l'intégration de file_inputs C dans notre code C++ posait problème.
Solution Complémentaire : Un Makefile a été créé pour compiler correctement les file_inputs avec gcc pour le C et g++ pour le C++, garantissant ainsi que les bonnes pratiques de compilation soient respectées pour chaque type de file_input.
Problème : La transformation des images capturées en format PBM était complexe, surtout pour des images de haute résolution qui exigeaient une gestion optimale de la mémoire.
Solution : Initialement, nous utilisions le codec P1 pour les images PBM, qui s'est avéré inadéquat pour des images de haute qualité. Après quelques tests, nous avons opté pour le codec P4, qui s'est révélé beaucoup plus efficace pour gérer des images à haute résolution sans surcharger la mémoire.
Problème : Les courbes de bezier de degré 2 sont parametrés de 3 points de control. D'autre côtè, PostScript syntax attendait au moins 4 points pour une courbe qui n'etait pas le cas pour les courbes de bezier de degré 4.
Solution : On a fait une recherche, et on adecouverte que c'est possible de convertir une courbe de bezier de degré 2 vers une courbe de bezier de degré 3. C'est bien la fonction conversion_bezier2_to_bezier3
Voici quelques tests qu'on a effectué pendant le development du projet.
Ce test permet de vérifier si la fonction de visualisation d'une image PBM sur le terminal fonctionne correctement, ainsi que de voir si la création d'une image négative de l'image originale est correcte. Pour l'appeler, on utilise la commande suivante :
Vérification des fonctions de géométrie 2D. Appel :
Voici les resultats:
On peut remarquer qu'effectivement le calcul est correct.
Vérification de la création des fichiers PostScript valides suivant deux méthodes de remplissage : "stroke" et "fill". Voici les résultats :
PBM Originale | EPS Stroke |
---|---|
Vérification de l'approximation d'un segment par une courbe de Bézier de degré 2. Étant donné les points d'un segment :
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|---|
Pi | (0,0) | (1,0) | (1,1) | (1,2) | (2,2) | (3,2) | (3,3) | (4,3) | (5,3) |
Le traitement en logiciel Mathematica est le suivant :
Et les resultats obtenus sont:
i | Ci,1 | ωi |
---|---|---|
1 | (7080, −360)/1680 | 14/64 = 0.21875 |
2 | (3080, 3639)/1680 | 24/64 = 0.375 |
3 | (1064, 5656)/1680 | 30/64 = 0.46875 |
4 | (2520, 4200)/1680 | 32/64 = 0.5 |
5 | (3752, 2968)/1680 | 30/64 = 0.46875 |
6 | (840, 5880)/1680 | 24/64 = 0.375 |
7 | (1320, 5400)/1680 | 14/64 = 0.21875 |
Donc, le point de controle C1 obtenu est = (2600, 4120)/1680 ≃ (1.547619, 2.452381)
Ce test réalise la même chose que test_approx.c sauf qu'il est pour les courbes de Bézier de degré 3. Pour le même exemple on a:
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|---|
Pi | (0,0) | (1,0) | (1,1) | (1,2) | (2,2) | (3,2) | (3,3) | (4,3) | (5,3) |
Le traitement en logiciel Mathematica est le suivant :
et le programme fournit les données suivantes:
Indice i | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
d(Pi, Ci(t)) | 0.588 | 0.100 | 0.726 | 0.045 | 0.722 | 0.186 | 0.070 |
À noter que Ci(t) est le calcul du point courant pour l'indice i de l'algorithme.
Le point P3 est le point le plus éloigné de la courbe de Bézier, et dmax ≃ 0, 726.
Comme dans tout projet, nous avons rencontré des défis techniques en cours de route. Cependant, ces obstacles nous ont également ouvert de nouvelles perspectives pour l'avenir de notre projet. Voici quelques pistes pour aller plus loin :
Ces développements futurs nous permettraient d'améliorer la performance et l'applicabilité de notre projet de recherche , ouvrant ainsi la voie à des innovations encore plus significatives dans le domaine de la simplification et de la vectorisation des images.