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 { private Zone mainZone; const int NUMBER_OF_DRIVERS = 20; const int NUMBER_OF_ZONES = 7; public ConfigurationTool() { //empty for now } public void AddZones(List rectangles) { foreach (Zone driverZone in mainZone.Zones) { Bitmap zoneImage = driverZone.ZoneImage; for () { //We need to add all the zone and the types //if i== 1 => driverZone.Add(new DriverPositionWindow) } foreach (Rectangle rectangle in rectangles) { driverZone.AddWindow(new Window()); } } } 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)); } } } }