1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
|
This is a log file created for the "Texturize" plugin for the GIMP.
Since this plugin is the result of a project for a Computer Vision
course in a French university (and since its LOG file shouldn't be useful
for anybody except the two students who worked on this project), this
file is written in French.
Ceci est le fichier de LOG de la création du greffon "Texturize". Les
changements sont dans l'ordre chronologique inverse.
############################ ###########################
############################ 2025/03/28 ###########################
############################ ###########################
+ Fixed plug-in for GIMP-3.
############################ ###########################
############################ 2005/02/01 ###########################
############################ ###########################
+ Réalisation de la page web dédiée au plugin.
+ Nettoyage global du code (versions précédentes, débuggage).
+ Finalisation de la traduction en français.
+ Nettoyage de graphcut.cpp. Les lignes sont moins longues
(mais toujours plus que 80 caractères).
############################ ###########################
############################ 2005/01/31 ###########################
############################ ###########################
* On affiche un message d'erreur quand on rencontre une image avec une
couche alpha (au lieu de traiter l'image tout de même, incorrectement).
* Retour à la version précédente de la barre de progression.
+* La page web du plugin commence à s'étoffer de quelques explications,
d'exemples et d'une capture d'écran.
+ Le patch et l'image final sont désormais des guchar*
(et non des guchar***). Le greffon tourne environ 5 fois plus vite.
J'ai donc enlevé la recommandation d'aller boire un café :-)
+ Le poids d'une arrête tient compte du gradient local : le greffon
coupe maintenant préférentiellement le long des bords des objets.
+ L'image finale n'est plus initialisée en blanc. Le code est toujours
présent pour les prochaines sessions de débuggage.
############################ ###########################
############################ 2005/01/30 ###########################
############################ ###########################
+ La barre de progression est plus régulière (on utilise l'ordonnée du
dernier pixel rempli au lieu du pourcentages de pixels remplis).
############################ ###########################
############################ 2005/01/29 ###########################
############################ ###########################
+ La coupe min tient désormais compte des anciennes coupes, même sur la
première passe (remplissage de l'image avant de chercher à cacher les
mauvaises coutures).
+ rempli est maintenant un guchar** (et non un int**).
+ Nettoyage de offset.c.
############################ ###########################
############################ 2005/01/27 ###########################
############################ ###########################
+ J'ai (péniblement) ajouté la détermination de la coupe de poids
minimal. La construction des sommets est une petite horreur de gestion
des indices si l'on tente de rester propre.
+ Corrigé un bug pour que la taille par défaut de la nouvelle image soit
par défaut 2 fois la taille de l'image initiale, même si on ne touche
pas à la boîte de dialogue.
############################ ###########################
############################ 2005/01/25 ###########################
############################ ###########################
+ Rationalisation des noms des variables. Celles concernant l'image
d'origine (le "patch") se terminent par _p, celle concernant l'image
finale par _i.
Corrigé le bug qui faisait coller les patch du haut tous à la même
ordonnée (ie collés contre le bord). Maintenant ils peuvent déborder.
+* Journée de travail à deux physiquement à côté. Nettoyages divers dans
le code.
############################ ###########################
############################ 2005/01/18 ###########################
############################ ###########################
* C'est bon, l'offset marche ! J'ai aussi implémenté la méthode de JB
qui consiste non plus à remplir l'image ligne par ligne mais à remplir
toujours à partir du pixel vide le plus en haut à gauche :
effectivement, ça marche mieux ! Bon, on approche du but, mais il reste
encore les graph cut à implémenter (ou plutôt faire le lien avec le code
déjà disponible) et essayer de se souvenir des coutures déjà faites
(ça, ce sera le plus chaud).
############################ ###########################
############################ 2005/01/16 ###########################
############################ ###########################
* J'ai commencé à implémenter la fonction d'offset (ajout du fichier
offset.c). C'est un calcul bête et méchant de similarité entre deux
images (somme des différences de chaque couple de pixel, en valeur
absolue). Mais il y a pas mal de sous-cas à traiter pour vérifier qu'on
ne fait pas de segmentation fault, qu'on ne sort pas de l'image, etc.
############################ ###########################
############################ 2005/01/15 ###########################
############################ ###########################
* Voilà, à ce stade j'ai un greffon qui ne fait rien de super intéressant
(il se contente de répéter l'image de départ jusqu'à remplir la nouvelle
image) mais dont le résultat est propre, qui marche aussi pour de très
grandes images et qui affiche une belle barre de progression. Demain,
j'essaierai de trouver du temps pour rendre la fonction "offset" plus
intéressante (calcul des corrélations, ie du produit de convolution, en
fait).
* La fonction gimp_pixel_rgn_set_rect, qui sert à placer une zone de
mémoire dans un rectangle de l'image, n'est pas très futée : on lui dit
quel rectangle de l'image de destination il faut mettre à jour, mais si
la zone de mémoire n'a pas exactement la même taille, il essaie quand
même de placer tous les pixels et ça fait du coup des effets bizarres
(les sortes de distorsions que j'observais tout à l'heure). Il faut donc
à chaque fois tronquer la zone de mémoire en fonction de la zone de
l'image de destination qu'on va occuper. C'est réparé.
* J'ai ajouté une barre de progression qui renseigne sur le traitement
de l'image : ça fait plus classe :)
* La plupart des fonctions utiles sont posées, mais encore à l'état
d'esquisse. Ce que fait le greffon pour l'instant, c'est simplement
recopier l'image de départ dans la nouvelle jusqu'à remplissage total.
Il y a des distorsions curieuses à droit de l'image, il faut que je
règle ça. Prochaine grande étape : faire une fonction de calcul d'offset
intelligente.
* Maintenant que les basses sont bien posées et que je comprends comment
interagir avec le Gimp, ça devient un peu plus amusant :) Je commence à
poser les bases des fonctions dont j'aurai besoin, les différentes
boucles, l'architecture du projet.
* En plus de placer l'image de départ en (0,0), je colore le reste en
tout blanc pour partir sur un bon point de départ (sinon les autres
pixels sont aléatoires et c'est un peu dégueu). Ça été l'occasion de
comprendre (à la dure, et avec moult essais/erreurs) comment sont
organisées les structures de données qui représentent des images : où
sont les deux coordonnées, où sont les canaux de couleur. Bref, encore
une fois ce n'était pas du tout, mais vraiment pas du tout documenté ni
expliqué nulle part, donc il m'a fallu un certain nombre d'essais et
d'images immondes pour comprendre comment ça marchait, et avant
d'arriver à faire du blanc bien pur !
* J'ai trouvé le problème : je travaillais sur une image GIF, à couleurs
indexées (qui provenait d'ailleurs de la page web de l'article sur
lequel on se base). L'algo serait censé marcher pour tous les types
d'images (je gère un nombre de canaux quelconque), mais ici ça ne
marche pas, je ne sais pas pourquoi. J'ai donc mis un message d'erreur
quand on essaie d'appliquer le greffon sur une image à couleurs indexées,
je ne vois pas comment résoudre le problème pour l'instant.
* J'ai donc bien une nouvelle image qui s'ouvre, mais j'ai maintenant
des problèmes pour récupérer les données de l'image de départ et les
refourguer à la nouvelle. Plus précisément, j'arrive à récupérer les
données (en les affichant avec des printf, c'est bon), mais je n'arrive
pas à les remettre dans la nouvelle image. La gestion de la mémoire
n'est vraiment pas très sympa : si on veut aller chercher les pixels
dans un rectangle de mémoire, c'est à base de tableau[i*taille_ligne +
j*taille_colonne + k] avec k variant de 0 au nombre de canaux (RGB,
etc.). Il y a bien des procédures toutes faites pour lire un
rectangle d'une région initialisée, et l'écrire dans une autre, mais la
gestion de la mémoire derrière est telle que ce n'est vraiment pas
évident de savoir quel type de zone mémoire il faut utiliser pour
stocker ces données (ça, ça marche pour l'instant) et donner à manger à
la procédure d'écriture (ça, ça ne marche pas)... Je sens que je vais
m'empêtrer dans les pointeurs et les malloc exotiques :-p
############################ ###########################
############################ 2005/01/14 ###########################
############################ ###########################
* Dernière modification de la journée : j'ai finalement choisi de demander à
Gimp d'ouvrir une nouvelle image, au lieu de m'emmerder avec l'image
actuelle. C'était vraiment une journée galère, j'ai un peu pété les
plombs, et tout ça n'est vraiment pas bien documenté (probablement à
cause de la nouvelle version -- 2.2 -- qui vient de sortir). J'essaierai
de faire un bon tutoriel d'écriture d'un greffon Gimp, ça manque
*vraiment*. J'ai donc implémenté mon idée d'ouvrir une nouvelle image
avec directement la bonne taille, c'est un peu plus subtil à coder mais
ça marche : pour l'instant une nouvelle image (toute noire) s'ouvre.
* Bon, la compilation remarche (automake, autoconf, etc., c'est bon).
Mais pour une raison que je ne comprends pas, il ne veut absolument pas
me laisser écrire en C++ un fichier déjà présent dans l'archive (le
fichier render.c que j'ai essayé de renommer en render.cpp), même en
changeant tout ce qu'il faut dans les Makefile et autre configure.in...
Bon, ben il faudra que je me passe du C++ pour ce fichier-là, j'ai déjà
passé trop de temps à essayer de lui faire manger mon render.cpp, sans
succès.
* Les fichiers qui calculent le flot max (ou la coupe de poids min) sont
en C++ alors que le greffon est fait pour être programmé en C. J'ai
passé beaucoup de temps à changer ce qu'il faut (et à comprendre quoi
changer !) dans les fichiers configure.in, Makefile.am, etc. C'est
compliqué ces trucs-là, et automake, autoconf sont encore bien obscurs
pour moi (sans compter le script autogen.sh inclus dans le
template). Bref, pour que ça marche chez tout le monde quand on fait
./configure && make && make install, y a toute une machinerie derrière,
très complexe, et j'ai un peu les doigts coincés dedans :)
* Ce qui est vraiment difficile, c'est qu'aucun des greffons que j'ai
trouvés (y compris tous les greffons livrés avec The Gimp) ne
redimensionnent l'image de départ : l'image d'arrivée a exactement la
même taille. Or c'est la principale difficulté à laquelle je suis
confronté : le redimensionnement apporte des problèmes d'initialisation
des "drawable" que j'essaie de résoudre par plusieurs moyens
(agrandissement de l'image pour ensuite effacer des pixels,
agrandissement de l'image mais en gardant l'original dans un coin --
dans ce dernier cas j'ai un mal fou à demander à Gimp de me laisser
écrire dans les autres pixels, etc.), mais pour l'instant sans succès.
############################ ###########################
############################ 2005/01/13 ###########################
############################ ###########################
* J'ai passé pas mal de temps pour comprendre comment marchaient les
choses sous Gimp (et je n'ai pas fini !). Bref, j'ai enfin réussi à
demander à mon greffon de redimensionner l'image (il faut aller fouiller
dans les librairies de Gimp, c'est mal documenté, la doc correspond à
une version antérieure et plein de trucs ont changé depuis... bref ce
n'est pas évident).
############################ ###########################
############################ 2005/01/11 ###########################
############################ ###########################
* Je crée le fichier "texturize.h" pour regrouper le prototype de toutes
les fonctions et les trucs communs à tous les fichiers source (en
particulier pour faire le lien entre le greffon lui-même et l'algo de
graph cut que j'utilise).
* Il y a aussi les problèmes d'internationalisation : dans le
sous-dossier "po", il y a la traduction de tous les messages dans plein
de langues. Je vais faire l'anglais (fichier de départ) et le français.
* Je modifie la fenêtre de dialogue de base (avec plein d'exemples de
curseurs) pour mettre juste la taille de la nouvelle image et poser la
bonne question. J'enlève les définitions de variables inutiles.
* J'inclus les sources de "maxflow" (algo de calcul du flot max) dans
le répertoire du greffon ; je mets les deux sous-répertoires
(adjacency-list et forward-star) et je fais des liens symboliques vers
les éléments de adjacency-list (c'est le plus gourmand en RAM, mais le
plus rapide). Je compile... Ah, c'est du code C++ donc j'installe le
paquet g++, je recompile... C'est bon, il fallait ajouter la ligne
"AC_PROG_CXX" au fichier configure.in. Je ne pige pas trop comment
fonctionne automake, configure, etc. mais maintenant que ça marche, je
ne touche plus :)
############################ ###########################
############################ 2005/01/07 ###########################
############################ ###########################
* Pour commencer à me familiariser avec la structure des fichiers
main.c, render.c, interface.c, etc., je change déjà les textes de
façade (nom du greffon, nom des auteurs, etc.). Je commence à voir un
peu comment ça marche.
* Ça ne fonctionne toujours pas (./config râle : ma version de GIMP est
trop ancienne). J'installe donc tous ces paquets (et gimp) en version
unstable. Bon, ça va mieux : j'ai fait ./configure, make, sudo make
install et tout va bien. Le nouveau greffon "plug-in template" apparaît
bien dans la loiste des plug-ins disponibles, dans le GIMP, avec un
exemple de boîte de dialogue très bien fait.
* Installation de plusieurs paquets liés au développement sous GIMP (je
ne sais pas lesquels sont vraiment utiles mais ça ne marchait pas dans
au moins l'un d'entre eux) :
sudo apt-get install libgimp2.0-dev libglib2.0-dev libgtk1.2-dev
libgtkgl2.0-dev
* J'ai commencé par changer la licence (donnée dans le fichier COPYING)
en la GPL, un peu plus adaptée à notre projet, il me semble.
* J'ai donc téléchargé le "plugin template" depuis le site officiel des
développeurs de GIMP.
LocalWords: guchar débuggage offset.c ie JB fault gimp rgn rect
LocalWords: printf RGB malloc
|