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();
|
Bitmap outputBitmap = (Bitmap)InputBitmap.Clone();
|
||||||
switch (type)
|
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:
|
case WindowType.LapTime:
|
||||||
outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @"\raw_" + id + ".png");
|
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)
|
//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) == "");
|
rawNumbers.RemoveAll(x => ((string)x) == "");
|
||||||
|
|
||||||
if (rawNumbers.Count == 3)
|
switch (windowType)
|
||||||
{
|
{
|
||||||
//mm:ss:ms
|
case OcrImage.WindowType.Sector:
|
||||||
result = (Convert.ToInt32(rawNumbers[0]) * 1000 * 60) + (Convert.ToInt32(rawNumbers[1]) * 1000) + Convert.ToInt32(rawNumbers[2]);
|
int seconds = 0;
|
||||||
}
|
int miliseconds = 0;
|
||||||
else
|
//Usually there is supposed to be only 2 parts.
|
||||||
{
|
if (rawNumbers.Count == 2)
|
||||||
if (rawNumbers.Count == 2)
|
|
||||||
{
|
|
||||||
//ss:ms
|
|
||||||
result = (Convert.ToInt32(rawNumbers[0]) * 1000) + Convert.ToInt32(rawNumbers[1]);
|
|
||||||
|
|
||||||
if (result > (60000 + 999))
|
|
||||||
{
|
{
|
||||||
if (windowType == OcrImage.WindowType.LapTime)
|
//The perect case
|
||||||
{
|
|
||||||
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
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
result = Convert.ToInt32(rawNumbers[0]);
|
seconds = Convert.ToInt32(rawNumbers[0]);
|
||||||
|
miliseconds = Convert.ToInt32(rawNumbers[1]);
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
//It can be because the input is empty or because its the LEADER bracket
|
Console.WriteLine("Sector time convertion failed");
|
||||||
result = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
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;
|
result = 0;
|
||||||
}
|
}
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
page.Dispose();
|
page.Dispose();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -112,8 +112,8 @@ namespace Test_Merge
|
|||||||
{
|
{
|
||||||
sectorCount++;
|
sectorCount++;
|
||||||
if (sectorCount == 1)
|
if (sectorCount == 1)
|
||||||
//result.Sector1 = (int)await (w as DriverSectorWindow).DecodePng();
|
result.Sector1 = (int)await (w as DriverSectorWindow).DecodePng();
|
||||||
result.Sector1 = 0;
|
//result.Sector1 = 0;
|
||||||
if (sectorCount == 2)
|
if (sectorCount == 2)
|
||||||
//result.Sector2 = (int)await (w as DriverSectorWindow).DecodePng();
|
//result.Sector2 = (int)await (w as DriverSectorWindow).DecodePng();
|
||||||
result.Sector2 = 0;
|
result.Sector2 = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user