Improved processing quality of the tyres number of laps

This commit is contained in:
2023-04-24 13:47:12 +02:00
parent 70085721f4
commit 997f6407f6
2 changed files with 29 additions and 22 deletions
+2 -3
View File
@@ -32,8 +32,6 @@ namespace OCR_Decode
private async Task<Tyre> GetTyreInfos() private async Task<Tyre> GetTyreInfos()
{ {
Bitmap tyreZone = GetSmallBitmapFromBigOne(WindowImage, FindTyreZone()); Bitmap tyreZone = GetSmallBitmapFromBigOne(WindowImage, FindTyreZone());
//tyreZone.Save(Reader.DEBUG_DUMP_FOLDER + "ZONE" + ".png");
Tyre.Type type = Tyre.Type.Undefined; Tyre.Type type = Tyre.Type.Undefined;
type = GetTyreTypeFromColor(OcrImage.GetAvgColorFromBitmap(OcrImage.Resize(tyreZone, 2))); type = GetTyreTypeFromColor(OcrImage.GetAvgColorFromBitmap(OcrImage.Resize(tyreZone, 2)));
int laps = -1; int laps = -1;
@@ -45,7 +43,8 @@ namespace OCR_Decode
} }
catch catch
{ {
//We could not convert the number //We could not convert the number so its a letter so its 0 laps old
laps = 0;
} }
//tyreZone.Save(Reader.DEBUG_DUMP_FOLDER + "Tyre" + type + "Laps" + laps + '#' + rnd.Next(0, 1000) + ".png"); //tyreZone.Save(Reader.DEBUG_DUMP_FOLDER + "Tyre" + type + "Laps" + laps + '#' + rnd.Next(0, 1000) + ".png");
return new Tyre(type, laps); return new Tyre(type, laps);
+27 -19
View File
@@ -15,6 +15,7 @@ namespace OCR_Decode
public class OcrImage public class OcrImage
{ {
Bitmap InputImage; Bitmap InputImage;
Random rnd = new Random();
public enum WindowType public enum WindowType
{ {
LapTime, LapTime,
@@ -30,29 +31,31 @@ namespace OCR_Decode
public Bitmap Enhance(WindowType type = WindowType.Text) public Bitmap Enhance(WindowType type = WindowType.Text)
{ {
Bitmap result = (Bitmap)InputImage.Clone(); Bitmap result = (Bitmap)InputImage.Clone();
int salt = rnd.Next(0, 10000);
switch (type) switch (type)
{ {
case WindowType.LapTime: case WindowType.LapTime:
result = Tresholding(result, 185); result = Tresholding(result, 185);
result = Resize(result,2); result = Resize(result, 2);
result = Dilatation(result,1); result = Dilatation(result, 1);
result = Erode(result,1); result = Erode(result, 1);
break; break;
case WindowType.Text: case WindowType.Text:
result = InvertColors(result); result = InvertColors(result);
result = Tresholding(result, 165); result = Tresholding(result, 165);
result = Resize(result,2); result = Resize(result, 2);
result = Dilatation(result, 1); result = Dilatation(result, 1);
break; break;
case WindowType.Tyre: case WindowType.Tyre:
//result.Save(Reader.DEBUG_DUMP_FOLDER + "tyreBefore_" + salt + ".png");
result = RemoveUseless(result); result = RemoveUseless(result);
result = Resize(result,4); result = Resize(result, 4);
result = Dilatation(result, 1); result = Dilatation(result, 1);
//result.Save(Reader.DEBUG_DUMP_FOLDER + "tyreAfter_" + salt + ".png");
break; break;
default: default:
result = Tresholding(result, 165); result = Tresholding(result, 165);
result = Resize(result,4); result = Resize(result, 4);
result = Erode(result, 1); result = Erode(result, 1);
break; break;
} }
@@ -162,7 +165,7 @@ namespace OCR_Decode
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat); BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);
int bytesPerPixel = Bitmap.GetPixelFormatSize(bmp.PixelFormat) / 8; int bytesPerPixel = Bitmap.GetPixelFormatSize(bmp.PixelFormat) / 8;
Color limitColor = Color.FromArgb(0x50,0x50,0x50);
byte* ptr = (byte*)bmpData.Scan0.ToPointer(); byte* ptr = (byte*)bmpData.Scan0.ToPointer();
for (int y = 0; y < bmp.Height; y++) for (int y = 0; y < bmp.Height; y++)
@@ -181,13 +184,17 @@ namespace OCR_Decode
int G = pixel[1]; int G = pixel[1];
int R = pixel[2]; int R = pixel[2];
if (fromBorder && B < 0x10 && G < 0x10 && R < 0x10) if (fromBorder && B < limitColor.B && G < limitColor.G && R < limitColor.R)
{ {
pixelsToRemove.Add(x); pixelsToRemove.Add(x);
} }
else else
{ {
fromBorder = false; if (fromBorder)
{
fromBorder = false;
pixelsToRemove.Add(x);
}
} }
} }
fromBorder = true; fromBorder = true;
@@ -199,13 +206,17 @@ namespace OCR_Decode
int G = pixel[1]; int G = pixel[1];
int R = pixel[2]; int R = pixel[2];
if (fromBorder && B < 0x10 && G < 0x10 && R < 0x10) if (fromBorder && B < limitColor.B && G < limitColor.G && R < limitColor.R)
{ {
pixelsToRemove.Add(x); pixelsToRemove.Add(x);
} }
else else
{ {
fromBorder = false; if (fromBorder)
{
fromBorder = false;
pixelsToRemove.Add(x);
}
} }
} }
@@ -219,9 +230,8 @@ namespace OCR_Decode
} }
} }
//NOW REMOVING THE COLOR //NOW REMOVING THE COLOR
Color limitColor = Color.FromArgb(0x50, 0x50, 0x50);
for (int y = 0; y < bmp.Height; y++) for (int y = 0; y < bmp.Height; y++)
{ {
byte* currentLine = ptr + (y * bmpData.Stride); byte* currentLine = ptr + (y * bmpData.Stride);
@@ -235,7 +245,7 @@ namespace OCR_Decode
//We remove the background pixels //We remove the background pixels
if (R >= limitColor.R || G >= limitColor.G || B >= limitColor.B) if (R >= limitColor.R + 20 || G >= limitColor.G + 20 || B >= limitColor.B + 20)
{ {
pixel[0] = 0xFF; pixel[0] = 0xFF;
pixel[1] = 0xFF; pixel[1] = 0xFF;
@@ -244,8 +254,6 @@ namespace OCR_Decode
} }
} }
bmp.UnlockBits(bmpData); bmp.UnlockBits(bmpData);
return bmp; return bmp;
@@ -268,7 +276,7 @@ namespace OCR_Decode
byte* ptr = (byte*)bmpData.Scan0.ToPointer(); byte* ptr = (byte*)bmpData.Scan0.ToPointer();
int bmpHeight = bmp.Height; int bmpHeight = bmp.Height;
int bmpWidth = bmp.Width; int bmpWidth = bmp.Width;
Parallel.For(0,bmpHeight,y=> Parallel.For(0, bmpHeight, y =>
//for (int y = 0; y < bmp.Height; y++) //for (int y = 0; y < bmp.Height; y++)
{ {
byte* currentLine = ptr + (y * bmpData.Stride); byte* currentLine = ptr + (y * bmpData.Stride);
@@ -329,7 +337,7 @@ namespace OCR_Decode
Bitmap output = filter.Apply(input); Bitmap output = filter.Apply(input);
return output; return output;
} }
public static Bitmap Resize(Bitmap sourceBitmap,int amount) public static Bitmap Resize(Bitmap sourceBitmap, int amount)
{ {
// Create a new Bitmap object to hold the resized image // Create a new Bitmap object to hold the resized image
var resultBitmap = new Bitmap(sourceBitmap.Width * amount, sourceBitmap.Height * amount); var resultBitmap = new Bitmap(sourceBitmap.Width * amount, sourceBitmap.Height * amount);