Added to doc

This commit is contained in:
2023-04-06 14:00:58 +02:00
parent f7d1f3e42e
commit c31011537e
18 changed files with 229 additions and 0 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 963 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 B

+229
View File
@@ -947,3 +947,232 @@ Note: le traitement commence à devenir long, il serait peut-être intéressant
Après on peut toujours tester de rajouter du multicore processing mais c'est pour une autre fois.
Demain je m'occupe de règler les soucis que j'ai avec la prescision de ces temps au tour et j'éspère pouvoir m'occuper aussi de la position des pneus et du DRS. J'aimerais finir tout ca cette semaine.
## Jeudi 6 Avril
Une idée m'est passée par la tête pendant que je dormais, dans la liste des pilotes, quand ils sont à plus d'un tour de retard avec le leader (Ce qui arrive normalement dans presque tous les Grand Prix) on a pas des minutes mais une string qui montre "+1 Lap" ou "+2Laps" ce qui est évidemment un problème.
Je pense qu'une bonne facon d'envoyer l'info serait de retourner -1 -2etc... à la place des milisecondes, mais encore faut-il detecter le nombre de tours
Je devrais être en train de commencer la documentation de commment tout ce que j'ai fait fonctionne. Cependant je ne me vois pas faire ca tant que je n'ai pas au moins récupèré toutes les infos au moins un peu proprement. Cela veut dire que je commence officiellement à prendre du retard. (Sachant que si je finis tout aujourd'hui une journée de doc suffira largement le terme est un peu exagèré mais bon)
Bon pour la reconnaissance des temps c'est spécial...
Le filtre semble ne pas changer grand chose ce qui est problématique et ca n'est vraiment pas fiable.
Voici quelques expemples avec un treshold de 100:
!["11ZSD"](./Images/Screens/11ZSD.png)
Cette image est comprise comme "11ZSD"
![42340](./Images/Screens/42340.png)
Cette image est comprise comme "42340"
!["ZZAEB"](./Images/Screens/ZZAEB.png)
Et celle ci "ZZAEB"...
Ce qui... n'est pas bon du tout...
J'ai essayé de trouver un fichier d'entrainement spécifiquement fait pour les digits. J'ai essayé de blacklister les chars non voulus pour tenter d'obliger Tesseract à trouver des chiffres.
Avec la première option, les résultats ne sont pas meilleurs voire pires.
Avec la seconde option c'est déja pas mal mieux mais on perd complètement la possibilité de detecter les mots comme "LEADER" ou "LAP" et de toute facon ca n'est pas parfait.
Le soucis c'est que si je n'ai pas des données fiables c'est juste impossible de faire des calculs et de l'affichage correct...
Il faut absolument que je trouve une solution.
J'ai essayé d'utiliser de l'interpolation our augmenter la taille de l'image et ensuite appliquer mon filtre pour retirer le flou mais sans succès...
Pourtant la on se retrouve avec des images plutôt claires :
!["Clear1"](./Images/Screens/Clear44301.png)
Ici le programme trouve "44301"
!["Clear2"](./Images/Screens/ClearA5157.png)
Et ici "A5151"...
On a toujours les mêmes problèmes.
Bon je suis allé me renseigner sur l'OCR et je me suis dit que j'allais tenter de faire les choses proprement.
Je vais faire passer plusieurs étapes de postProcessing avant de donner l'image à Tesseract.
- GrayScale
- Tresholding
- InvertColors
- Scaling
- Dilatation
Ce qui donne :
!["Original"](./Images/Screens/BeforeProcessing1.png)
!["Grayscale"](./Images/Screens/GrayScale.png)
!["InvertColors"](./Images/Screens/InvertColor.png);
!["Resize"](./Images/Screens/Scaling.png);
!["Dilatation"](./Images/Screens/Dilatation.png)
Ce qui ne change : *Roulement de tambour* RIEN kjd viuwvuirnvoirenbf
Tout ca pour rien...
C'EST BON !!!
Bon en fait au final le problème était une mauvaise configuration de Tesseract. Je vais devoir un peu nettoyer tout ca. Mais avec les changements de l'image on a des résultats BEAUCOUP plus précis et potentiellement utilisables.
La je vais devoir faire un serieux travail de nettoyage et simplification de mon code par ce que la c'est vraiment un chantier vu le nombre de choses que j'ai du essayer.
J'ai du aussi beaucoup modifier la gestion de l'image ce qui donne :
!["Clean"](./Images/Screen/../Screens/Clean.png)
Et la on a des résultats qui sont vraiment bons.
J'ai pu ajouter assez facilement la detection de position comme c'est simplement un chiffre.
On se retrouve maintenant avec ce genre de retours :
```Text
Position : 1
Gap to leader : 8:33:51
Lap time : 2:19:123
DRS : False
Tyre : Undefined laps with the tyre : 0
Driver name : LECLERC
Sector 1 : 0:31:828
Sector 2 : 0:42:940
Sector 3 : 0:0:0
Position : 2
Gap to leader : 0:3:259
Lap time : 23:12:392
DRS : False
Tyre : Undefined laps with the tyre : 0
Driver name : VERSTAPPEN
Sector 1 : 0:38:119
Sector 2 : 0:0:0
Sector 3 : 0:0:0
```
Il ne manque plus que l'implémentation de la reconnaissance du DRS et des Pneus
Et non... je viens de me rendre compte que mon programme a encore cassé car le tap time ne peut pas être 23 min lol.
J'ai un nouveau magnifique problème... Les points et les deux points sont interprêtés comme des chiffres ... Give me a F****** break...
J'ai du mal à comprendre pourquoi ils ne sont détectés comme tels que maintenant.
Bon alors il semblerait les temps au tour aie besoin d'un ordre très précis pour fonctionner.
- Grayscale
- InvertColors
- Tresholding
- Resize * 2
- Resize * 2
Et la on a des résultats un peu mieux.
Bon demain il faut absolument que je me charge de règler tous ces problèmes et que je commence la reconnaissance des pneus et de DRS par ce que je commence à être en retard.
## Vendredi 6 Avril 2023
Alors aujourd'hui c'est le dernier jour avant de commencer à être en retard pour de bon.
J'ai réussi à règler le problème des temps au tour, des gaps, et des secteurs. Dans le processus j'ai cassé la detection de position mais ca devrait pas être TROP compliqué.
Et voila ...
Après seulement plus de dix heures de galère, si on donne cette image au programme et le bon JSON le programme nous retourne :
```Text
Position : 1
Gap to leader : 0:05:059
Lap time : 1:39:123
DRS : False
Tyre : Undefined laps with the tyre : 0
Driver name : LECLERC
Sector 1 : 0:31:828
Sector 2 : 0:42:940
Sector 3 : 0:00:000
Position : 2
Gap to leader : 0:03:259
Lap time : 1:39:392
DRS : False
Tyre : Undefined laps with the tyre : 0
Driver name : VERSTAPPEN
Sector 1 : 0:31:749
Sector 2 : 0:00:000
Sector 3 : 0:00:000
```
Evidemment le GapToLeader est faux sur leclerc car il est leader mais bon ca je pourrai toujours Hardcoder que le premier a jamais de GapToLeader.
Bon j'ai eu beaucoup de soucis que je ne vais pas mentionner ici car ce sont simplement des soucis de logique de programmation pour trouver un DRS ouvert ou non.
Au final la technique que j'utilise et qui marche plutôt bien pour le DRS est que je prend la première image de DRS et je la déclare comme valeur étalon d'un DRS non actif, en effet dans 99% des cas le leader n'a pas de DRS (cela peut arriver alors il faudra donc juste verifier que les pilotes sont bien à moins de deux secondes les uns des autres pour confirmer).
Ensuite cette valeur étalon je la calcule en fonction du nombre de pixels verts dans l'image et si il y a plus de 30% de pixels verts en plus c'est que le DRS est activé ex:
Ceci est un DRS fermé:
!["Closed DRS"](./Images/Screens/DRSFalse.png)
Ceci est un DRS ouvert:
!["Open DRS"](./Images/Screens/DRSTrue.png)
Cela marche à peu près tout le temps mais dans le pire des cas on peut toujours verifier que les pilotes sont bien proches pour detecter les potentiels rares cas de faux positifs.
J'ai pu augmenter les performances en utilisant un seul engine pour tout le monde et en arrêtant d'utiliser GetPixel et SetPixel qui sont simplement des horreurs à utiliser. Mais elles ne sont pas encore bonnes
Le soucis avec la detection de pneus cependant, c'est qu'il n'est pas possible d'utiliser la reconnaissance pour savoir ou regarder la couleur car cela ne marcherait pas.
Je ne peux pas faire trop de post processing car je dois conserver la couleur
Je ne peux pas hardocder un endroit ou aller regarder car cela évolue tout le long du Grand Prix.
Bref c'est la galère. En y réflechissant je me suis dit qu'une bonne idée pourrait être de partir de la droite de la zone du pneu en regardant au milieu de la hauteur. Puis continuer vers la gauche jusqu'à ce que je rencontre une couleur différente. Je pourrai ensuite faire une zone un peu vers la gauche qui devrait contenir les infos du pneu et sur laquelle il sera possible de faire de le reconnaissance de couleur et de la reconnaissance de chiffres.
J'ai déterminé que le background n'était jamais plus clair que #505050 et que donc nimporte quelle couleur qui aurait plus que 50 dans un seul des channels serait considèrée comme une couleur cassant le background
Pour arriver à cette conclusion je me suis amusé un peu avec les couleurs pour jouer avec les limites de mon algorythme :
!["Color fun"](./Images/Screens/TestsCouleurs.png)
Et je crois que j'ai eu une bonne idée, avec une petite methode bien faite on arrive à de supers résultats :
```Csharp
private Rectangle FindTyreZone()
{
Bitmap bmp = WindowImage;
int currentPosition = bmp.Width;
int height = bmp.Height / 2;
Color limitColor = Color.FromArgb(0x50,0x50,0x50);
Color currentColor = Color.FromArgb(0,0,0);
Size newWindowSize = new Size(bmp.Height,bmp.Height);
while(currentColor.R <= limitColor.R && currentColor.G <= limitColor.G && currentColor.B <= limitColor.B && currentPosition > 0)
{
currentPosition--;
currentColor = bmp.GetPixel(currentPosition,height);
}
//Its here to let the new window include a little bit of the right side
int offset = Convert.ToInt32((float)newWindowSize.Width / 100f * 20f);
int CorrectedX = currentPosition - (newWindowSize.Width - offset);
if (CorrectedX <= 0)
return new Rectangle(0,0,newWindowSize.Width,newWindowSize.Height);
return new Rectangle(CorrectedX,0,newWindowSize.Width,newWindowSize.Height);
}
```
!["Tyres"](./Images/Screens/TyresImages.png)
Maintenant cela devrait être beaucoup plus simple de trouver la couleur générale et le nombre de tours.