using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using Tesseract; namespace Test_Merge { public class ConfigurationTool { public Zone MainZone; public const int NUMBER_OF_DRIVERS = 20; public const int NUMBER_OF_ZONES = 9; public ConfigurationTool(Bitmap fullImage,Rectangle mainZoneDimensions) { MainZone = new Zone(fullImage,mainZoneDimensions); AutoCalibrate(); } public void AddWindows(List rectangles) { foreach (Zone driverZone in MainZone.Zones) { Bitmap zoneImage = driverZone.ZoneImage; for (int i = 1; i <= rectangles.Count; i++) { switch (i) { case 1: //First zone should be the driver's Position driverZone.AddWindow(new DriverPositionWindow(driverZone.ZoneImage, rectangles[i])); break; case 2: //First zone should be the driver's Position driverZone.AddWindow(new DriverGapToLeaderWindow(driverZone.ZoneImage, rectangles[i])); break; case 3: //First zone should be the driver's Position driverZone.AddWindow(new DriverLapTimeWindow(driverZone.ZoneImage, rectangles[i])); break; case 4: //First zone should be the driver's Position driverZone.AddWindow(new DriverDrsWindow(driverZone.ZoneImage, rectangles[i])); break; case 5: //First zone should be the driver's Position driverZone.AddWindow(new DriverTyresWindow(driverZone.ZoneImage, rectangles[i])); break; case 6: //First zone should be the driver's Position driverZone.AddWindow(new DriverNameWindow(driverZone.ZoneImage, rectangles[i])); break; case 7: //First zone should be the driver's Position driverZone.AddWindow(new DriverSectorWindow(driverZone.ZoneImage, rectangles[i])); break; case 8: //First zone should be the driver's Position driverZone.AddWindow(new DriverSectorWindow(driverZone.ZoneImage, rectangles[i])); break; case 9: //First zone should be the driver's Position driverZone.AddWindow(new DriverSectorWindow(driverZone.ZoneImage, rectangles[i])); break; } } } } public void AutoCalibrate() { List detectedText = new List(); List zones = new List(); TesseractEngine engine = new TesseractEngine(Window.TESS_DATA_FOLDER.FullName, "eng", EngineMode.Default); Image image = MainZone.ZoneImage; var tessImage = Pix.LoadFromMemory(Window.ImageToByte(image)); Page page = engine.Process(tessImage); using (var iter = page.GetIterator()) { iter.Begin(); do { Rect boundingBox; if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out boundingBox)) { //var text = iter.GetText(PageIteratorLevel.Word).ToUpper(); //We remove all the rectangles that are definitely too big if (boundingBox.Height < image.Height / NUMBER_OF_DRIVERS) { //Now we add a filter to only get the boxes in the right because they are much more reliable in size if (boundingBox.X1 > image.Width / 2) { //Now we check if an other square box has been found roughly in the same y axis bool match = false; //The tolerance is roughly half the size that a window will be int tolerance = (image.Height / NUMBER_OF_DRIVERS) / 2; foreach (Rectangle rect in detectedText) { if (rect.Y > boundingBox.Y1 - tolerance && rect.Y < boundingBox.Y1 + tolerance) { //There already is a rectangle in this line match = true; } } //if nothing matched we can add it if (!match) detectedText.Add(new Rectangle(boundingBox.X1, boundingBox.Y1, boundingBox.Width, boundingBox.Height)); } } } } while (iter.Next(PageIteratorLevel.Word)); } foreach (Rectangle Rectangle in detectedText) { Rectangle windowRectangle; Size windowSize = new Size(image.Width, image.Height / NUMBER_OF_DRIVERS); Point windowLocation = new Point(0, (Rectangle.Y + Rectangle.Height / 2) - windowSize.Height / 2); windowRectangle = new Rectangle(windowLocation, windowSize); //We add the driver zones MainZone.AddZone(new Zone(MainZone.ZoneImage, windowRectangle)); } } } }