Prog en C++ Reconnaissance de caractères
Le listing est en comm sous la video.
Sans trop faire d'effort pour dessiner proprement la bonne lettre sort environ un peu plus de 4 fois sur 5.
Le principe de base pour identifier quelle lettre de l'alphabet représente le caractère dessiné est de le comparer avec un modèle type de lettre pour les 26 de l'alphabet. En bas apparaissent en blanc les 26 lettres modèles de l'alphabet sur lesquelles se calquent en bleu 26 fois le caractère créé, ce qui permet d'apprécier les différences.
Dans ce programme je commence par tracer dans un carré de 50x50 mais "grossi 2x" des pixels qui ne feront plus que 25x25 maximum. minx, max,miny,maxy représentent les coordonnées extrêmes en x et y de tous les pts dessinés en blanc. L'instruction getpixel me donne la couleur de coordonnées i,j, si c2 vaut 15 (blanc) alors je l'empile et ainsi pour tous les pts de mon dessin dans dex[n] et dey[n]. J'ai à la fin n pixel pour mon caract dessiné.
Comme je dois pouvoir le tracer n'importe où dans le rectangle de 50x50 il faut que je soustrais minx et miny pour avoir ses valeurs indépendamment de sa position.
Ensuite, concernant maintenant les caractères des lettres-modèle, leur données sont stockées dans les variables à 2 dimensions lxi[i][j],lyi[i][j] et lxf[i][j], lyf[i][j] représentant les 2 pts d'une droite (pt de départ et pt final) représentant pour la lettre i (i allant de 1 à la 26ième lettre de l'alphabet) le j ième trait concerné. Les lettres modèles sont ainsi mémorisées à cette étape par une suite de traits situés entre 2pts. Chaque lettre est définie par en général de 3 à 6 traits et dans un carré de 10x10.
La 1ère chose à faire puisque le programme reconnait des caract dessinés quelque soit sa taille est d'adapter les caract modèle à celle du dessin, ainsi une mise à l'échelle des lettres modèle se fait par le coeff cf. A noter que lorsque la valeur du pt initial d'un trait lxi[i][k] pour la lettre i vaut 99, ce code entré en data avec les autres données indique donc que k-1 était le dernier trait du caract modèle.
L'étape suivante consiste à définir chacune des 26 lettres modèles non plus par une suite de traits mais par une suite de pixels stockés dans mox[i][o],moy[i][o] (pour pouvoir justement les comparer avec mes pixels dex et dey du caract dessiné). Pour ce faire je pars du pt ini lxi[i][k],lyi[i][k] du k ième trait et je vais jusqu'au pt final lxf[i][k],lyf[i][k] correspondant au trait k courant de la lettre i. Je fais le parcours selon les x si le trait est plus horizontal que vertical et selon les y sinon. De même il est utile de savoir quelle est l'abscisse ou l'ordonné la plus petite pour que faire croître x ou y soit possible.
Je me retrouve donc à la fin avec o pixels de coordonnées mox[i][o], moy[i][o] pour la lettre modèle i.
Il ne reste plus qu'à comparer la distance entre le caract dessiné et chaque lettre modèle et sélectionner la lettre modèle dont la distance totale des pts avec les pts du caract dessiné est la plus petite.
Une boucle générale incrémentée en i va prendre les 26 lettres modèles de l'alphabet et où dist[i] représentera au final cette distance avec le caract à identifier. Une 2nde boucle prend un par un les n pts de mon caractère dessiné, puis une 3ième boucle j va sélectionner l'indice o parmi les pts mox[i][j],moy[i][j] correspondant au pt de la lettre modèle dont la distance dd est la plus petite du pt dex[k],dey[k] de mon dessin. En sortant de cette boucle cette distance min est additionnée à dist[i] et en sortant de la boucle supérieure cette variable dist [i] donnera la distance entre chaque pt de mon caract et le pt le plus proche de la lettre modèle i . Je rajoute quand même la valeur de 3 multipliée par la différence entre le nbre de pts de mon caract et celui de la lettre modèle i actuelle pour que la concordance entre le nbre de pts des 2 caractères soit aussi un peu prise en compte.
Au final je fais un tri croissant dans la variable dist[i] et en parallèle avec la var de caractère ch[i] correspondant à la lettre de l'alphabet (indexée selon i de 1 pour A à 26 pour Z) et j'affiche les 5 lettres dont la correspondance avec mon caract est la plus grande soit la distance dist[i] la plus faible pour chaque lettre i (elle est affichée elle aussi), puis j'affiche au final la plus faible ayant donc l'indice 1 : ch[1].
C'est cette lettre de l'alphabet qui sera finalement la plus proche du caract qu'il fallait identifier.
Other Videos By Xavier Foisset
| 2017-09-13 | sunshowers Solitudes Dan Gibson [no pub] |
| 2017-08-30 | Mystica les voix mystérieuses |
| 2017-07-13 | Unknown musics |
| 2017-06-21 | Sound of the galaxy |
| 2016-06-29 | L'univers s'est-il créé tout seul ? (with subtitles) |
| 2016-02-02 | Silver pc 1999 infogrames walkthrough HD complet |
| 2015-08-05 | Les expériences de morts provisoires |
| 2015-07-20 | Space shuttle simulator Landing |
| 2015-06-22 | Programme C++ Billard |
| 2015-04-18 | Batman Arkham Origins - All boss fight |
| 2014-09-16 | Prog en C++ Reconnaissance de caractères |
| 2014-04-11 | Mass Effect 1 (dlc Pinnacle) Ahern mission - Insanity |
| 2013-08-25 | Tour de Hanoi algorithme |
| 2013-02-27 | Tibet au Tibet Pc |
| 2013-01-21 | SpaceForce RU complete walkthrough Fr Part 3/3 |
| 2013-01-20 | SpaceForce RU complete walkthrough Fr Part 2/3 |
| 2013-01-19 | SpaceForce RU complete walkthrough (Fr) Part 1/3 |
| 2012-12-25 | Trainz Railroad2008 Montparnasse (nuit) |
| 2012-12-24 | Tintin et le temple du soleil PC infogrames |
| 2012-11-05 | La geste d'Artillac jeu Thomson |
| 2012-10-17 | Bactron jeu complet |

