private static double mapMaxInterval(string value) { string values = value.Replace("[", "").Replace("]", ""); string[] numbers = values.Split(','); return(TextTools.ParseDouble(numbers[1])); }
private List <ValueWithY> identifyValues(Image tableList, int x, int width, int height) { // rows Image rows = tableList.crop(x, width, 0, height); // reduce & replace Image reducedRows = reducer.reduceColors(rows); Image replacedRows = replacer.replace(reducedRows); // render renderImage(reducedRows, new Point(x, 0)); // chars List <ImageLine> lines = HorizontalPartitioner.partitionWithY(replacedRows); // chars List <ValueWithY> result = new List <ValueWithY>(); foreach (ImageLine line in lines) { String textLine = ""; foreach (Image chars in line) { List <Image> combos = CharDecomposer.decompose(chars); foreach (Image chr in combos) { Image character = ImageCropper.crop(chr); textLine += identifyChars(identifier, character); } } // pure numbers string numericTextLine = textLine; foreach (char chr in textLine) { if (!TextTools.IsNumeric(chr) && !TextTools.IsPoint(chr)) { numericTextLine = numericTextLine.Replace(chr.ToString(), ""); } } // convert if (numericTextLine.Length != 0) { double value = TextTools.ParseDouble(numericTextLine); result.Add(new ValueWithY(value, line.Y)); } else { result.Add(new ValueWithY(line.Y)); } } return(result); }
public double process(Image image, Rectangle rect, TableIdentifier parent) { // colors Image cropped = crop(image, rect); Image reduced = reducer.reduceColors(cropped); Image replaced = replacer.replace(reduced); // image parent.renderImage(inker.replace(replaced), rect); // partition List <List <Image> > lines = HorizontalPartitioner.partition(replaced); if (lines.Count == 0) { return(Table.NO_POT); } // chars String textLine = ""; foreach (Image chars in lines[0]) { List <Image> combos = CharDecomposer.decompose(chars); foreach (Image chr in combos) { Image character = ImageCropper.crop(chr); textLine += identifyChars(character); } } // check for digit if (!TextTools.ContainsDigit(textLine)) { return(Table.NO_POT); } // format textLine = textLine.Replace("$", "").Replace("?", "").Trim(); // money return(TextTools.ParseDouble(textLine)); }
private double evalFactor(string term, string identifier) { term = term.Trim(); if (term.Length == identifier.Length) { return(1); } else { string factorTerm = term.Replace(identifier, string.Empty); if (factorTerm.StartsWith(".")) { return(TextTools.ParseDouble("0" + factorTerm)); } else { return(TextTools.ParseDouble(factorTerm)); } } }
private void processTextBox(TextBoxPipeline pipe, Player info, Image table, int id, PlayerInfoEnum read, bool isMySeat) { try { if (read == PlayerInfoEnum.BOTH || read == PlayerInfoEnum.NAME) { // textbox Rectangle rect = layout.Names[id]; info.Position = id; info.NameRect = rect; Image image = crop(table, rect); List <String> textLines = pipe.process(image, id, rect, this, isMySeat); if (textLines.Count == 0) { info.State = Player.States.NON_EXISTENT; } else { if (!containsChars(textLines[0])) { info.State = Player.States.NON_EXISTENT; } else { info.State = Player.States.EXISTENT; info.Name = textLines[0]; } } } if (read == PlayerInfoEnum.BOTH || read == PlayerInfoEnum.MONEY) { // textbox Rectangle rect = layout.Money[id]; info.Position = id; info.MoneyRect = rect; Image image = crop(table, rect); List <String> textLines = pipe.process(image, id, rect, this, isMySeat); if (textLines.Count == 0) { info.State = Player.States.NON_EXISTENT; } else { if (!containsChars(textLines[0])) { info.State = Player.States.NON_EXISTENT; } else { info.State = Player.States.EXISTENT; if (textLines[0].Contains("$")) { info.State = Player.States.EXISTENT; info.Money = TextTools.ParseDouble(textLines[0].Replace("$", "").Trim()); } else { info.Money = Player.NO_MONEY; } } } } } catch (Exception) { Log.Warn("Unable to read player info (mode = " + read + ")"); } }
public TableControl process(Image image, int position, Rectangle rect, TableIdentifier parent) { // crop image = crop(image, rect); // colors Image reduced = reducer.reduceColors(image); Image inverted = inverter.invert(reduced); Image replaced = replacer.replace(inverted); // image parent.renderImage(inker.replace(replaced), rect); // partition List <List <Image> > lines = HorizontalPartitioner.partition(replaced); // ## action ## TableControl.ControlType type = TableControl.ControlType.NONE; if (lines.Count >= 1) { // read chars String actionText = ""; foreach (Image chars in lines[0]) { List <Image> combos = CharDecomposer.decompose(chars, 0); foreach (Image chr in combos) { Image character = ImageCropper.crop(chr); actionText += identifyChars(character); } } if (actionText == "Fold") { type = TableControl.ControlType.FOLD; } else if (actionText == "Check") { type = TableControl.ControlType.CHECK; } else if (actionText.StartsWith("Cal")) { type = TableControl.ControlType.CALL; } else if (actionText == "Bet") { type = TableControl.ControlType.BET; } else if (actionText.StartsWith("Raise")) { type = TableControl.ControlType.RAISE; } else if (actionText.StartsWith("Post")) { type = TableControl.ControlType.POST_BLIND; } } // ## amount ## double amount = 0.0; if (lines.Count >= 2) { // read chars String amountText = ""; foreach (Image chars in lines[1]) { List <Image> combos = CharDecomposer.decompose(chars, 0); foreach (Image chr in combos) { Image character = ImageCropper.crop(chr); amountText += identifyChars(character); } } // format amountText = amountText.Replace("$", "").Replace("?", "").Trim(); // money amount = TextTools.ParseDouble(amountText); } return(new TableControl(type, position, amount)); }
public double process(Image image, Rectangle rect, TableIdentifier parent) { // colors Image reduced = reducer.reduceColors(image); Image inverted = inverter.invert(reduced); Image replaced = replacer.replace(inverted); // image parent.renderImage(inker.replace(replaced), rect); // partition List <List <Image> > lines = HorizontalPartitioner.partition(replaced); if (lines.Count == 0) { return(Player.NO_BET); } // chars String textLine = ""; foreach (Image chars in lines[0]) { List <Image> combos = CharDecomposer.decompose(chars); foreach (Image chr in combos) { Image character = ImageCropper.crop(chr); textLine += identifyChars(character); } } // check for digit if (!TextTools.ContainsDigit(textLine)) { return(Player.NO_BET); } // sanity check if (!textLine.Contains("$")) { throw new ArgumentException("bet text has no dollar sign"); } // replace all non-numeric chars textLine = textLine.Trim(); string numericTextLine = textLine; foreach (char chr in textLine) { if (!TextTools.IsNumeric(chr) && !TextTools.IsPoint(chr)) { numericTextLine = numericTextLine.Replace(chr.ToString(), ""); } } // sanity check (sometimes some pixels are identifier as '.') if (numericTextLine.StartsWith(".")) { numericTextLine = numericTextLine.Substring(1); } // money return(TextTools.ParseDouble(numericTextLine)); }