From 40c7e3df81c35338b412f6bcaa7251c27447cec5 Mon Sep 17 00:00:00 2001 From: maxluli Date: Fri, 9 Jun 2023 11:51:55 +0200 Subject: [PATCH] Added a new table of figures script --- GenerateFiguresTable.py | 34 + TableDesFigures.md | 247 + docs/jdb.md | 45 +- mkdocs.yml | 2 +- site/404.html | 21 +- site/CahierDesCharges.html | 23 +- site/Code/ConfigurationTool.html | 15 +- site/Code/DataWrapper.html | 11 +- site/Code/DriverData.html | 11 +- site/Code/DriverDrsWindow.html | 11 +- site/Code/DriverGapToLeaderWindow.html | 11 +- site/Code/DriverLapTimeWindow.html | 11 +- site/Code/DriverNameWindow.html | 11 +- site/Code/DriverPositionWindow.html | 11 +- site/Code/DriverSectorWindow.html | 11 +- site/Code/DriverTyresWindow.html | 11 +- site/Code/F1TVEmulator.html | 11 +- site/Code/Form1.html | 11 +- site/Code/OcrImage.html | 11 +- site/Code/Reader.html | 11 +- site/Code/Settings.html | 11 +- site/Code/SqliteStorage.html | 11 +- site/Code/Window.html | 11 +- site/Code/Zone.html | 11 +- site/Code/recoverCookiesCSV.html | 11 +- .../DiagrammeGénéral.png:Zone.Identifier | 0 .../Figma/DiagrammeOCR.png:Zone.Identifier | 0 .../DiagrammeRecupImages.png:Zone.Identifier | 0 .../DiagrammeTraitement.png:Zone.Identifier | 0 .../Figma/TimeRepartition.png:Zone.Identifier | 0 .../ZonesStuctureDiagram.png:Zone.Identifier | 0 .../Photos/BicubicExample.png:Zone.Identifier | 0 .../BicubicExample1.webp:Zone.Identifier | 0 .../BicubicExample2.webp:Zone.Identifier | 0 .../Photos/Csharp_Logo.png:Zone.Identifier | 0 site/Images/Photos/Firefox_logo_dev.png | Bin 326185 -> 74348 bytes .../Firefox_logo_dev.png:Zone.Identifier | 0 .../Photos/HardTyre.png:Zone.Identifier | 0 .../Photos/HardTyreColor.png:Zone.Identifier | 0 .../IntermediateTyre.png:Zone.Identifier | 0 .../IntermediateTyreColor.png:Zone.Identifier | 0 .../InterpolationExemple.png:Zone.Identifier | 0 .../Photos/MediumTyre.png:Zone.Identifier | 0 .../MediumTyreColor.png:Zone.Identifier | 0 .../Photos/Pupetteer_Logo.png:Zone.Identifier | 0 site/Images/Photos/Python_Logo.png | Bin 36805 -> 29982 bytes .../Photos/Python_Logo.png:Zone.Identifier | 0 site/Images/Photos/SQLite_Logo.png | Bin 44173 -> 27385 bytes .../Photos/SQLite_Logo.png:Zone.Identifier | 0 site/Images/Photos/Selenium_Logo.png | Bin 156812 -> 12961 bytes .../Photos/Selenium_Logo.png:Zone.Identifier | 0 .../Photos/SoftTyre.png:Zone.Identifier | 0 .../Photos/SoftTyreColor.png:Zone.Identifier | 0 .../TresholdExemple1.webp:Zone.Identifier | 0 .../TresholdExemple2.webp:Zone.Identifier | 0 site/Images/Photos/Tyres.png:Zone.Identifier | 0 .../Images/Photos/WetTyre.png:Zone.Identifier | 0 .../Photos/WetTyreColor.png:Zone.Identifier | 0 site/Images/Photos/photosCroquisPoster1jpg | Bin 915885 -> 0 bytes site/Images/Photos/photosCroquisPoster2jpg | Bin 1376360 -> 0 bytes site/Images/Screens/ChromiumLogo.png | Bin 5161 -> 35821 bytes ...eLapTimeBeforeUpscaled.png:Zone.Identifier | 0 site/Images/Screens/F1TVHIGHERRES.png | Bin 14583 -> 24692 bytes site/Images/Screens/F1TVHIGHRES.png | Bin 8306 -> 11462 bytes site/Images/Screens/F1TVLOWRES.png | Bin 7304 -> 6888 bytes site/Images/Screens/FigmaLogo.png | Bin 13872 -> 10050 bytes .../Screens/FigmaLogo.png:Zone.Identifier | 0 site/Images/Screens/FirefoxLogo.png | Bin 13691 -> 82856 bytes .../Screens/FirefoxLogo.png:Zone.Identifier | 0 .../Screens/GPTLogo.png:Zone.Identifier | 0 .../MainZoneExample.png:Zone.Identifier | 3 - .../Screens/Perfect11But5.jpg:Zone.Identifier | 0 .../Screens/TyreColors.png:Zone.Identifier | 0 .../headless-firefox.jpg:Zone.Identifier | 4 - site/Images/Screens/logo.png:Zone.Identifier | 4 - site/Images/Screens/vsCodelogo.png | Bin 38531 -> 17437 bytes site/ManuelUtilisateur.html | 115 +- site/index.html | 415 +- site/jdb.html | 523 +- site/pdf/document.pdf | 36304 ++++++---------- site/search/search_index.json | 2 +- site/sitemap.xml.gz | Bin 127 -> 127 bytes site/tof.html | 1303 + 83 files changed, 16509 insertions(+), 22749 deletions(-) create mode 100644 GenerateFiguresTable.py create mode 100644 TableDesFigures.md delete mode 100644 site/Images/Figma/DiagrammeGénéral.png:Zone.Identifier delete mode 100644 site/Images/Figma/DiagrammeOCR.png:Zone.Identifier delete mode 100644 site/Images/Figma/DiagrammeRecupImages.png:Zone.Identifier delete mode 100644 site/Images/Figma/DiagrammeTraitement.png:Zone.Identifier delete mode 100644 site/Images/Figma/TimeRepartition.png:Zone.Identifier delete mode 100644 site/Images/Figma/ZonesStuctureDiagram.png:Zone.Identifier delete mode 100644 site/Images/Photos/BicubicExample.png:Zone.Identifier delete mode 100644 site/Images/Photos/BicubicExample1.webp:Zone.Identifier delete mode 100644 site/Images/Photos/BicubicExample2.webp:Zone.Identifier delete mode 100644 site/Images/Photos/Csharp_Logo.png:Zone.Identifier delete mode 100644 site/Images/Photos/Firefox_logo_dev.png:Zone.Identifier delete mode 100644 site/Images/Photos/HardTyre.png:Zone.Identifier delete mode 100644 site/Images/Photos/HardTyreColor.png:Zone.Identifier delete mode 100644 site/Images/Photos/IntermediateTyre.png:Zone.Identifier delete mode 100644 site/Images/Photos/IntermediateTyreColor.png:Zone.Identifier delete mode 100644 site/Images/Photos/InterpolationExemple.png:Zone.Identifier delete mode 100644 site/Images/Photos/MediumTyre.png:Zone.Identifier delete mode 100644 site/Images/Photos/MediumTyreColor.png:Zone.Identifier delete mode 100644 site/Images/Photos/Pupetteer_Logo.png:Zone.Identifier delete mode 100644 site/Images/Photos/Python_Logo.png:Zone.Identifier delete mode 100644 site/Images/Photos/SQLite_Logo.png:Zone.Identifier delete mode 100644 site/Images/Photos/Selenium_Logo.png:Zone.Identifier delete mode 100644 site/Images/Photos/SoftTyre.png:Zone.Identifier delete mode 100644 site/Images/Photos/SoftTyreColor.png:Zone.Identifier delete mode 100644 site/Images/Photos/TresholdExemple1.webp:Zone.Identifier delete mode 100644 site/Images/Photos/TresholdExemple2.webp:Zone.Identifier delete mode 100644 site/Images/Photos/Tyres.png:Zone.Identifier delete mode 100644 site/Images/Photos/WetTyre.png:Zone.Identifier delete mode 100644 site/Images/Photos/WetTyreColor.png:Zone.Identifier delete mode 100644 site/Images/Photos/photosCroquisPoster1jpg delete mode 100644 site/Images/Photos/photosCroquisPoster2jpg delete mode 100644 site/Images/Screens/ExempleLapTimeBeforeUpscaled.png:Zone.Identifier delete mode 100644 site/Images/Screens/FigmaLogo.png:Zone.Identifier delete mode 100644 site/Images/Screens/FirefoxLogo.png:Zone.Identifier delete mode 100644 site/Images/Screens/GPTLogo.png:Zone.Identifier delete mode 100644 site/Images/Screens/MainZoneExample.png:Zone.Identifier delete mode 100644 site/Images/Screens/Perfect11But5.jpg:Zone.Identifier delete mode 100644 site/Images/Screens/TyreColors.png:Zone.Identifier delete mode 100644 site/Images/Screens/headless-firefox.jpg:Zone.Identifier delete mode 100644 site/Images/Screens/logo.png:Zone.Identifier create mode 100644 site/tof.html diff --git a/GenerateFiguresTable.py b/GenerateFiguresTable.py new file mode 100644 index 0000000..0ec53c6 --- /dev/null +++ b/GenerateFiguresTable.py @@ -0,0 +1,34 @@ +import os +import re + +def generate_figure_table(directory): + table = [] + + figure_pattern = r'!\[([^\]]*)\]\(([^\)]*)\)' + + for root, dirs, files in os.walk(directory): + for file in files: + if file.endswith(".md"): + file_path = os.path.join(root, file) + with open(file_path, "r") as md_file: + content = md_file.readlines() + for line in content: + matches = re.findall(figure_pattern, line) + for match in matches: + alt_text = match[0] + image_path = match[1] + table.append([alt_text, image_path, file_path]) + + if table: + headers = ["Texte alternatif", "Chemin de l'image", "Fichier Markdown"] + with open("TableDesFigures.md", "w") as file: + file.write("| " + " | ".join(headers) + " |\n") + file.write("|" + "|".join(["---"] * len(headers)) + "|\n") + for row in table: + file.write("| " + " | ".join(row) + " |\n") + print("Le fichier figure_table.md a été généré avec succès.") + else: + print("Aucune figure trouvée dans les fichiers Markdown.") + +# Exemple d'utilisation +generate_figure_table("./docs") diff --git a/TableDesFigures.md b/TableDesFigures.md new file mode 100644 index 0000000..771e71f --- /dev/null +++ b/TableDesFigures.md @@ -0,0 +1,247 @@ +| Texte alternatif | Chemin de l'image | Fichier Markdown | +|---|---|---| +| "Page de lancement" | ./Images/Manual/StartPage.png | ./docs/ManuelUtilisateur.md | +| "Contrôles" | ./Images/Manual/Controls.png | ./docs/ManuelUtilisateur.md | +| "Page principale de la F1TV" | ./Images/Manual/F1TvMainPage.png | ./docs/ManuelUtilisateur.md | +| "Page d'un Grand Prix sur la F1TV" | ./Images/Manual/F1TvGpPage.png | ./docs/ManuelUtilisateur.md | +| "Page suspecte (Pas de panique, elle ne l'est pas)" | ./Images/Manual/SuspectCmd.png | ./docs/ManuelUtilisateur.md | +| "Début du programme" | ./Images/Manual/StartOfSimulation.png | ./docs/ManuelUtilisateur.md | +| "Arrêt du programme" | ./Images/Manual/Stopeed.png | ./docs/ManuelUtilisateur.md | +| "Page de config vide" | ./Images/Manual/EmptySettingsPage.png | ./docs/ManuelUtilisateur.md | +| "Invite de commande suspecte, mais normale" | ./Images/Manual/SettingsPageWithCmdOpen.png | ./docs/ManuelUtilisateur.md | +| "Page de config amorcée" | ./Images/Manual/SettingsPageWithStartedF1TV.png | ./docs/ManuelUtilisateur.md | +| "Texte indiquant le nombre de points qu'il reste à ajouter" | ./Images/Manual/2PointsRemaining.png | ./docs/ManuelUtilisateur.md | +| "Infographie expliquant où placer les points de la zone principale" | ./Images/Manual/WhereToDrawMainZone.png | ./docs/ManuelUtilisateur.md | +| "Texte qui ne doit pas être dans la zone sélectionnée" | ./Images/Manual/ForbiddenZone.png | ./docs/ManuelUtilisateur.md | +| "Zone principale avec les zones de pilotes automatiquement calculées" | ./Images/Manual/DriverZones.png | ./docs/ManuelUtilisateur.md | +| "Image d'une zone de pilote" | ./Images/Manual/DriverZone.png | ./docs/ManuelUtilisateur.md | +| "Texte indiquant le nombre de windows à ajouter" | ./Images/Manual/9WindowsRemaining.png | ./docs/ManuelUtilisateur.md | +| "Exemple de fenêtres découpées" | ./Images/Manual/Windows.png | ./docs/ManuelUtilisateur.md | +| "Menu d'interaction avec la liste de pilotes" | ./Images/Manual/DriverListControls.png | ./docs/ManuelUtilisateur.md | +| "Image de la page de config après avoir ajouté toutes les infos" | ./Images/Manual/SettingsReady.png | ./docs/ManuelUtilisateur.md | +| "Exemple de ce à quoi peut ressembler un loading et l'affichage bizarre que ça implique" | ./Images/Manual/LoadedPreset.png | ./docs/ManuelUtilisateur.md | +| "Image de l'application en cours de fonctionnement depuis quelques minutes" | ./Images/Manual/Simulation.png | ./docs/ManuelUtilisateur.md | +| "Image de la fenêtre des cinq derniers tours" | ./Images/Manual/LastFiveLAps.png | ./docs/ManuelUtilisateur.md | +| "Fenêtre des batailles" | ./Images/Manual/Battles.png | ./docs/ManuelUtilisateur.md | +| "Fenêtre des infos pilote" | ./Images/Manual/DriverInfos.png | ./docs/ManuelUtilisateur.md | +| "Exemple d'affichage des secteurs d'un temps au tour" | ./Images/Manual/LapInfos.png | ./docs/ManuelUtilisateur.md | +| "Fenêtre du classement en direct" | ./Images/Manual/LiveRanking.png | ./docs/ManuelUtilisateur.md | +| "Exemple commentaires" | ./Images/Screens/ExampleLiveTicker.png | ./docs/CahierDesCharges.md | +| "Data channel exemple" | ./Images/Screens/Formula1DataChannel.png | ./docs/CahierDesCharges.md | +| "Proto" | ./Images/Figma/Prototype.png | ./docs/CahierDesCharges.md | +| "Exemple mkdocs" | ./Images/Screens/MkdocsExample.png | ./docs/jdb.md | +| "Croquis Poster 1" | ./Images/Photos/photosCroquisPoster1jpg | ./docs/jdb.md | +| "Croquis Poster 2" | ./Images/Photos/photosCroquisPoster2jpg | ./docs/jdb.md | +| "Image non traitée" | ./Images/Screens/BlackToWhite0.png | ./docs/jdb.md | +| "Image traitée laxiste" | ./Images/Screens/BlackToWhite1.png | ./docs/jdb.md | +| "Image traitée stricte" | ./Images/Screens/BlackToWhite2.png | ./docs/jdb.md | +| "Screenshot de reconnaisance d'image complete" | ./Images/Screens/TextRecognition1.png | ./docs/jdb.md | +| "Screenshot de reconnaissance d'image cropée" | ./Images/Screens/TextRecognition0.png | ./docs/jdb.md | +| "Screenshot de reconnaissance de Tsunoda" | ./Images/Screens/TextRecognition2.png | ./docs/jdb.md | +| "Tsunoda en 720P" | ./Images/Screens/720PTsunoda.png | ./docs/jdb.md | +| "Tsunoda en 1080P" | ./Images/Screens/1080PTsunoda.png | ./docs/jdb.md | +| "Reconnaissance Tsunoda en 1080P" | ./Images/Screens/TextRecognition3.png | ./docs/jdb.md | +| "Tsunoda 1080P avec filtre" | ./Images/Screens/TextRecognition4.png | ./docs/jdb.md | +| "Leclerc 1080P avec filtre" | ./Images/Screens/TextRecognition5.png | ./docs/jdb.md | +| "Leclerc 1080P avec filtre 2" | ./Images/Screens/TextRecognition6.png | ./docs/jdb.md | +| "Tentative de reconnaisance du timing" | ./Images/Screens/TimingRecognition0.png | ./docs/jdb.md | +| "Tentative 2 de reconnaissance du timing" | ./Images/Screens/TimingRecognition1.png | ./docs/jdb.md | +| "Reconnaissance du timing au tour" | ./Images/Screens/TimingRecognition2.png | ./docs/jdb.md | +| "Main zone" | ./Images/Figma/WindowZoneExplanation1.png | ./docs/jdb.md | +| "Driver zone #1" | ./Images/Figma/WindowZoneExplanation2.png | ./docs/jdb.md | +| "Driver windows" | ./Images/Figma/WindowZoneExplanation3.png | ./docs/jdb.md | +| "Diagramme d'explications" | ./Images/Figma/WindowZoneExplanationDiagram.png | ./docs/jdb.md | +| "MainZone avec carrés de texte" | ./Images/Screens/AutoCalibration1.png | ./docs/jdb.md | +| "MainZone avec de meilleurs carrés" | ./Images/Screens/AutoCalibration2.png | ./docs/jdb.md | +| "MainZone avec de meilleurs carrés" | ./Images/Screens/AutoCalibration3.png | ./docs/jdb.md | +| "MainZone avec un seul carré par ligne" | ./Images/Screens/AutoCalibration4.png | ./docs/jdb.md | +| "Mainzone auto calibrée" | ./Images/Screens/AutoCalibration5.png | ./docs/jdb.md | +| "Images pilotes" | ./Images/Screens/WindowsPilotes.png | ./docs/jdb.md | +| "Zone d'un pilote" | ./Images/Screens/driver2.png | ./docs/jdb.md | +| "Sainz coupé" | ./Images/Screens/data0Sainz.png | ./docs/jdb.md | +| "Perez coupé" | ./Images/Screens/data0Perez.png | ./docs/jdb.md | +| "Ocr tester screenshot" | ./Images/Screens/OCRTestingScreen.png | ./docs/jdb.md | +| "Dossier Perez" | ./Images/Screens/PerezFolder.png | ./docs/jdb.md | +| "Tentative d'auto calibration" | ./Images/Screens/AutoCalibration6.png | ./docs/jdb.md | +| "Tentative 2" | ./Images/Screens/AutoCalibration7.png | ./docs/jdb.md | +| "Resultat final" | ./Images/Screens/AutoCalibration8.png | ./docs/jdb.md | +| "Verstappen folder" | ./Images/Screens/VerstappenFolder.png | ./docs/jdb.md | +| "JSON decode result" | ./Images/Screens/JsonDecodeResult.png | ./docs/jdb.md | +| "Centered driver" | ./Images/Screens/CenteredDriver.png | ./docs/jdb.md | +| "Uncentered Driver" | ./Images/Screens/UncenteredDriver.png | ./docs/jdb.md | +| "Verstappen folder 2 | ./Images/Screens/VerstappenFolder2.png | ./docs/jdb.md | +| "Image reconnaissance propre" | ./Images/Screens/ImageDecoding1.png | ./docs/jdb.md | +| "11ZSD" | ./Images/Screens/11ZSD.png | ./docs/jdb.md | +| 42340 | ./Images/Screens/42340.png | ./docs/jdb.md | +| "ZZAEB" | ./Images/Screens/ZZAEB.png | ./docs/jdb.md | +| "Clear1" | ./Images/Screens/Clear44301.png | ./docs/jdb.md | +| "Clear2" | ./Images/Screens/ClearA5157.png | ./docs/jdb.md | +| "Original" | ./Images/Screens/BeforeProcessing1.png | ./docs/jdb.md | +| "Grayscale" | ./Images/Screens/GrayScale.png | ./docs/jdb.md | +| "InvertColors" | ./Images/Screens/InvertColor.png | ./docs/jdb.md | +| "Resize" | ./Images/Screens/Scaling.png | ./docs/jdb.md | +| "Dilatation" | ./Images/Screens/Dilatation.png | ./docs/jdb.md | +| "Clean" | ./Images/Screen/../Screens/Clean.png | ./docs/jdb.md | +| "Closed DRS" | ./Images/Screens/DRSFalse.png | ./docs/jdb.md | +| "Open DRS" | ./Images/Screens/DRSTrue.png | ./docs/jdb.md | +| "Color fun" | ./Images/Screens/TestsCouleurs.png | ./docs/jdb.md | +| "Tyres" | ./Images/Screens/TyresImages.png | ./docs/jdb.md | +| "Tyre colors" | ./Images/Screens/TyreColors.png | ./docs/jdb.md | +| "5i t'inquiètes" | ./Images/Screens/Perfect11But5.jpg | ./docs/jdb.md | +| "Avec background" | ./Images/Screens/TyreWithBackground.png | ./docs/jdb.md | +| "Sans background" | ./Images/Screens/TyreWithoutBackground.png | ./docs/jdb.md | +| "Super 11" | ./Images/Screens/Recognised11.png | ./docs/jdb.md | +| "Super H" | ./Images/Screens/RecognisedH.png | ./docs/jdb.md | +| "Super M" | ./Images/Screens/RecognisedM.png | ./docs/jdb.md | +| "Poster V1" | ./Images/Figma/PosterV1.png | ./docs/jdb.md | +| "Poster V2" | ./Images/Figma/PosterV2.png | ./docs/jdb.md | +| "Empty F1TV" | ./Images/Screens/EmptyF1TV.png | ./docs/jdb.md | +| "diformed 11" | ./Images/Screens/Diformed11_1.png | ./docs/jdb.md | +| "diformed 11" | ./Images/Screens/Diformed11_2.png | ./docs/jdb.md | +| "less diformed" | ./Images/Screens/Diformed11ButLess1.png | ./docs/jdb.md | +| "less diformed" | ./Images/Screens/Diformed11ButLess2.png | ./docs/jdb.md | +| "Screen" | ./Images/Screens/SettingsWindowV1.png | ./docs/jdb.md | +| "High Res" | ./Images/Screens/F1TVHIGHRES.png | ./docs/jdb.md | +| "Low Res" | ./Images/Screens/F1TVLOWRES.png | ./docs/jdb.md | +| "ERROR 105" | ./Images/Screens/error105Loading.png | ./docs/jdb.md | +| "ERROR 105" | ./Images/Screens/error105Loading2.png | ./docs/jdb.md | +| "Before fullscreen" | ./Images/Screens/BEFOREFULLSCREEN.png | ./docs/jdb.md | +| "After fullscreen" | ./Images/Screens/AFTERFULLSCREEN.png | ./docs/jdb.md | +| "Exemple settings UI" | ./Images/Screens/SettingsUI1.png | ./docs/jdb.md | +| "Poster V3" | ./Images/Figma/PosterV3.png | ./docs/jdb.md | +| "Poster V4" | ./Images/Figma/PosterV4.png | ./docs/jdb.md | +| "Poster V5" | ./Images/Figma/PosterV5.png | ./docs/jdb.md | +| "Poster V6" | ./Images/Figma/PosterV6.png | ./docs/jdb.md | +| "Poster V7" | ./Images/Figma/PosterV7.png | ./docs/jdb.md | +| "Bordel Figma" | ./Images/Screens/BordelFigma.png | ./docs/jdb.md | +| "Poster V8" | ./Images/Figma/PosterV8.png | ./docs/jdb.md | +| "Poster V9" | ./Images/Figma/PosterV9.png | ./docs/jdb.md | +| "1:45.140" | ./Images/Screens/BadOcr.png | ./docs/jdb.md | +| "Zone de pilote décalée" | ./Images/Screens/BadDriverZone.png | ./docs/jdb.md | +| Pneus cachés | ./Images/Screens/CroppedTyres.png | ./docs/jdb.md | +| "Filtre vanish oxy action sur un secteur violet" | ./Images/Screens/VanishOxyAction.png | ./docs/jdb.md | +| "wtf...?" | ./Images/Screens/wtfF1TV.png | ./docs/jdb.md | +| "Wtf...??" | ./Images/Screens/wtfF1TV1.png | ./docs/jdb.md | +| "Artefacts de detection de sobel" | ./Images/Screens/SobelArtefacts.png | ./docs/jdb.md | +| "Artefacts allègés" | ./Images/Screens/A | ./docs/jdb.md | +| "Ancienne page de settings" | ./Images/Screens/OldSettingsPage.png | ./docs/jdb.md | +| "Nouvelle page de configuration" | ./Images/Screens/newRawSettingsPage.png | ./docs/jdb.md | +| "Nouvelle page de config" | ./Images/Screens/newSettingsPageEmpty.png | ./docs/jdb.md | +| "Nouvelle page de config en plein écran" | ./Images/Screens/newSettingsPageEmptyFullscreen.png | ./docs/jdb.md | +| "Nouvelle page de config en action" | ./Images/Screens/newRawSettingsPageFull.png | ./docs/jdb.md | +| "Première version de la page principale" | ./Images/Screens/MainPageSketch.png | ./docs/jdb.md | +| "Screenshot de la page principale" | ./Images/Screens/MainPage1.png | ./docs/jdb.md | +| "Screenshot de la page principale" | ./Images/Screens/MainPage2.png | ./docs/jdb.md | +| "Dataset Ecarts" | ./Images/Screens/DataSetGaps.png | ./docs/jdb.md | +| "Dataset Tours" | ./Images/Screens/DataSetLaps.png | ./docs/jdb.md | +| "Dataset Noms" | ./Images/Screens/DataSetNames.png | ./docs/jdb.md | +| "Dataset Positions" | ./Images/Screens/DataSetPositions.png | ./docs/jdb.md | +| "Dataset Sectors" | ./Images/Screens/DataSetSectors.png | ./docs/jdb.md | +| "Dataset Tyres" | ./Images/Screens/DataSetTyres.png | ./docs/jdb.md | +| "Diagramme fonctionnement général" | ./Images/Figma/DiagrammeG%C3%A9n%C3%A9ral.png | ./docs/jdb.md | +| "Diagramme recupération d'images" | ./Images/Figma/DiagrammeRecupImages.png | ./docs/jdb.md | +| "Diagramme OCR" | ./Images/Figma/DiagrammeOCR.png | ./docs/jdb.md | +| "Diagramme Traitement" | ./Images/Figma/DiagrammeTraitement.png | ./docs/jdb.md | +| "Ce que voyait le programme pendant les erreurs 105 ce dimanche" | ./Images/Screens/BadWifi105.png | ./docs/jdb.md | +| "Ce que voyait le programme avant que j'essaie d'implémenter le click auto" | ./Images/Screens/BadLiveHandling.png | ./docs/jdb.md | +| | ./Images/Figma/PosterV7.png | ./docs/index.md | +| "Screenshot du feed data de la f1TV" | ./Images/Screens/ScreenF1TvData.png | ./docs/index.md | +| "Exemple de la Data Channel" | ./Images/Screens/Formula1DataChannel.png | ./docs/index.md | +| "Prototype de l'app fait sur Figma" | ./Images/Figma/Prototype.png | ./docs/index.md | +| "Maquette originale du projet faite sur Figma" | ./Images/Figma/Prototype.png | ./docs/index.md | +| "Maquette originale du projet faite sur Figma" | ./Images/Screens/MainPage2.png | ./docs/index.md | +| "Graphique représentant la quantité de travail requise" | ./Images/Figma/TimeRepartition.png | ./docs/index.md | +| "Logo de Visual Studio 2022" | ./Images/Screens/Vs2022logo.png | ./docs/index.md | +| "Logo de Visual Studio Code" | ./Images/Screens/vsCodelogo.png | ./docs/index.md | +| "Logo de Mkdocs Materials" | ./Images/Screens/MaterialsLogo.png | ./docs/index.md | +| "Logo de Figma" | ./Images/Screens/FigmaLogo.png | ./docs/index.md | +| "Logo de sélénium" | ./Images/Photos/Selenium_Logo.png | ./docs/index.md | +| "Logo de Pupeteer" | ./Images/Photos/Pupetteer_Logo.png | ./docs/index.md | +| "Logo C#" | ./Images/Photos/Csharp_Logo.png | ./docs/index.md | +| "Logo Python" | ./Images/Photos/Python_Logo.png | ./docs/index.md | +| "Logo Firefox Headless" | ./Images/Photos/Firefox_logo_dev.png | ./docs/index.md | +| "Diagramme simplifié représentant le processus de récupération des images" | ./Images/Figma/DiagrammeRecupImages.png | ./docs/index.md | +| "Diagramme simplifié représentant le processus d'OCR" | ./Images/Figma/DiagrammeOCR.png | ./docs/index.md | +| "Diagramme simplifié représentant le processus de traitement et d'affichage" | ./Images/Figma/DiagrammeTraitement.png | ./docs/index.md | +| "Diagramme simplifié représentant le processus global du projet" | ./Images/Figma/DiagrammeG%C3%A9n%C3%A9ral.png | ./docs/index.md | +| "Exemple insertion AWS en GP" | ./Images/Screens/AWSExample1.jpg | ./docs/index.md | +| "Exemple data d'AWS" | ./Images/Screens/AWSExample2.jpg | ./docs/index.md | +| "Exemple de Data Channel" | ./Images/Screens/ScreenF1TvData.png | ./docs/index.md | +| "Navigateur Headless (sans tête)" | ./Images/Screens/headless-firefox.jpg | ./docs/index.md | +| "Chromium logo" | ./Images/Screens/ChromiumLogo.png | ./docs/index.md | +| "Firefox dev logo" | ./Images/Screens/FirefoxLogo.png | ./docs/index.md | +| "Exemple de zone principale" | ./Images/Screens/MainZoneExample.png | ./docs/index.md | +| "Exemple zone pilote" | ./Images/Screens/DriverZoneExample.png | ./docs/index.md | +| "Exemple Window de pneus" | ./Images/Screens/TyreZoneExemple1.png | ./docs/index.md | +| "Exemple Window temps au tour" | ./Images/Screens/DriverLapTimeExample.png | ./docs/index.md | +| "Exemple window Drs" | ./Images/Screens/DRSFalse.png | ./docs/index.md | +| "Screen F1TV" | ./Images/Screens/ScreenF1TvData.png | ./docs/index.md | +| "Zones principales" | ./Images/Figma/WindowZoneExplanation1.png | ./docs/index.md | +| "Diagramme explicatif de l'architecture des zones" | ./Images/Figma/WindowZoneExplanationDiagram.png | ./docs/index.md | +| "Exemple zone principale" | ./Images/Screens/MainZoneExample.png | ./docs/index.md | +| "Exemple zone de pilote" | ./Images/Screens/DriverZoneExample.png | ./docs/index.md | +| "Exemple de fenêtre de position" | ./Images/Screens/DriverPositionExample.png | ./docs/index.md | +| "Exemple de fenêtre de nom" | ./Images/Screens/DriverNameExample.png | ./docs/index.md | +| "Exemple de fenêtre de temps au tour" | ./Images/Screens/DriverLapTimeExample.png | ./docs/index.md | +| "Exemple de fenêtre pneus" | ./Images/Screens/DriverTyreWindowExample.png | ./docs/index.md | +| "Exemple de chiffre avant post traitement" | ./Images/Figma/Bad9Example.png | ./docs/index.md | +| "9 avec antialiasing" | ./Images/Figma/Aliased9.png | ./docs/index.md | +| "Premier exemple de contours" | ./Images/Figma/Horrible9.png | ./docs/index.md | +| "Second exemple de contours" | ./Images/Figma/Clean9Example.png | ./docs/index.md | +| "Exemple de contour généreux" | ./Images/Figma/Filled9.png | ./docs/index.md | +| "Exemple texte cru" | ./Images/Screens/ExempleTextRaw.png | ./docs/index.md | +| "Texte inversé" | ./Images/Screens/ExempleTextINvertColor.png | ./docs/index.md | +| "Texte après Treshold" | ./Images/Screens/ExempleTextTresholding.png | ./docs/index.md | +| "Texte après Resize" | ./Images/Screens/ExempleTextResize.png | ./docs/index.md | +| "Texte après Dilatation" | ./Images/Screens/ExempleTextDilatation.png | ./docs/index.md | +| "Temps au tour avant traitement" | ./Images/Screens/ExempleLapTimeBefore.png | ./docs/index.md | +| "Temps au tour zoomé" | ./Images/Screens/ExempleLapTimeBeforeUpscaled.png | ./docs/index.md | +| "Temps au tour après Treshold" | ./Images/Screens/ExempleLapTimeTreshold.png | ./docs/index.md | +| "Temps au tour après Resize" | ./Images/Screens/ExempleLapTimeResize.png | ./docs/index.md | +| "Temps au tour après Dilatation" | ./Images/Screens/ExempleLapTimeDilatation.png | ./docs/index.md | +| "Temps au tour après Érosion" | ./Images/Screens/ExempleLapTimeErode.png | ./docs/index.md | +| "Gamme de pneus Pirelli" | ./Images/Photos/Tyres.png | ./docs/index.md | +| "Exemple zone pneus 1" | ./Images/Screens/TyreZoneExemple3.png | ./docs/index.md | +| "Exemple zone pneus 2" | ./Images/Screens/TyreZoneExemple2.png | ./docs/index.md | +| "Exemple zone pneus 3" | ./Images/Screens/TyreZoneExemple1.png | ./docs/index.md | +| "Exemple zone pneus 4" | ./Images/Screens/TyreZoneExemple4.png | ./docs/index.md | +| "Zone complète" | ./Images/Screens/TyreZoneFull.png | ./docs/index.md | +| "Zone coupée automatiquement" | ./Images/Screens/TyreZoneCropped.png | ./docs/index.md | +| "Couleur d'un pneu tendre" | ./Images/Photos/SoftTyreColor.png | ./docs/index.md | +| "Couleur d'un pneu medium" | ./Images/Photos/MediumTyreColor.png | ./docs/index.md | +| "Couleur d'un pneu dur" | ./Images/Photos/HardTyreColor.png | ./docs/index.md | +| "Couleur d'un pneu intermédiaire" | ./Images/Photos/IntermediateTyreColor.png | ./docs/index.md | +| "Couleur d'un pneu pluie" | ./Images/Photos/WetTyreColor.png | ./docs/index.md | +| "Pneu dur avec 0 tours" | ./Images/Screens/TyreZoneHard.png | ./docs/index.md | +| "Couleur moyenne de l'image ci-dessus après soustraction du background" | ./Images/Screens/TyreZoneHardAVG.png | ./docs/index.md | +| "Zone pneu avec le background en moins" | ./Images/Screens/TyreZoneCropedWithoutBackGround.png | ./docs/index.md | +| "Zone avec le reste des couleurs supprimées" | ./Images/Screens/TyreZoneFilter1.png | ./docs/index.md | +| "Filtre 1" | ./Images/Screens/TyreZoneFilter2.png | ./docs/index.md | +| "Resultat" | ./Images/Screens/TyreZoneAfter.png | ./docs/index.md | +| "Exemple treshold" | ./Images/Photos/TresholdExemple1.webp | ./docs/index.md | +| "Exemple d'interpolation linéaire" | ./Images/Photos/InterpolationExemple.png | ./docs/index.md | +| "Exemple des différents types d'interpolation" | ./Images/Photos/BicubicExample.png | ./docs/index.md | +| "Exemple interpolation bicubique (avant)" | ./Images/Photos/BicubicExample1.webp | ./docs/index.md | +| "Exemple interpolation bicubique (après)" | ./Images/Photos/BicubicExample2.webp | ./docs/index.md | +| "Echantillon 720P" | ./Images/Screens/F1TVLOWRES.png | ./docs/index.md | +| "Echantillon 1080P" | ./Images/Screens/F1TVHIGHRES.png | ./docs/index.md | +| "Echantillon 4K" | ./Images/Screens/F1TVHIGHERRES.png | ./docs/index.md | +| "Exemple de secteur en couleur" | ./Images/Screens/VanishRaw.png | ./docs/index.md | +| "Exemple de secteur en grayscale" | ./Images/Screens/VanishGrayScale.png | ./docs/index.md | +| "Exemple de secteur blanchi avec vanishoxyAction" | ./Images/Screens/VanishVanish.png | ./docs/index.md | +| Artefacts de la détection de bords de Sobel | ./Images/Screens/SobelArtefacts.png | ./docs/index.md | +| "Exemple temps au tour" | ./Images/Screens/ExempleLapTimeBefore.png | ./docs/index.md | +| "Exemple temps secteur" | ./Images/Screens/VanishRaw.png | ./docs/index.md | +| "Logo SQLite" | ./Images/Photos/SQLite_Logo.png | ./docs/index.md | +| "Infographie de pneu qui se chevauche" | ./Images/Screens/CroppedTyres.png | ./docs/index.md | +| "Exemple d'affichage live" | ./Images/Screens/SmallDriverInfoExemple.png | ./docs/index.md | +| "Fenêtre d'informations à propos d'un pilote" | ./Images/Screens/SmallDriverInfoFullExemple.png | ./docs/index.md | +| "Exemple fenêtre des batailles" | ./Images/Screens/BattlesWindowExemple.png | ./docs/index.md | +| "Exemple fenêtre des dépassements" | ./Images/Screens/OvertakesWindowExemple.png | ./docs/index.md | +| "Exemple de fenêtre d'informations totalement calculées" | ./Images/Screens/SlowestAndFastestExemple.png | ./docs/index.md | +| "Exemple d'échantillons pour les tests" | ./Images/Screens/DataSetGaps.png | ./docs/index.md | +| "Consommation de mémoire peu après avoir commencé la détection" | ./Images/Screens/MemoryUtilisation.png | ./docs/index.md | +| Diagramme qui montre comment les zones et fenêtres interagissent | ./Images/Figma/ZonesStuctureDiagram.png | ./docs/index.md | +| "Utilisation du processeur pendant le fonctionnement de l'application" | ./Images/Screens/CPUUsage.png | ./docs/index.md | +| "Températures du laptop pendant le fonctionnement de l'application" | ./Images/Photos/PCThermals.jpg | ./docs/index.md | +| "Logo chat Gpt" | ./Images/Screens/GPTLogo.png | ./docs/index.md | diff --git a/docs/jdb.md b/docs/jdb.md index 9a82b4d..5ed9088 100644 --- a/docs/jdb.md +++ b/docs/jdb.md @@ -3200,4 +3200,47 @@ Les performances n'ont pas beaucoup augmenté mais au moins comme ca c'est fait Aujourd'hui, le but est de finir la documentation et de mettre les derniers commentaires dans le code et faire une première release en BETA. -Pour ce genre de travail un peu pénible je conseille une bonne playlist de phonk. Ca permet d'écrire en rythme. \ No newline at end of file +Pour ce genre de travail un peu pénible je conseille une bonne playlist de phonk. Ca permet d'écrire en rythme. + +## Vendredi 09 Juin 2023 + +La c'est la finalisation de la documentation. + +J'ai créé ce petit script avec l'aide de ChatGPT pour créer une table des figures : + +```Python3 +import os +import re + +def generate_figure_table(directory): + table = [] + + figure_pattern = r'!\[([^\]]*)\]\(([^\)]*)\)' + + for root, dirs, files in os.walk(directory): + for file in files: + if file.endswith(".md"): + file_path = os.path.join(root, file) + with open(file_path, "r") as md_file: + content = md_file.readlines() + for line in content: + matches = re.findall(figure_pattern, line) + for match in matches: + alt_text = match[0] + image_path = match[1] + table.append([alt_text, image_path, file_path]) + + if table: + headers = ["Texte alternatif", "Chemin de l'image", "Fichier Markdown"] + with open("TableDesFigures.md", "w") as file: + file.write("| " + " | ".join(headers) + " |\n") + file.write("|" + "|".join(["---"] * len(headers)) + "|\n") + for row in table: + file.write("| " + " | ".join(row) + " |\n") + print("Le fichier figure_table.md a été généré avec succès.") + else: + print("Aucune figure trouvée dans les fichiers Markdown.") + +# Exemple d'utilisation +generate_figure_table("./docs") +``` \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 73ab3fe..3f944d3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -31,7 +31,7 @@ markdown_extensions: plugins: - glightbox - search - - img2fig + - table-of-figures - with-pdf: cover_subtitle: "Vroum Vroum" enabled_if_env: ENABLE_PDF_EXPORT diff --git a/site/404.html b/site/404.html index d59457f..2ccc28e 100644 --- a/site/404.html +++ b/site/404.html @@ -255,22 +255,37 @@ +
  • + + Table of Figures + +
  • + + + + + + + + + +
  • - + -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Vendredi 09 Juin 2023 + +
  • +
  • + + Table of Figures + +
  • - -
  • +
  • + + Vendredi 09 Juin 2023 + +
  • @@ -718,9 +733,9 @@ - with-pdf

    Voici un example de à quoi ca ressemble en forme de site

    -
    +
    -
    "Exemple mkdocs"
    +
    Figure 131 - "Exemple mkdocs"

    Ensuite il m'a fallu faire une version plus à jour de mon cahier des charges car je n'y avait pas touché depuis novembre. J'ai envoyé un mail à mes enseignants pour qu'ils puissent y jeter un oeuil pour être sûr que je n'ai rien changé qui les dérangent.

    Monsieur Jayr m'a demadé à l'occasion de lui faire un planning type Gantt alors je me suis mis à la tâche.

    @@ -734,13 +749,13 @@

    Ensuite je vais m'attaquer au squelette de la docmentation. Je vais essayer de remplir tout ce que je peux remplir dans un premier temps car cela tout ca de fait pour plus tard quitte à modifier quelques aspects au fur et à mesure.

    J'ai aussi désactivé mkdocs with pdf par ce que les résultats ne sont vraiment pas ceux que j'attends et cela ralentis énormément le déploiment.

    J'ai aussi rassemblé mes croquis pour le poster :

    -
    +
    -
    "Croquis Poster 1"
    +
    Figure 132 - "Croquis Poster 1"
    -
    +
    -
    "Croquis Poster 2"
    +
    Figure 133 - "Croquis Poster 2"

    On peut voir que dans un premier temps j'ai tenté de faire un poster un peu plus stylisé et marketing. Cependant après avoir discuté avec Mr Garcia et différents profs dont un de l'HEPIA et ils m'ont indiqué que ce qui était attendu était moins du marketing qu'un diagramme de fonctionnement.

    On peut voir sur les derniers posters que le coté technique ressort de plus en plus. Le but sera de faire une version encore plus technique ou on peut voir les différents fonctionnements de l'application avec les technologies utilisées.

    @@ -757,19 +772,19 @@ Doc : https://ironsoftware.com/csharp/ocr/docs/ Examples : https://ironsoftware.com/csharp/ocr/examples/simple-csharp-ocr-tesseract/

    Avant d'utiliser la librairie je me demande si je dois utiliser un peu de post processing pour aider à la reconnaissance.

    Je peux soit utiliser l'image cropée directement :

    -
    +
    -
    "Image non traitée"
    +
    Figure 134 - "Image non traitée"

    Soit avec un filtre pour passer en noir et blanc laxiste

    -
    +
    -
    "Image traitée laxiste"
    +
    Figure 135 - "Image traitée laxiste"

    Soit avec un filtre pour passer en noir et blanc stricte

    -
    +
    -
    "Image traitée stricte"
    +
    Figure 136 - "Image traitée stricte"

    Il va falloir faire des tests avec tous les noms et les chiffres pour trouver le plus efficace.

    Bon malheureusment Iron OCR semblait être une bonne alternative mais c'est une librairie privée qui demande une license pour être utilisée. Il va falloir trouver autre chose.

    @@ -818,39 +833,39 @@ https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-array

    Etonnament, avec plus de texte, des noms qui étaient autrefois mal reconnus sont parfaitement interprêtés.

    Par exemple voici un exemple de reconnaisance de texte sur tous les pilotes :

    -
    +
    -
    "Screenshot de reconnaisance d'image complete"
    +
    Figure 137 - "Screenshot de reconnaisance d'image complete"

    On voit que le nom Leclerc est mal reconnu. Mais voici ce que cela donne quand on prend une image qui ne contient que le nom Leclerc :

    -
    +
    -
    "Screenshot de reconnaissance d'image cropée"
    +
    Figure 138 - "Screenshot de reconnaissance d'image cropée"

    On voit ici que le nom Leclerc est très bien reconnu.

    Dans le premier exemple on peut voir que Tsunoda est reconnu comme "Reticin" ce qui n'est pas exactement pareil (lol)

    Et quand on isole le nom Tsunoda dans une image seule :

    -
    +
    -
    "Screenshot de reconnaissance de Tsunoda"
    +
    Figure 139 - "Screenshot de reconnaissance de Tsunoda"

    Il le lit "RETLELYY" ce qui n'est toujours pas exactement ca...

    Une meilleure résolution pourrait peut-être résoudre le problème en partie.

    Jusqu'ici les images étaient en presque 720P ce qui donne ceci :

    -
    +
    -
    "Tsunoda en 720P"
    +
    Figure 140 - "Tsunoda en 720P"

    Et j'ai lancé une récupèration d'images en 1080p pour récupèrer ceci :

    -
    +
    -
    "Tsunoda en 1080P"
    +
    Figure 141 - "Tsunoda en 1080P"

    On peut voir une certaine différence tout de même.

    Et quand on lance la reconnaissance :

    -
    +
    -
    "Reconnaissance Tsunoda en 1080P"
    +
    Figure 142 - "Reconnaissance Tsunoda en 1080P"

    "Tsunoda n'est plus écrit "RETLELYY" mais "TSUNDDA" ce qui n'est pas parfait mais qui est déja beaucoup mieux.

    J'ai essayé de mettre l'engine de Tesseract en mode "JPN" comme Tsunoda est un nom japonais mais sans succès j'ai le même résultat.

    @@ -883,21 +898,21 @@ https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-arrayRien de bien dingue mais cela fonctionne et je peux jouer avec le BLACK_AND_WHITE_TRESHOLD pour changer son comportement.

    J'ai dabord testé avec un treshold de 100 et le programme a réussi à me sortir Tsunoda en deux mots ce qui était déja très encourageant.

    Et après avoir augmenté le Treshold... Tada :

    -
    +
    -
    "Tsunoda 1080P avec filtre"
    +
    Figure 143 - "Tsunoda 1080P avec filtre"

    Le programme arrive bien à reconnaitre TSUNODA. Je pense que cette tactique ne fonctionnait pas avant car la resolution était trop faible et l'aliasing se mêlait trop avec le texte pour être utilisable.

    Cependant cette technique ne fonctionne pas sur tous les noms. Par example avec Leclerc :

    -
    +
    -
    "Leclerc 1080P avec filtre"
    +
    Figure 144 - "Leclerc 1080P avec filtre"

    On récupère "Leeler'c" ce qui n'est pas bon du tout.

    Mais en modulant le Treshold (ici à 150) On peut de nouveau voir Leclerc être reconnu correctement

    -
    +
    -
    "Leclerc 1080P avec filtre 2"
    +
    Figure 145 - "Leclerc 1080P avec filtre 2"

    Je pense que pour avoir de bons résultats il va falloir faire un algo qui :

      @@ -909,21 +924,21 @@ https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-arraySeulement voila, il n'y a pas que des lettres que l'on veut récupèrer. On veut surtout pouvoir récupèrer les chiffres.

      Pour les chiffres on va avoir des soucis également...

      Si on essaie directement la même technique sans filtre on a des résultats comme celui ci :

      -
      +
      -
      "Tentative de reconnaisance du timing"
      +
      Figure 146 - "Tentative de reconnaisance du timing"

      La virgule a tendeance à se barrer ce qui est particulièrement problématique. Cependant comme les chiffres ont beaucoup moins de possibilitées que les lettres et qu'il n'y a pas de problème de langue on devrait pouvoir travailler à faire des règlage que l'on pourra ensuite utiliser.

      Avec un Treshold de 165 on arrive presque à quelque chose d'intéressant :

      -
      +
      -
      "Tentative 2 de reconnaissance du timing"
      +
      Figure 147 - "Tentative 2 de reconnaissance du timing"

      Le + n'est clairement pas compris mais ca n'est pas embêtant car c'est souvent redondant. On arrive cependant à isoler 3 et 259. Même si la virgule n'est pas comprise cela veut dire qu'il est tout de même possible de discriminer les secondes des milisecondes.

      Maintenant avec un temps au tour :

      -
      +
      -
      "Reconnaissance du timing au tour"
      +
      Figure 148 - "Reconnaissance du timing au tour"

      On arrive sans rien changer aux paramêtres à isoler minutes secondes et milisecondes.

      Il semble que la reconnaissance de chiffre soit bien plus efficace que la reconnaissance de lettres. Il va falloir faire un test à plus grande échelle avec plus d'image pour se rendre compte de la precision.

      @@ -937,21 +952,21 @@ https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-arrayJe me rend compte que pour faire un programme de tests je dois déja avoir une idée de la structure de mon programme.

      Pour le moment je réflechis à un système de "Zones" et de "Windows". L'idée serait que une Zone est juste une sous partie d'image qui peut encore être décomposé tandis que chaque Window contient une ou plusieurs informations à récupèrer.

      J'ai essayé de découper l'image pour que cela soit plus clair :

      -
      +
      -
      "Main zone"
      +
      Figure 149 - "Main zone"

      Ici on peut voir que l'image est découpée en plusieurs grandes zones. Dans un premier temps on ne s'occupe que de la première.

      Ensuite :

      -
      +
      -
      "Driver zone #1"
      +
      Figure 150 - "Driver zone #1"

      On peut voir la que cette Main zone serait elle même décomposée en plusieurs plus petites zones.

      Et ensuite chacunes de ces petites zones :

      -
      +
      -
      "Driver windows"
      +
      Figure 151 - "Driver windows"

      Sera décomposée en plusieurs windows qui elles sont des zones qui contiennent de l'information.

      En gros on aurait trois types de zone :

      @@ -983,9 +998,9 @@ https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-arrayDans un premier temps je pense que les windows vont simplement écrire dans un fichier ce qu'elles trouvent chacunes dans le format qu'elles veulent.

      Pour comprendre pourquoi je me prend la tête il faut savoir que chaque window peut avoir accès à pleins d'informations différentes. On pourrait dire qu'elles retournent toutes une string sauf que si ca marche pour un temps au tour ou pour un nom de pilote, cela ne marche pas forcément pour un type de pneu ou un DRS ouver. Comme chaque window a plusieurs types de data elle devra elle même se charger de comment la traiter ET de la stocker.

      Voila un diagramme qui résume comment je vois l'implémentation dans un premier temps :

      -
      +
      -
      "Diagramme d'explications"
      +
      Figure 152 - "Diagramme d'explications"

      Voici comment se présente le squellette d'une Zone :

      public class Zone
      @@ -1093,41 +1108,41 @@ https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-arrayPar exemple pour un temps au tour on peut imaginer que il fait une petite vérification dans l'objet pilote et dans le tableau des tours si il n'y a pas deja une valeur et si il n'y en a pas une alors il peut l'ajouter.

      Maintenant je vais essayer de créer une Main window qui se calibre toute seule.

      Alors après avoir bien galèré avec l'interface pour permettre au user de cliquer sur la form pour voir les zones qu'il crée, j'ai pu créer un zone qui fait les dimensions de MainZone et j'ai pu lancer la reconnaissance sur l'image et voir ou il trouve du texte :

      -
      +
      -
      "MainZone avec carrés de texte"
      +
      Figure 153 - "MainZone avec carrés de texte"

      Maintenant il faut que je nettoie la liste de rectangle pour exclure ceux qui sont trop grands pour être sur une seule ligne, ceux qui indiquent le nombre de tour en haut et ceux qui n'ont pas d'intérêts. On pourra ensuite isoler les lignes et créer une liste d'images.

      Pour ce qui est de la ligne qui contient les "Gap interval last lap" et des chiffres sur les tours pour les pneus etc je vais juste demander à l'utilisateur de ne pas les prendre dans la screenshot. Comme ils contiennent des mots qui peuvent être utilisés plus loin dans les data je ne peux pas les blacklister et faire un système qui s'occupe de les enlever si ils existent selon le position y me prendrait trop de temps pour rien.

      Après avoir filtré un peu les resultats et enlevé les zones beaucoup trop grandes, on se retrouve déja plus qu'avec ca :

      -
      +
      -
      "MainZone avec de meilleurs carrés"
      +
      Figure 154 - "MainZone avec de meilleurs carrés"

      Comme on peut le voir, du côté gauche de l'image on a beaucoup de choses reconnues mais avec beaucoup de tailles différentes ce qui n'est pas idéal. Alors j'ajoute un filtre qui permet de ne selectionner que les data sur la droite.

      -
      +
      -
      "MainZone avec de meilleurs carrés"
      +
      Figure 155 - "MainZone avec de meilleurs carrés"

      Maintenant il devrait être possible de faire un algorythme qui ne prend que un seul carré par ligne.

      -
      +
      -
      "MainZone avec un seul carré par ligne"
      +
      Figure 156 - "MainZone avec un seul carré par ligne"

      Maintenant que on sait ou se trouve chaque ligne on peut faire un petit traitement et découper l'image en plusieurs windows.

      Et voila :

      -
      +
      -
      "Mainzone auto calibrée"
      +
      Figure 157 - "Mainzone auto calibrée"

      Maintenant le programme peut créer des zones pour chaque pilote

      -
      +
      -
      "Images pilotes"
      +
      Figure 158 - "Images pilotes"
      -
      +
      -
      "Zone d'un pilote"
      +
      Figure 159 - "Zone d'un pilote"

      Maintenant il faut que j'implémente un système un peu similaire pour créer des windows.

      Voici la methode que j'ai créé pour l'autocalibration :

      @@ -1190,26 +1205,26 @@ https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-arrayCa peut paraitre pas énorme comme code mais pour tout mettre en place ca demande quand même pas mal de reflexion.

      J'ai du clean un peu le code que j'avais fait pour permettre la selection de zones et ajouter la possibilité d'ajouter des windows sur une zone.

      J'ai juste quelques difficultées à les ajouter correctement, j'ai un offset tout pourri qui se met tout le temps

      -
      +
      -
      "Sainz coupé"
      +
      Figure 160 - "Sainz coupé"
      -
      +
      -
      "Perez coupé"
      +
      Figure 161 - "Perez coupé"

      Cela doit être un soucis lors de la detection de clic qui met un offset en trop. C'est vraiment pénible en tout cas.

      Certes c'est moins fun de devoir manuellement indiquer ou sont les windows sur une ligne de pilote, mais je ne vois vraiment pas comment faire cela automatiquement. Le but c'est de faire une configuration qui puisse être sauvegardée comme ca pas besoin d'à chaques fois le refaire.

      C'est bon ! J'avais juste oublié de changer le calcul d'offset entre le code de la zone et de la window. Note pour plus tard, il serait peut-être judicieux de faire quelque chose pour la vue, les windows et les Zones ont le même exact comportement pour la vue ce qui fait dupliquer du code.

      Mais au moins maintenant ca fonctionne :

      -
      +
      -
      "Ocr tester screenshot"
      +
      Figure 162 - "Ocr tester screenshot"

      Et le programme va directement créer un dossier par pilote avec toutes les images de chaque Data le concernant :

      -
      +
      -
      "Dossier Perez"
      +
      Figure 163 - "Dossier Perez"

      ;

      Et c'est tout pour aujourd'hui je pense. Ce qui serait cool demain c'est que je puisse stocker d'une manière ou d'une autre ces fichiers de calibration et que je puisse les transfèrer vers le programme qui va s'occuper de décoder et commencer gentillement à décoder les différents types de data.

      @@ -1220,25 +1235,25 @@ https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-arrayPour ce faire j'ai tenté de faire comme pour la main zone c'est à dire lancer la reconnaissance pour savoir ou étaient tous les champs de données mais malheureusement je ne pense pas que cela va être possible.

      En effet non seulement ici les champs sont de tailles très variées, mais en plus la reconnaissance n'arrive pas à en récupèrer le même nombre sur chaque ligne ce qui risque d'être complexe à utiliser ensuite.

      La preuve :

      -
      +
      -
      "Tentative d'auto calibration"
      +
      Figure 164 - "Tentative d'auto calibration"

      ;

      Cependant tout n'est pas perdu ! Il y a peut-être un moyen qui serait mieux en tous points. Le soucis avec ce type de reconnaissance c'est qu'on utilise beaucoup de ressources inutiles. On peut peut-être hard coder la valeur des diviseurs et les utiliser pour créer des zones.

      Ok alors visiblement c'est un problème car il semble y avoir d'autres pixels de cette couleur dans l'image (Qui l'aurait cru lol)

      -
      +
      -
      "Tentative 2"
      +
      Figure 165 - "Tentative 2"

      J'a tenté de réduire la tolérance mais le soucis c'est que c'est soit trop soit pas assez

      Dernière tentative, j'ai essayé de prendre plusieurs pixels en hauteur pour chaque incrément de X et en faire la moyenne, et même comme ca, impossible de trouver de manière efficace les zones. Je pense que je vais donc revert tous mes changements pour revenir à la version ou on les choisissait manuellement.

      Pas mal de temps perdu mais bon c'est comme ca ca arrive

      Bon j'ai fait un revert mais j'ai ajouté une feature importante. Les zones font la largeur indiquée par l'utilisateur mais elles font la hauteur max comme ca toutes les window font la même hauteur et ca permet à l'utilisateur de ne pas forcément être ultra précis dans sa selection.

      Ce qui nous donne :

      -
      +
      -
      "Resultat final"
      +
      Figure 166 - "Resultat final"

      Maintenant je dirais que les deux prochaines choses à faire seraient de stocker ces zones dans un fichier JSON ou autre pour que la calibration puisse être envoyée directement dans le logiciel de reconnaissance et ensuite de faire une calibration sur des images qui font la taille qu'on aura pendant les Grands Prix. Pour le moment elles sont au format 16:10 qui est le format d'écrant de mon laptop.

      Pour le stockage j'imagine un fichier qui donne des indications assez simples qui permettent de reconstruire le total des zones quand il est importé plutot que d'écrire les coordonnées en dur pour chacunes.

      @@ -1281,9 +1296,9 @@ https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-arrayJ'ai visiblement ajouté un bug dans mon code. Maintenant tous les pilotes ont la même image quand on les selectionne. Mais visiblement ca n'était pas le cas avant car j'avais pu prendres des images de chaque pilote.

      J'ai passé 3 minutes à fixer un bug stupide j'ai un peu envie de brûler ma place de travail... Mais bon au moins maintenant cela fonctionne !

      Toutes les images sont récupèrées et ont un format correct avec le bon nom :

      -
      +
      -
      "Verstappen folder"
      +
      Figure 167 - "Verstappen folder"

      Avec un peu de code très moche j'ai pu créer un fichier JSON qui contient les différentes infos. Cependant en exportant TOUT on se retrouve avec un fichier de 1200 lignes ce qui n'est pas optimal.

      Mais quand on regarde, il devrait être possible de faire un fichier qui ne contient que les infos d'un seul pilote car ensuite il y a simplement un offset à appliquer sur la zone et les windows.

      @@ -1366,36 +1381,36 @@ Maintenant je vais m'attaquer au décodage.

      Bon la il faut vraiment que je finisse assez vite la lecture du JSON et la reconstruction des zones pour commencer la reconnaissance.

      J'ai pris beaucoup de temps à faire le programme de calibration mais je pense que c'est essentiel de prendre ce temps maintenant. (BTW il faudra quand même retourner faire une plus jolie version par ce que la ca marche mais c'est tout)

      Bon après pas mal de boulot je pense avoir réussi. Dans le nouveau programme on arrive à récupèrer les différentes zones :

      -
      +
      -
      "JSON decode result"
      +
      Figure 168 - "JSON decode result"

      Un conseil de notre professeur M.Bonvin a été de créer des Releases de versions qui ne fonctionnent pas ou pas très bien. J'ai donc publié une première release de l'OCR_TEST qui fonctionne vite fait.

      J'ai seulement un petit soucis, comme je recrée complêtement la structure des driver zones avec seulement la première, il y a un petit décalage car entre les zones il y avait un gap.

      Ce qui fait que si la première zone est parfaitement centrée :

      -
      +
      -
      "Centered driver"
      +
      Figure 169 - "Centered driver"

      La vingtième ne l'est plus exactement :

      -
      +
      -
      "Uncentered Driver"
      +
      Figure 170 - "Uncentered Driver"

      Pour ca j'ai essayé de mettre un espacement arbitraire mais c'est complexe. Je vais plutôt tenter de faire une différence entre la taille de la zone complête et de la taille additionnée de toutes les fenêtre et diviser le resultat entre toutes les fenêtres.

      Ca n'est pas parfait mais au moins maintenant les données ne touchent plus les bords de la fenêtre.

      Et voila !

      Maintenant avec le fichier de configuration en Json on arrive à récupèrer toutes les infos comme si elles avaient été envoyées directement depuis l'app de calibration mais sans le processing time !

      -
      +
      -
      "Verstappen folder 2
      +
      Figure 171 - "Verstappen folder 2

      On peut donc ENFIN passer au décodage de ces FICHUES données.

      Je vais pouvoir implémenter ce que j'ai fait dans le projet de test de décodage.

      Grâce à mon découpage initial qui m'a pris du temps à implémenter on a enfin un truc qui marche même si je n'ai implémenté que la reconnaissance de noms.

      -
      +
      -
      "Image reconnaissance propre"
      +
      Figure 172 - "Image reconnaissance propre"

      Si on se rappelle du système de window et de zones dans le diagramme plus haut, c'est assez facile de comprendre comment je m'y suis pris.

      En gros on des listes et des listes de listes de zones, c'est la partie un peu plus technique car il y a des zones qui peuvent contenir d'autres zones etc.

      @@ -1507,19 +1522,19 @@ Je pense qu'une bonne facon d'envoyer l'info serait de retourner -1 -2etc... à

      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"
      +
      Figure 173 - "11ZSD"

      Cette image est comprise comme "11ZSD"

      -
      +
      42340 -
      42340
      +
      Figure 174 - 42340

      Cette image est comprise comme "42340"

      -
      +
      -
      "ZZAEB"
      +
      Figure 175 - "ZZAEB"

      Et celle ci "ZZAEB"...

      Ce qui... n'est pas bon du tout...

      @@ -1530,14 +1545,14 @@ Avec la seconde option c'est déja pas mal mieux mais on perd complètement la p

      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"
      +
      Figure 176 - "Clear1"

      Ici le programme trouve "44301"

      -
      +
      -
      "Clear2"
      +
      Figure 177 - "Clear2"

      Et ici "A5151"...

      On a toujours les mêmes problèmes.

      @@ -1551,27 +1566,27 @@ Avec la seconde option c'est déja pas mal mieux mais on perd complètement la p
    • Dilatation

    Ce qui donne :

    -
    +
    -
    "Original"
    +
    Figure 178 - "Original"
    -
    +
    -
    "Grayscale"
    +
    Figure 179 - "Grayscale"
    -
    +
    -
    "InvertColors"
    +
    Figure 180 - "InvertColors"

    ;

    -
    +
    -
    "Resize"
    +
    Figure 181 - "Resize"

    ;

    -
    +
    -
    "Dilatation"
    +
    Figure 182 - "Dilatation"

    Ce qui ne change : Roulement de tambour RIEN kjd viuwvuirnvoirenbf

    Tout ca pour rien...

    @@ -1579,9 +1594,9 @@ Avec la seconde option c'est déja pas mal mieux mais on perd complètement la p

    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"
    +
    Figure 183 - "Clean"

    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.

    @@ -1648,14 +1663,14 @@ Après seulement plus de dix heures de galère, si on donne cette image au progr

    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"
    +
    Figure 184 - "Closed DRS"

    Ceci est un DRS ouvert:

    -
    +
    -
    "Open DRS"
    +
    Figure 185 - "Open DRS"

    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

    @@ -1665,9 +1680,9 @@ Je ne peux pas hardocder un endroit ou aller regarder car cela évolue tout le l

    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"
    +
    Figure 186 - "Color fun"

    Et je crois que j'ai eu une bonne idée, avec une petite methode bien faite on arrive à de supers résultats :

    private Rectangle FindTyreZone()
    @@ -1695,9 +1710,9 @@ Je ne peux pas hardocder un endroit ou aller regarder car cela évolue tout le l
                 return new Rectangle(CorrectedX,0,newWindowSize.Width,newWindowSize.Height);
             }
     
    -
    +
    -
    "Tyres"
    +
    Figure 187 - "Tyres"

    Maintenant cela devrait être beaucoup plus simple de trouver la couleur générale et le nombre de tours.

    Donc ce que je fais c'est que je fais une reconnaissance de texte sur l'image réduite.

    @@ -1711,9 +1726,9 @@ Je ne peux pas hardocder un endroit ou aller regarder car cela évolue tout le l
  • INTER : #00a42e
  • WET : #2760a6
  • -
    +
    -
    "Tyre colors"
    +
    Figure 188 - "Tyre colors"

    Les couleurs de pneus peuvent changer de temps à autres, par exemple cette règle de pneus est arrivée en 2019 et avant il y avait beaucoup plus de couleurs mais dans une volonté de rendre le sport plus facile à comprendre à la télé cela a été simplifié. Je ne pense pas que cela va changer dans les années qui viennent alors tout est hardcodé.

    Je pense que j'ai des soucis avec la detection de texte et de couleur car ma zone est trop grande.

    @@ -1721,9 +1736,9 @@ Je ne peux pas hardocder un endroit ou aller regarder car cela évolue tout le l

    Il semble que la principale difficulté avec ces pneus c'est que les chiffres ou lettres sont minuscules. Il est donc extrêmement difficile de faire une reconnaissance ne serait-ce qu'un peu fiable..

    Je fais de mon mieux pour tenter de règler le soucis cependant c'est vraiment complexe.

    Je commence à devenir fou, je tente tout et nimporte quoi pour permettre à mon algo de fonctionner et même quand je fais du post processing comme pas possible il me retourne toujours nimporte quoi...

    -
    +
    -
    "5i t'inquiètes"
    +
    Figure 189 - "5i t'inquiètes"

    Ici le programme va trouver '5i'...

    En fait c'est complexe d'expliquer tout ce que je fais car je change tout en boucle en essayant et en ratant ce qui prend des heures.

    @@ -1738,31 +1753,31 @@ Je ne peux pas hardocder un endroit ou aller regarder car cela évolue tout le l

    Alors j'écrit ces lignes deux jours plus tard et me rend compte avec horreur que toutes mes modifications sur ce journal de bord n'ont pas été auvegardée... yess..

    Bon pour faire simple, j'ai réussi à rendre la detection de couleurs bien plus efficace en réduisant la taille de l'image et en ne prenant pas en compte les couleurs que l'on détecte comme étant partie intégrante du background.

    Par exemple quand on a une image comme celle ci :

    -
    +
    -
    "Avec background"
    +
    Figure 190 - "Avec background"

    qui contient un background alors que ci dessous, on l'a enlevé.

    -
    +
    -
    "Sans background"
    +
    Figure 191 - "Sans background"

    La différence est ténue mais elle permet de grandement améliorer la prescision de la reconnaissance de couleurs.

    Pour ce qui est du nombre de tours je me suis rendu compte que cela n'était déja pas très utile car avec l'historique on devrait pouvoir le déduire. Mais bon pour la forme je me suis dit que cela serait quand même une bonne idée de vérifier avec la reconnaissance. J'étais quasi certain que le soucis était le fait que l'on voie le contour du logo de pneu qui faisait que la reconnaissance avait du mal. Et j'avais raison ! En les enlevant (Ce qui n'a pas été simple) J'ai pu avoir des chiffres beaucoup plus proches de la réalité.

    En même temps je ne vois pas bien comment j'aurais pu faire mieux :

    -
    +
    -
    "Super 11"
    +
    Figure 192 - "Super 11"

    Je suis quand même assez fier de voir que j'ai réussi à part de l'image que on peut voir un peu plus haut et automatiquement la transormer en celle ci-dessus.

    J'ai donc pu retirer le round autour du chiffre et cela m'a permit de pouvoir dézoomer un peu et c'est avec ca que les lettres ont pu être mieux reconnues :

    -
    +
    -
    "Super H"
    +
    Figure 193 - "Super H"
    -
    +
    -
    "Super M"
    +
    Figure 194 - "Super M"

    Maintenant je pense qu'il ne reste "plus qu'à" nettoyer un peu tout ce code qui traine de partout pour tout faire fonctionner et implémenter un peu de parrallel processing ainsi que de l'asynchrone pour ne pas bloquer le reste du programme.

    Par ce qu'il faut savoir que en l'étât, le programme met 25 secondes à démarrer et consomme presque 2GB de Ram. Certes cela ne veut pas dire que la reconnaissance à elle seule prend 25 secondes car au démarrage il y a aussi la lecture du fichier de config et la création des window etc..

    @@ -1898,15 +1913,15 @@ On est de nouveau à plus de 10s de loading time mais on est descendu à deux se

    J'ai aussi passé pas mal de temps sur le poster du projet. J'avais fait des croquis au crayon de ce à quoi je pensais, cependant après de longues discussions avec M.Garcia ils n'étaient pas forcément très bons car ils ne représentent pas assez bien le fonctionnement du projet et sont un peu trop marketings.

    Du coup j'ai fait une première version au propre :

    -
    +
    -
    "Poster V1"
    +
    Figure 195 - "Poster V1"

    Mais je n'étais pas forcément content du résultat et il manquait des choses je trouve comme par exemple l'utilisation de Selenium.

    J'ai donc repassé des heures à faire une seconde version :

    -
    +
    -
    "Poster V2"
    +
    Figure 196 - "Poster V2"

    La police d'écriture n'est pas encore la bonne mais cela va venir. Mais je préfère déja beaucoup cette version à la première.

    Je ne sais pas encore si la version finale sera une version plus travaillée de ce poster ou complêtement autre chose mais pour l'instant je suis à peu près content de cette version.

    @@ -2084,31 +2099,31 @@ Alors dans les faits la vidéo youtube ne se lance pas du tout car il y a des pu

    Bon pour ce qui est du timecode de la vidéo. Je pense qu'il serait trop complexe de faire en sorte que selenium change le slider de progression de la vidéo. Alors j'ai fait quelques tests et apparemment, si on quitte la F1TV sur un timecode de la vidéo que on donne au programme, comme il récupère tous les cookies de la F1TV il commencera de la.

    Donc si on veut utiliser le programme avec des Grand Prix ayant déja eu lieu, on peut le faire, seulement il faudra juste au préalable avoir choisit le bon timecode dans le page de la F1TV avant de le lancer.

    Ce qui est intéressant c'est que la page de la F1TV ressemble à ca au départ :

    -
    +
    -
    "Empty F1TV"
    +
    Figure 197 - "Empty F1TV"

    Je pense qu'une bonne idée serait de dire au programme que c'est la grille de départ et ensuite dès qu'il détecte un secteur il sait que la course a commencé.

    Lundi 24 Avril 2023

    Aujourd'hui c'est jour de documentation.

    J'ai pas mal travaillé pendant les vacances mais je n'ai pas encore pu faire de vraie documentation correcte du fonctionnement. Du coup je vais m'en charger aujourd'hui et peut-être un peu demain.

    Ok normalement je ne devrais faire que de la documentation mais je ne peux pas passer à coté de ca... Le problème que j'ai avec les pneus ou parfois il détecte un H au lieu d'un '11' et ce genre de choses c'est à cause de ma methode "RemoveBG" Qui va retirer tous les pixels plus sombres que le background. Sauf que cela va aussi retirer des pixels dans le chiffre lui même et qui va donc defigurer les 11 :

    -
    +
    -
    "diformed 11"
    +
    Figure 198 - "diformed 11"
    -
    +
    -
    "diformed 11"
    +
    Figure 199 - "diformed 11"

    J'ai réussi à les changer en :

    -
    +
    -
    "less diformed"
    +
    Figure 200 - "less diformed"
    -
    +
    -
    "less diformed"
    +
    Figure 201 - "less diformed"

    Mais au final cela n'a pas augmenté la précision de la reconnaissance. Je pense que je vais donc devoir encore changer.

    Je pense que une bonne facon de trouver serait dabord de trouver la couleur du pneu. Et si il n'y a pas assez de couleur alors c'est que le pneu contient une lettre. Le but est d'arrêter de chercher des lettres ou des chiffres. Comme ca les 11 arrêteront d'être pris pour des 'H'

    @@ -2142,9 +2157,9 @@ Je pense que ce qui serait pas mal ca serait du coup d'utiliser ce temps pour bi Ca serait peut-être bien que quand l'application se lance on se retrouve sur la page principale d'affichage de données et qu'on puisse simplement cliquer sur la page options qui contient la page calibration et qui permet de rentrer les infos du Grand Prix.

    Je pense que je vais faire ca.

    Voici l'interface que j'ai développée pour regrouper tout ca :

    -
    +
    -
    "Screen"
    +
    Figure 202 - "Screen"

    La police le style le placement et les couleurs ne sont pas définitfs, cependant je pense que c'est un bon début. Le but maintenant va être de permettre de faire fonctionner la calibration et la récupèration d'images.

    Si j'arrive à faire fonctionner ces deux choses sur un même projet avant la fin de la semaine cela serait super !

    @@ -2157,13 +2172,13 @@ Ca serait peut-être bien que quand l'application se lance on se retrouve sur la

    Si c'était un simple décalage cela ne serait pas compliqué à gèrer mais la...

    J'ai un soucis également avec la résolution des screenshots que je récupère en full Headless.

    Voici un exemple de résolution que j'arrive à récupèrer sans le headless :

    -
    +
    -
    "High Res"
    +
    Figure 203 - "High Res"
    -
    +
    -
    "Low Res"
    +
    Figure 204 - "Low Res"

    Il y a clairement un soucis et le problème c'est que avec une résolution pareille, impossible de faire une reconnaissance correcte.

    BON J?EN PEUX PLUS LA. @@ -2281,13 +2296,13 @@ Ca fait des heures que je bosse sur ce problème débile et impossible de trouve

    Bon après avoir supprimé l'intégralité de ma classe Emulator cela semble marcher un peu mieux. Je ne vais pas m'étendre sur la castrophe niveau temps que cela représente. Si au moins j'arrive à faire fonctionner quelque chose je suis content.

    Maintenant j'ai un soucis un peu spécial. Depuis que j'ai changé la résolution, il semble que le programme aie du mal à cliquer sur l'icone de settings.

    En prenant des screenshots du moment ou l'erreur apparait, j'ai pu me rendre compte que en fait le stream est toujours en train de charger et c'est pour ca que on arrive pas à trouver le bouton :

    -
    +
    -
    "ERROR 105"
    +
    Figure 205 - "ERROR 105"
    -
    +
    -
    "ERROR 105"
    +
    Figure 206 - "ERROR 105"

    Je pense que je n'ai le soucis que maintenant car le flux en 1080p se lance moins vite. Je vais essayer de voir si je peux detecter un élément d'HTML qui correspond au loading comme ca je peux attendre qu'il disparaisse. Sinon je peux aussi juste essayer de trouver le bouton en boucle pendant une dixaine de secondes.

    Bon la j'essaie pendant genre plus de 50 secondes et ca ne marche toujours pas.

    @@ -2296,14 +2311,14 @@ Ca fait des heures que je bosse sur ce problème débile et impossible de trouve

    ET MERDE !

    J'ai réussi à avoir des images en 1080P mais dés que je passe l'image en plein écran c'est de nouveau du 1366X768

    Avant de mettre en plein écran:

    -
    +
    -
    "Before fullscreen"
    +
    Figure 207 - "Before fullscreen"

    Après:

    -
    +
    -
    "After fullscreen"
    +
    Figure 208 - "After fullscreen"

    On peut voir sur l'image que l'option 1080P est effectivement bien selectionnée mais il doit y avoir un paramètre de Firefox qui s'occupe de la résolution d'un player vidéo. Il va juste falloir trouver ce paramêtre...

    J'ai essayé d'utiliser :

    @@ -2333,9 +2348,9 @@ C'était assez frustrant d'avoir perdu deux jours de travail mais on va faire av

    OK j'ai compris le soucis que j'avais quand j'essayais de faire la calibration. J'avais mis l'image en ZOOM ce qui fait que si la hauteur n'était pas la bonne, l'image était recentrée ce qui fait que cela faussait totalement les résultats.

    Quand on fait en sorte que l'image prenne toute la place, les coordonnées sont prises correctement.

    Voici un exemple d'ou en est la partie calibration.

    -
    +
    -
    "Exemple settings UI"
    +
    Figure 209 - "Exemple settings UI"

    Normalement il me suffit d'implémenter les windows, et on devrait relativement facilement ajouter les pilotes.

    Et voila. J'ai pu implémenter les windows et les pilotes. Et je peux aussi exporter des presets et les loader. Bon le loading est un peu beuggé au niveau de l'affichage mais il semble qu'il fonctionne bien quand je save les images.

    @@ -2344,36 +2359,36 @@ C'était assez frustrant d'avoir perdu deux jours de travail mais on va faire av

    Aujourd'hui c'est journée Poster.

    Je pense que je ne vais pas finir la journée content car les limitations sont un peu trop présentes.

    J'ai fait une version que Garcia pourrait accepter, c'est à dire en noir et blanc et avec un tout petit peu plus de détail.

    -
    +
    -
    "Poster V3"
    +
    Figure 210 - "Poster V3"

    Le truc c'est que en blanc je trouve que ca ne marche pas super. Et le concept d'avoir trois parties au projet qui se posent autour d'un circuit c'est peut-être pas la meilleure idée.

    Je me suis dit que la bonne idée serait peut-être de prendre un autre circuit pour qu'il y aie bien trois parties :

    -
    +
    -
    "Poster V4"
    +
    Figure 211 - "Poster V4"

    Clairement ce poster doit faire partie des pires. C'est pas clair et ca part dans tous les sens. Je vais essayer avec un autre layout de circuit.

    -
    +
    -
    "Poster V5"
    +
    Figure 212 - "Poster V5"

    Je me suis ensuite dit que le circuit n'était peut être tout simplement pas une bonne idée. J'ai donc essayé de faire quelque chose de plus classique avec juste un peu de background pour qu'on puisse éviter le soucis de la page blanche derrière :

    -
    +
    -
    "Poster V6"
    +
    Figure 213 - "Poster V6"

    Puis je me suis dit que finalement le circuit me manquait. Alors j'ai décidé de combiner le background et le circuit ainsi que simplifier légèrement les diagrammes en retouchant un peu tout le reste on pouvait arriver à quelque chose de sympatique :

    -
    +
    -
    "Poster V7"
    +
    Figure 214 - "Poster V7"

    Je ne suis pas content à 100% mais bon je pense que je vais m'en satisfaire.

    Pour donner une idée de la galère que c'est de créer un poster, voici ce à quoi ressemble mon espace de travail Figma :

    -
    +
    -
    "Bordel Figma"
    +
    Figure 215 - "Bordel Figma"

    Je ne suis pas un graphiste et ca se voit '^^.

    Je pense que comme il me reste un peu de temps aujourd'hui, je vais faire un peu de documentation de la partie récupèration d'images. En effet, je pense que je n'aurai plus besoin de changer grand chose à ce niveau. Mais je ne ferai pas la partie analyse fonctionnelle car l'interface n'est clairement pas terminée.

    @@ -2439,14 +2454,14 @@ C'était assez frustrant d'avoir perdu deux jours de travail mais on va faire av

    Je remercie Monsieur Briard le sultan officiel de Mkdocs de la classe de m'avoir aidé pour cette partie et avoir créé un plugin qui me permet de mettre mon code source directement dans le pdf.

    Bon au final j'ai quand même changé mon poster

    -
    +
    -
    "Poster V8"
    +
    Figure 216 - "Poster V8"

    Mais je suis trop attaché à l'ancien concept alors je vais plutôt utiliser ca :

    -
    +
    -
    "Poster V9"
    +
    Figure 217 - "Poster V9"

    Je pense que cette version est meilleure même si elle est encore plus en bordel par ce que le texte permet de se faire une meilleure idée de l'utilisé de chaque partie.

    Mercredi 10 Mai 2023

    @@ -2457,9 +2472,9 @@ C'était assez frustrant d'avoir perdu deux jours de travail mais on va faire av

    J'ai eu quelques soucis avec les images en 4K. Du coup j'ai descendu les variables d'environnement à 1920x1080

    En fait il y a parfois un soucis un peu pénible avec l'OCR.

    Parfois pour un temps comme ci dessous:

    -
    +
    -
    "1:45.140"
    +
    Figure 218 - "1:45.140"

    Le programme ne va pas bien comprendre les ponctuations et il va donner : 1115140

    La il y a deux problèmes... Le 1:xx.xxx est compris comme 11xxxxx et le 4 s'est transformé en 1...

    @@ -2632,9 +2647,9 @@ J'avais un soucis dans ma gestion des chiffres mal faits. Visiblement parfois qu

    Bon ca commence mal, quand je vais voir dans le projet OCR_Decode, le changement d'image est exactement le même et il fonctionne alors que de mon côté ca n'est pas le cas.

    Alors deux choses. Je me rend compte que le changement d'images n'a AUCUN effet sur la detection de texte, et seconde chose, le décalage est trop grand entre les windows. Des que le soucis d'image est règlé il va falloir que je change drastiquement ma facon de stocker la config en JSON. Il faut que je conserve les écarts.

    Sinon regardez ce que ca donne quand on arrive au dernier pilote :

    -
    +
    -
    "Zone de pilote décalée"
    +
    Figure 219 - "Zone de pilote décalée"

    Je commence à devenir FOU. Je n'arrive pas à changer cette foutue image wtf... J'ai beau tenter par tous les moyens de la changer par une image noire, l'image semble toujours rester celle du départ.

    Bon j'ai enfin trouvé pourquoi et je n'ai pas envie de dire comment j'ai trouvé... Je pense que l'on a tous droit à son petit jardin secret.

    @@ -2896,9 +2911,9 @@ J'avais un soucis dans ma gestion des chiffres mal faits. Visiblement parfois qu

    La methode "GetTimeFromPng" fait déja presque 430 lignes à cause de tous les cas possibles et tous les try catch. Ca peut paraître peu élégant mais j'ai essayé de mettre des commentaires un peu partout pour permettre à nimporte qui de comprendre ce qui se passe.

    J'ai aussi pu faire les pneus et maintenant (roulement de tambour) Ca marche (presque)

    En fait j'ai des soucis parfois quand les pneus sont un peu cachés dans les permiers tours :

    -
    +
    Pneus cachés -
    Pneus cachés
    +
    Figure 220 - Pneus cachés

    Le soucis c'est que du coup le chiffre est un peu illisible... mais je pense que avec l'historique il devrait y avoir moyen de ne pas prendre en compte les chiffres de pneus pendant cinq tours après le changement de pneu ou de simplement tenter de faire les calculs de pneus.

    Pour conclure la journée je pense que je devrais avoir le temps de faire un système qui permet de refresh à volonté.

    @@ -2917,9 +2932,9 @@ J'avais un soucis dans ma gestion des chiffres mal faits. Visiblement parfois qu

    Il y a eu une petit intervention de mr Bonvin qui est venu me donner une idée pour la partie OCR.

    En fait j'avais un soucis quand je voulais décoder du texte de couleur. Même en appliquant un filtre de gris je n'arrivais pas à faire reconnaitre les chiffres. Et il m'a dit que une bonne idée cela pourrait de prendre la valeur max de chaque channel et de la faire appliquer à tous ce qui blanchit assez bien l'image.

    J'ai décidé d'exagèrer le blanchiment et cela donne des résultats plutôt... intéressants...

    -
    +
    -
    "Filtre vanish oxy action sur un secteur violet"
    +
    Figure 221 - "Filtre vanish oxy action sur un secteur violet"

    Le soucis c'est que le violet est une couleur quand même assez sombre alors il va falloir que je fasse un système de treshold un peu spécial qui soit un peu plus sympa et qui prenne plus facilement des couleurs plus basses.

    Une methode à laquelle j'ai pensé pour detecter dans quel tour chaque pilote est serait de garder en mémoire toutes les infos de chaques pilotes au fur et à mesure, et dès qu'on ne recoit plus d'infos des secteurs ou que le temps au tour a changé on peut savoir qu'il faut passer au tour suivant.

    @@ -3080,14 +3095,14 @@ Pour detecter un arrêt je pense que la meilleure manière est de regarder si le

    Je crois que la detection de tours et des arrêts aux stands est sur la bonne voie. Le seul soucis que j'ai c'est que pour faire du debug je suis un peu obligé d'attendre pendant 10min si je veux avoir de quoi faire des stats un peu sympa.

    Je me rend compte que parfois j'obtiens des résultats un peu bizarres mais que c'est la f1TV qui les donne.

    Par exemple de cas ou Alex Albon n'a que deux tours sur ses pneus alors que tout le monde devant et derrière lui en a 3 et que on est au tour 4.

    -
    +
    -
    "wtf...?"
    +
    Figure 222 - "wtf...?"

    Ah et aussi parfois quand les pilotes se dépassent on se retrouve dans des situations plutôt rigolotes :

    -
    +
    -
    "Wtf...??"
    +
    Figure 223 - "Wtf...??"

    COMMENT JE FAIS POUR DETECTER CA WIONDVIDNJDODVNSDIC

    Bon je me rend compte que clairement si je veux que mes data soient plus utiles il faudrait que je fasse un tout petit peu plus de taff sur quelques points dans l'OCR.

    @@ -3100,15 +3115,15 @@ Pour detecter un arrêt je pense que la meilleure manière est de regarder si le

    Aujourd'hui c'est téléTravail forcé et j'étais scensé aller au Grand Prix d'Imola ce qui malheureusement ne pourra pas se faire pour des raisons d'inondations. En effet la région est clairement pas en état de recevoir un Grand Prix de Formule 1 et donc ce weekend c'est maison.

    Le but du jour c'est d'avancer la doc et de tenter d'améliorer l'OCR pour que Lundi il soit relativement facile d'avancer sur l'interface de l'app finale.

    Je suis en train d'explorer une methode de detection de bords de sobel. Le seul soucis c'est que les résultats sont bons mais avec un vide au milieu des chiffres. Cela veut dire que parfois le temps est mal detecté. Mais il semble que pour le reste du temps cela se passe plutôt bien. Ca vaut peut être le coup de modifier la gestion des erreurs.

    -
    +
    -
    "Artefacts de detection de sobel"
    +
    Figure 224 - "Artefacts de detection de sobel"

    En fait le soucis avec ces artefacts c'est que parfois le temps au tour n'est tout simplement pas detecté. Dans l'exemple ci dessus, la reconnaissance de caractères ne trouve tout simplement rien. Il faut donc que je trouve un moyen de corriger ces soucis.

    Il semblerait que en appliquant un tresholding un peu plus sévère en amont on arrive à réduire les artefacts

    -
    +
    -
    "Artefacts allègés"
    +
    Figure 225 - "Artefacts allègés"

    ;

    Je crois qu'il faut faire attention avec les 'Bitmap.save' quand on utilise de l'asynchrone. le GDI+ aime pas des masses.

    @@ -3123,33 +3138,33 @@ Pour detecter un arrêt je pense que la meilleure manière est de regarder si le

    J'ai ajouté la possibilité d'essayer plusieurs fois de trouver le bouton fullscreen et de cliquer dessus plutôt que d'attendre dix secondes comme un con et espèrer que ca fonctionne. Mais si après 15 secondes d'essais il n'y arrive pas cela fait quand même pêter une erreur.

    Je pense que je vais m'occuper de la page de configuration maintenant.

    Voici à quoi ressemblait la page de settings ce matin quand je suis arrivé.

    -
    +
    -
    "Ancienne page de settings"
    +
    Figure 226 - "Ancienne page de settings"

    Comme je pense que l'UI de cette page ne va pas vraiment changer d'ici la fin du projet je peux me permettre de lui faire une petite beauté car après je ne pense pas y retoucher.

    Pour ca j'ai plusieurs étapes comme choisir une palette de couleur, retirer l'inutile et choisir judicieusement le placement des items sur la form pour que cela soit le plus intuitif possible.

    J'y pense, il fuadrait peut-être que je me trouve un logo ca pourrait rendre bien.

    Voila alors j'ai changé un tout petit peu ce à quoi ressemble la page de settings et j'ai ajouté du responsive pour que le user puisse mettre l'application en plein écran.

    -
    +
    -
    "Nouvelle page de configuration"
    +
    Figure 227 - "Nouvelle page de configuration"

    Mais il manque un peu de couleurs et de détails pour que cela rende vraiment bien.

    Et après quelques tentatives on se retrouve avec une page plutôt sympa je trouve :

    -
    +
    -
    "Nouvelle page de config"
    +
    Figure 228 - "Nouvelle page de config"

    Et elle est responsive :

    -
    +
    -
    "Nouvelle page de config en plein écran"
    +
    Figure 229 - "Nouvelle page de config en plein écran"

    Et j'ai fait quelques changements pour ce qui est des zones qui s'affichent pour qu'on les voie mieux.

    -
    +
    -
    "Nouvelle page de config en action"
    +
    Figure 230 - "Nouvelle page de config en action"

    Je trouve que franchement ca rend pas mal. Le reste de l'app sera dans ce style. J'ai mis pas mal de temps à créer cette page, mais je pense que c'est important que la page de config soit propre. Et en plus tout le temps que j'ai passé ici n'est pas perdu car ensuite j'aurai simplement à suivre les mêmes directives de style pour le reste de l'UI.

    Il faut aussi savoir que Windows Form n'est ps forcément le meilleur outil pour travailler avec le design. Truc tout bête par exemple qui m'a fait perdre 30 minutes. Il est impossible de retirer les bordures des objets "GroupBox". Ce que j'ai donc du faire ca a été de dessiner un rectangle autour de la couleur du background pour que l'on ne voit plus les bordures et ensuite j'ai du redessiner le texte pour qu'il puisse s'afficher quand même.

    @@ -3158,9 +3173,9 @@ Pour detecter un arrêt je pense que la meilleure manière est de regarder si le

    J'aimerais quand même faire une interface sympa même si les data sont pas parfaites. Par ce que je me dis que au pire si je montre une interface qui donne des infos inexacte mais qui a la bonne logique c'est toujours mieux que de ne pas montrer ce que ca pourrait faire avec des données un peu plus intègres.

    Autre point à noter, je me suis rendu compte que ca pourrait être potentiellement pas mal de trouver un moyen rapide de lancer l'appli avec un Grand Prix. Genre permettre de selectionner le preset et l'URL du Grand Prix sans avoir à passer par la page de configuration. Je me suis rendu compte que c'était super chiant de devoir à chaque fois le faire (même si je me rends compte que normalement un user ne devrait pas lancer l'app autant)

    Voila ue première version de l'App avec tous les placeholders :

    -
    +
    -
    "Première version de la page principale"
    +
    Figure 231 - "Première version de la page principale"

    Et c'est tout pour aujourd'hui ! Ce fut une journée remplie.

    Mardi 23 Mai 2023

    @@ -3197,13 +3212,13 @@ Pour detecter un arrêt je pense que la meilleure manière est de regarder si le

    Bon bah le but aujourd'hui c'est de finaliser un peu le projet car la semaine prochaine c'est doc.

    Pas grand chose à dire. J'ai passé la journée à fix des petits bugs par ci par la.

    Voici des exemples de ce à quoi ressemble l'app à la fin de la journée :

    -
    +
    -
    "Screenshot de la page principale"
    +
    Figure 232 - "Screenshot de la page principale"
    -
    +
    -
    "Screenshot de la page principale"
    +
    Figure 233 - "Screenshot de la page principale"

    On se rend jamais compte mais c'est tellement long de règler chaque petit soucis un par un. Il y a tellement de possibilités de choses qui peuvent mal tourner ou qui ont un comportement différent selon l'ordre dans lequel on fait les choses.

    Mais dans l'ensemble, même si on est pas sur la meilleure interface que l'on aie vu dans l'histoire. Je trouve que elle fait quand même le taff.

    @@ -3229,34 +3244,34 @@ Pour detecter un arrêt je pense que la meilleure manière est de regarder si le

    OK JE SUIS DEBILE POURQUOI J'AI PAS FAIT CA PLUS TÔT ???

    En fait ce que j'aurais du faire c'est prendre de gros échantillons de toutes les types de windows et j'aurais un parfait framework pour savoir si j'ai amélioré mon OCR ou non.

    Voici les exemples que je vais utiliser pour verifier le bon fonctionnement de l'OCR :

    -
    +
    -
    "Dataset Ecarts"
    +
    Figure 234 - "Dataset Ecarts"

    ;

    -
    +
    -
    "Dataset Tours"
    +
    Figure 235 - "Dataset Tours"

    ;

    -
    +
    -
    "Dataset Noms"
    +
    Figure 236 - "Dataset Noms"

    ;

    -
    +
    -
    "Dataset Positions"
    +
    Figure 237 - "Dataset Positions"

    ;

    -
    +
    -
    "Dataset Sectors"
    +
    Figure 238 - "Dataset Sectors"

    ;

    -
    +
    -
    "Dataset Tyres"
    +
    Figure 239 - "Dataset Tyres"

    ;

    Je pense que c'est un set assez correct car j'ai essayé de prendre un peu tous les cas possibles.

    @@ -3266,22 +3281,22 @@ Pour detecter un arrêt je pense que la meilleure manière est de regarder si le

    Vendredi 2 Juin 2023

    Aujourd'hui c'est de nouveau doc. Mais la je pense qu'il faut que je rajoute une rubrique "Fonctionnement général" qui résume très simplement toutes les étapes du projet avec un bon diagramme.

    En fait c'est beaucoup plus dur que ce que je pensais de faire un bon diagramme qui explique tout sans être illisible. J'ai mis une heure trente à faire celui la :

    -
    +
    -
    "Diagramme fonctionnement général"
    +
    Figure 240 - "Diagramme fonctionnement général"

    J'ai pris pas mal de temps aussi à faire ces trois autre diagrammes un peu plus graphiques qui montrent de manière un poil plus abstraite le fonctionnement des trois grosses parties du projet.

    -
    +
    -
    "Diagramme recupération d'images"
    +
    Figure 241 - "Diagramme recupération d'images"
    -
    +
    -
    "Diagramme OCR"
    +
    Figure 242 - "Diagramme OCR"
    -
    +
    -
    "Diagramme Traitement"
    +
    Figure 243 - "Diagramme Traitement"

    Je pense qu'ils sont un peu plus faciles à comprendre que le gros diagramme général. Ce que je me dis c'est que je vais faire une section fonctionnement général ou je vais expliquer les trois parties avec les petits diagramme et résumer avec le grand diagramme.

    Lundi 5 Juin 2023

    @@ -3291,16 +3306,16 @@ Pour detecter un arrêt je pense que la meilleure manière est de regarder si le
  • Mon Laptop est incapable de rester plus d'une heure allumé même complêtement chargé à 100%
  • Le WIFI de chez moi a du mal à gèrer plusieurs flux 1080p en même temps et donc le temps de chargement est trop long ce qui me fait des erreurs 105
  • -
    +
    -
    "Ce que voyait le programme pendant les erreurs 105 ce dimanche"
    +
    Figure 244 - "Ce que voyait le programme pendant les erreurs 105 ce dimanche"
    • Le fait que quand un flux est en live, quand on clique dessus, un nouveau bouton apparâit qui n'était pas prévu et qui nous propose de regarder depuis le début ou en live. Le soucis avec ce bouton c'est qu'il n'est présent que pour les sessions live... Il va donc falloir attendre le prochain GP (Canada 18 Juin) pour faire un test en conditions réelles.
    -
    +
    -
    "Ce que voyait le programme avant que j'essaie d'implémenter le click auto"
    +
    Figure 245 - "Ce que voyait le programme avant que j'essaie d'implémenter le click auto"

    J'ai essayé de règler le problème en Live, le soucis c'est que j'ai un commentaire à fournir pendant la course et donc je n'ai pas eu le temps de plus me pencher sur le cas. Le weekend du prochain Grand Prix je vais essayer de tester sur les scéances d'essais libres.le click du bouton et j'amenerai mon cable chez moi.

    Bon sinon aujourd'hui, comme d'hab, Doc... Je vais faire le manuel utilisateur.

    @@ -3384,6 +3399,44 @@ Pour detecter un arrêt je pense que la meilleure manière est de regarder si le

    Jeudi 8 Juin 2023

    Aujourd'hui, le but est de finir la documentation et de mettre les derniers commentaires dans le code et faire une première release en BETA.

    Pour ce genre de travail un peu pénible je conseille une bonne playlist de phonk. Ca permet d'écrire en rythme.

    +

    Vendredi 09 Juin 2023

    +

    La c'est la finalisation de la documentation.

    +

    J'ai créé ce petit script avec l'aide de ChatGPT pour créer une table des figures :

    +
    import os
    +import re
    +
    +def generate_figure_table(directory):
    +    table = []
    +
    +    figure_pattern = r'!\[([^\]]*)\]\(([^\)]*)\)'
    +
    +    for root, dirs, files in os.walk(directory):
    +        for file in files:
    +            if file.endswith(".md"):
    +                file_path = os.path.join(root, file)
    +                with open(file_path, "r") as md_file:
    +                    content = md_file.readlines()
    +                for line in content:
    +                    matches = re.findall(figure_pattern, line)
    +                    for match in matches:
    +                        alt_text = match[0]
    +                        image_path = match[1]
    +                        table.append([alt_text, image_path, file_path])
    +
    +    if table:
    +        headers = ["Texte alternatif", "Chemin de l'image", "Fichier Markdown"]
    +        with open("TableDesFigures.md", "w") as file:
    +            file.write("| " + " | ".join(headers) + " |\n")
    +            file.write("|" + "|".join(["---"] * len(headers)) + "|\n")
    +            for row in table:
    +                file.write("| " + " | ".join(row) + " |\n")
    +        print("Le fichier figure_table.md a été généré avec succès.")
    +    else:
    +        print("Aucune figure trouvée dans les fichiers Markdown.")
    +
    +# Exemple d'utilisation
    +generate_figure_table("./docs")
    +
    @@ -3403,13 +3456,13 @@ Pour detecter un arrêt je pense que la meilleure manière est de regarder si le -