From 7f0f481cc3c754ffaf06e7f0d63a6b7cbcd4e7e7 Mon Sep 17 00:00:00 2001 From: maxluli Date: Fri, 12 May 2023 10:10:23 +0200 Subject: [PATCH] Optimised and added cleaning to the sector detection (OCR) --- Test_Merge/OcrImage.cs | 6 ++ Test_Merge/Window.cs | 192 ++++++++++++++++------------------------- Test_Merge/Zone.cs | 4 +- 3 files changed, 82 insertions(+), 120 deletions(-) diff --git a/Test_Merge/OcrImage.cs b/Test_Merge/OcrImage.cs index a44235a..20bfdc1 100644 --- a/Test_Merge/OcrImage.cs +++ b/Test_Merge/OcrImage.cs @@ -46,6 +46,12 @@ namespace Test_Merge Bitmap outputBitmap = (Bitmap)InputBitmap.Clone(); switch (type) { + case WindowType.Sector: + outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @"\raw_" + id + ".png"); + + outputBitmap = Tresholding(outputBitmap,165); + outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @"\Final_treshold_" + id + ".png"); + break; case WindowType.LapTime: outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @"\raw_" + id + ".png"); diff --git a/Test_Merge/Window.cs b/Test_Merge/Window.cs index 1e7684a..a7cfda4 100644 --- a/Test_Merge/Window.cs +++ b/Test_Merge/Window.cs @@ -182,138 +182,94 @@ namespace Test_Merge //removes any empty cells (tho this usually sign of a really bad OCR implementation tbh will have to be fixed higher in the chian) rawNumbers.RemoveAll(x => ((string)x) == ""); - if (rawNumbers.Count == 3) + switch (windowType) { - //mm:ss:ms - result = (Convert.ToInt32(rawNumbers[0]) * 1000 * 60) + (Convert.ToInt32(rawNumbers[1]) * 1000) + Convert.ToInt32(rawNumbers[2]); - } - else - { - if (rawNumbers.Count == 2) - { - //ss:ms - result = (Convert.ToInt32(rawNumbers[0]) * 1000) + Convert.ToInt32(rawNumbers[1]); - - if (result > (60000 + 999)) + case OcrImage.WindowType.Sector: + int seconds = 0; + int miliseconds = 0; + //Usually there is supposed to be only 2 parts. + if (rawNumbers.Count == 2) { - if (windowType == OcrImage.WindowType.LapTime) - { - result = 0; - try - { - if (rawNumbers[0].Length == 4) - { - result += Convert.ToInt32(rawNumbers[0][0]) * 60000; - result += Convert.ToInt32(rawNumbers[0][2].ToString() + rawNumbers[0][3].ToString()) * 1000; - result += Convert.ToInt32(rawNumbers[1]); - } - else - { - //Fuck it - result = 0; - } - } - catch - { - //A lap time is fucked - Console.Write("Fuck"); - } - } - if (windowType == OcrImage.WindowType.Sector) - { - int seconds = 0; - if (rawNumbers[0].Length == 3) - { - //We have one char that we need to delete - //For no apparent reason im going to delete the first - seconds = Convert.ToInt32(rawNumbers[0][1].ToString() + rawNumbers[0][2].ToString()); - } - if (rawNumbers[0].Length == 2) - { - seconds = Convert.ToInt32(rawNumbers[0][0].ToString() + rawNumbers[0][1].ToString()); - } - int ms = Convert.ToInt32(rawNumbers[1][0].ToString() + rawNumbers[1][1].ToString() + rawNumbers[1][2].ToString()); - result = seconds * 1000 + ms; - } - } - } - else - { - if (rawNumbers.Count == 1) - { - //If this code is used it means that its bad ... - //The methods that comes are really not that great and are juste quick fixes + //The perect case try { - result = Convert.ToInt32(rawNumbers[0]); - - switch (windowType) - { - case OcrImage.WindowType.Sector: - //The usual sector is in this form : 33.456 - if (rawNumbers[0].Length == 6) - { - //The '.' has been understood like a number - result = 0; - result += Convert.ToInt32(rawNumbers[0][0] + rawNumbers[0][1]) * 1000; - result += Convert.ToInt32(rawNumbers[0][3] + rawNumbers[0][4] + rawNumbers[0][5]); - } - if (rawNumbers[0].Length == 5) - { - //The '.' has been overlooked - result = 0; - result += Convert.ToInt32(rawNumbers[0][0] + rawNumbers[0][1]) * 1000; - result += Convert.ToInt32(rawNumbers[0][2] + rawNumbers[0][3] + rawNumbers[0][4]); - } - break; - case OcrImage.WindowType.LapTime: - //The usual Lap time is in this form : 1:45:345 - result = 0; - if (rawNumbers[0].Length == 6) - { - //The '.' and ':' have been overlooked - //I Know Im skipping the cases where there are more than 9 minuts but it happens so rarely that... we dont care - result += Convert.ToInt32(rawNumbers[0][0]) * 60000; - result += Convert.ToInt32(rawNumbers[0][1] + rawNumbers[0][2]) * 1000; - result += Convert.ToInt32(rawNumbers[0][3] + rawNumbers[0][4] + rawNumbers[0][5]); - } - if (rawNumbers[0].Length == 7) - { - //There is two possibilities - //Either 1:45.140 has been interpreted as 1145.10 or 1:451140. We will assume its the first one - result += Convert.ToInt32(rawNumbers[0][0]) * 60000; - result += Convert.ToInt32(rawNumbers[0][2] + rawNumbers[0][3]) * 1000; - result += Convert.ToInt32(rawNumbers[0][4] + rawNumbers[0][5] + rawNumbers[0][6]); - } - break; - case OcrImage.WindowType.Gap: - //The usual Gap is in this form : + 34.567 - if (rawNumbers[0].Length == 5) - { - //The '.' has been overlooked - result += Convert.ToInt32(rawNumbers[0][0] + rawNumbers[0][1]) * 1000; - result += Convert.ToInt32(rawNumbers[0][2] + rawNumbers[0][3] + rawNumbers[0][4]); - } - break; - } - if (rawNumbers[0].Length > 6) - { - //The number definitely has been interpreted wrong - } + seconds = Convert.ToInt32(rawNumbers[0]); + miliseconds = Convert.ToInt32(rawNumbers[1]); } catch { - //It can be because the input is empty or because its the LEADER bracket - result = 0; + Console.WriteLine("Sector time convertion failed"); } } else { - //Auuuugh + if(rawNumbers.Count == 1) + { + //Here it is a little harder... Usually its because a '.' has been overlooked or interpreted as a number + + if (rawNumbers[0].Length == 6) + { + //The '.' has been understood as a number + try + { + seconds = Convert.ToInt32(rawNumbers[0][0].ToString() + rawNumbers[0][1].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[0][3].ToString() + rawNumbers[0][4].ToString() + rawNumbers[0][5].ToString()); + } + catch + { + Console.WriteLine("Sector time convertion failed"); + } + } + else + { + if (rawNumbers[0].Length == 5) + { + //The '.' has been overlooked + try + { + seconds = Convert.ToInt32(rawNumbers[0][0].ToString() + rawNumbers[0][1].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[0][2].ToString() + rawNumbers[0][3].ToString() + rawNumbers[0][4].ToString()); + } + catch + { + Console.WriteLine("Sector time convertion failed"); + } + } + else + { + Console.WriteLine("Sector time convertion failed"); + } + } + } + else + { + //The OCR detected more than 1 '.' wich is concerning because that means that something went really wrong + Console.WriteLine("Sector time convertion failed"); + } + } + + result = 0; + result += seconds * 1000; + result += miliseconds; + break; + case OcrImage.WindowType.LapTime: + + break; + case OcrImage.WindowType.Gap: + + break; + default: + try + { + result = Convert.ToInt32(rawNumbers[0]); + } + catch + { result = 0; } - } + break; } + page.Dispose(); return result; } diff --git a/Test_Merge/Zone.cs b/Test_Merge/Zone.cs index 5ff83cf..dd6514c 100644 --- a/Test_Merge/Zone.cs +++ b/Test_Merge/Zone.cs @@ -112,8 +112,8 @@ namespace Test_Merge { sectorCount++; if (sectorCount == 1) - //result.Sector1 = (int)await (w as DriverSectorWindow).DecodePng(); - result.Sector1 = 0; + result.Sector1 = (int)await (w as DriverSectorWindow).DecodePng(); + //result.Sector1 = 0; if (sectorCount == 2) //result.Sector2 = (int)await (w as DriverSectorWindow).DecodePng(); result.Sector2 = 0;