Optimised and added cleaning to the sector detection (OCR)
This commit is contained in:
@@ -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");
|
||||
|
||||
|
||||
+74
-118
@@ -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;
|
||||
}
|
||||
|
||||
+2
-2
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user