reconnaissance de forme [flash] - Web design - Graphisme
Marsh Posté le 18-08-2004 à 12:42:48
Tu peux être plus explicite?
Marsh Posté le 18-08-2004 à 12:43:58
dessiner une forme simple à la souris qui soit reconnue (genre un carré, un triangle, cf. le lien joint) et l'associer à une action.
Marsh Posté le 18-08-2004 à 13:06:04
Comme dans le jeu Black & White?
Marsh Posté le 18-08-2004 à 13:07:48
Euh... doit y avoir un bon petit algo derrière pour faire des analogies de forme... Parc'que les tracés à la souris...
Marsh Posté le 18-08-2004 à 13:11:36
probablement.
Les tracés de souris c un peu la galère
des idées sur le "bon petit algo" ?
Marsh Posté le 18-08-2004 à 13:47:42
Tu enregistes le tracé de souris comme une image N&B et tu fais une comparaison avec les autres formes... A ce moment là ça relève plus des algos de reconnaissance de caractère... cf pda...
Marsh Posté le 18-08-2004 à 13:49:48
enregistrer un clip comme image NB c faisable ça ???
Marsh Posté le 18-08-2004 à 13:50:25
yep... il me semble bien...
Marsh Posté le 18-08-2004 à 13:50:38
y'a bien des API de dessin en flash...
Marsh Posté le 18-08-2004 à 13:51:22
la seule différence, c'est que là tu ne fais pas apparaître le tracé...
Marsh Posté le 18-08-2004 à 13:53:13
Je vais peut-etre demander au type qui l'a déjà fait en fait. Je vaixlui envoyer un mail à partir de son site. sait-on jamais
Marsh Posté le 18-08-2004 à 13:58:45
Bon courage...
Marsh Posté le 18-08-2004 à 14:19:50
A mon humble avis, ça ne fonctionne pas en mode bitmap et il n'y a pas de reconnaissance de caractère sur des pixels.
Je pense que c'est vectoriel : par exemple pour les traits / et \, je peux (enfin "on" peut) mémoriser la position de la souris lors du click down et celle lors du click up. Si le click up est à gauche et en bas du click down alors il s'agit de / sinon c'est \.
On peut aller plus loin avec des formes à plusieurs traits. Le principe est de reconnaitre une forme en ne mémorisant qu'un certain nombre de points de celle-ci, la position relative des points entre eux (où est un point par rapport au précédent) et la longueur du trait entre deux points.
Evidemment, pour que la reconnaissance soit souple, il faudra ajouter une certaine tolérance d'erreur (exemple, un triangle pas tout à fait fermé, une droite non rectiligne, etc ...).
Je pense qu'il vaut mieux chercher dans cette voie-là !
Marsh Posté le 18-08-2004 à 14:52:55
Et comment tu détermines qu'il faut prendre la valeur dans un virage (genre coin de triangle)?
Marsh Posté le 18-08-2004 à 15:54:50
Heu ... j'étais pas en train de faire une théorie hein ! ^^ C'est juste que si je devais chercher, j'irais dans cette voie-là.
Pour ta question : sur l'animation du gars, on voit clairement que la position de la souris est mémorisée tous les X centièmes de secondes (ça peut être des dizièmes, j'en sais rien -_-) : le trait est en fait une succession de petits vecteurs qui lient deux points.
Donc le gars récupère tous les points et même plus qu'il n'en faut (pour une droite par exemple, il n'en faut que deux, mais le gars en capture bien plus)(c'est normal !).
Après il faut analyser tous ces points. Voici une petite proposition : chaque vecteur a une direction et un point de départ (le point précédent !). Quand on passe de point en point, on peut récupérer l'angle qui se forme entre les différents vecteurs. C'est grâce à ces angles et à la longueur des segments que l'on peut suivre la courbe :
- dans le cas d'une droite, la somme des N premiers vecteurs (infos importantes : angle + longueur) forme un vecteur qui ne s'écarte pas trop de l'alignement avec le vecteur de la somme des N-1 premiers éléments. Un vecteur formé par la somme de X vecteur constitue donc la direction générale induite par plusieurs points/vecteurs.
- lors d'un changement de direction, le vecteur somme des N premiers vecteurs s'écarte trop (au-delà d'une constante) du vecteur somme des N-1 premiers éléments. L'angle détecté est trop gros pour qu'on puisse le tolérer dans ce qui pourrait être une droite. Il s'agit donc d'un changement de direction.
Dans l'algorithme, on peut suivre ces idées avec ceci : dès qu'un changement de directtion est détecté, les multiples points sources sont remplacés par le vecteur unique (somme des N-1 points) et ensuite on continue l'analyse des points qui suivent. Mais le premier point est alors le Nième, plus le premier évidemment.
Normalement, à la fin, on obtient la forme générale. Il suffit alors de la comparer avec une forme pré-enregistrée en comparant le nombre de points et la position relative de ceux-ci lors du parcours des deux trajets.
Tout ceci permet d'avoir des droites pas parfaitement rectilignes, de détecter des coins .. et de différencier les coins très arrondis des coins "pointus".
Evidemment, ça demande un peu de "dosage" pour que la détection soit parfaite : des chemins bien choisis (favoriser les grands angles), des constantes et des valeurs de tolérance adaptées, etc ...
Marsh Posté le 18-08-2004 à 16:17:25
héhé
Je suis "le gars" en question.
J'ai reçu un mail d'un arthur pour me dire qu'il avait posté la question sur ce forum.
Je savais même pas qu'il y avait du Flash sur HFR d'habitudes je fréquente que le Achat/vente
Bon ça remonte déjà un peu à loin pour moi. J'avais fait ça en novembre 2003, et Yannick_frere, si tu devais chercher tu emprunterais la bonne voie
Au départ c'est du setInterval pour récupérer les points à intervales régulier et les stocker dans un tableau.
Après je "nettoie le signal", en prenant les points 3 à 3 et on considèrant les 2 vecteurs supports des 2 segments composés par les 3 points. Je fais simplement un produit scalaire entre les 2 que je compare à une valeur fixe. Si le produit sclaire est trop important, les 2 vecteurs sont proches, donc on considère que les 3 pts sont alignés et je vire le point du milieu. Et je continue comme ça sur l'ensemble du tableau.
A la fin il ne reste nécessairement plus que les points qui font les angles de la forme (où les plus proches de ces coins puisqu'avec les SetIntervale c'est des données discrètes qu'on utilise).
A la fin je compare ce tableau (et ses permutations circulaires ainsi que son "inverse" et ses permutations pour la cas où la figure est dessinée dans l'autre sens) aux éléments d'une banque de tableau préétablie. Et je calcule la similarité la plus grande pour savoir quelle forme est dessinée.
voilou
Marsh Posté le 18-08-2004 à 16:28:09
Merci d'être passé nous éclairer
Ta manière de faire est carrément plus simple =)
Marsh Posté le 18-08-2004 à 17:13:48
Pour la comparaison tu fais comment? Tu mets ton signal de réf et le signal nettoyé à même échelle d'après la distance entre 2 points et après tu accordes une zone de tolérance autour de chaque point?
Marsh Posté le 18-08-2004 à 18:38:34
Pour la comparaison finale, pas la peine de s'embêter à tout remettre à la même échelle. Comme je compare à tous les éléments de la banque où les vecteurs sont eux tous à la même échelle (généralement vecteur de norme 1 rarement 2) et que je garde le meilleur résultat, on n'est pas obligé de faire une mise à l'échelle.
Grosso modo, un petit "w" ressemblera toujours plus à un grand "W" qu'à un petit m.
Après c'est toujours le même système de produit scalaire (le produit scalaire c'est la base des de tous les systèmes de reconnaissances, sauf que là on reste dans un espace vectoriel "classique" mais pour de la reconnaissance de visage on peut utiliser pour dimension l'écartement des yeux, la taille de la bouche etc...).
Si je me souviens bien je crois que je fais une moyenne pondérée des produits scalaires de chaque "paire" de vecteurs (celui du tracé et celui de la référence).
Notons que s'il n'y a pas le même nombre de traits dans la figure que dans la référence, c'est même pas la peine de faire le test
Marsh Posté le 19-08-2004 à 10:05:34
Marsh Posté le 19-08-2004 à 14:04:06
arf
Marsh Posté le 18-08-2004 à 12:34:13
Bonjour, j'aimerai faire un système de reconnaissance de forme sous flash pour une navigation.
J'ai déjà vu un système similaire lors du concours de flash aux eMagiciens de Valencienne. Y'a un truc visible là : http://jbspieser.free.fr/interactivite.html#webjam
Quelqu'un aurait-une idée comment on fait ça ?
Merci