public static List <CardPattern> readCards(String path) { string[] cards = Directory.GetFiles(path, "card_*.png"); List <CardPattern> patterns = new List <CardPattern>(); foreach (String filepath in cards) { // get png Image png = readPng(filepath); // filename only string filename = Path.GetFileName(filepath); filename = filename.Replace("card_", ""); // crop Image image = cropTransparentLines(png); // colors image = reducer.reduceColors(image); // new pattern Card.SuitEnum suit = toSuit(filename); Card.RankEnum rank = toRank(filename); CardPattern pattern = new CardPattern(image, suit, rank); patterns.Add(pattern); } return(patterns); }
public List <CardRegion> identifyRegions(Image screenImage) { // result List <CardRegion> regions = new List <CardRegion>(); // card dimensions int cardWidth = cards[0].Image.width; int cardHeight = cards[0].Image.height; // scan horizontal foreach (Point point in layout.Cards) { Image screenCard = cropAndReduceCard(screenImage, point, cardWidth, cardHeight); float bestOverlap = 0.0f; CardPattern bestCard = null; foreach (CardPattern card in cards) { // compare bool[] matches = compare(card.Image, screenCard, point); float overlap = percent(matches); // debug if (overlap > 0.1) { Log.Finest(point.X + " -> " + card + " " + overlap); } // no more cards if (overlap < REGIONS_MIN_OVERLAP_SKIP) { return(regions); } // best else if (overlap > bestOverlap) { // store bestOverlap = overlap; bestCard = card; } } // sanity check if (bestOverlap < REGIONS_MIN_OVERLAP_ERROR) { ErrorHandler.BeepError(); ErrorHandler.ReportCardException(screenCard, "Best overlap " + bestOverlap + " < " + REGIONS_MIN_OVERLAP_ERROR + " for card " + bestCard); } // add best card to regions regions.Add(new CardRegion(bestCard, point.X, bestOverlap)); } return(regions); }
private List <CardPattern> generatePatterns(List <CardPattern> patterns) { List <CardPattern> hands = new List <CardPattern>(); foreach (CardPattern pattern in patterns) { int startX = PATTERN_X; int endX = PATTERN_X + PATTERN_WIDTH; int startY = PATTERN_Y; int endY = PATTERN_Y + PATTERN_HEIGHT; CardPattern hand = new CardPattern(pattern.Image.crop(startX, endX, startY, endY), pattern.Suit, pattern.Rank); hands.Add(hand); } return(hands); }
private bool isMatch(int x, int y, Image image, CardPattern card) { // match for (int line = 0; line < card.Image.height; line++) { if ((line + y) >= image.height) { return(false); } int[] cardLine = card.Image.getHorizontalLine(line); int[] imageLine = image.getHorizontalLine(x, y + line); if (!isLineMatch(cardLine, imageLine, cardLine.Length)) { return(false); } } return(true); }
public static List <CardPattern> readCardsFromResources() { List <CardPattern> patterns = new List <CardPattern>(); // get a reference to the current assembly Assembly ass = Assembly.GetExecutingAssembly(); // get a list of resource names from the manifest string[] names = ass.GetManifestResourceNames(); foreach (string name in names) { // card? if (name.Contains("card")) { // split string cardName = name.Substring(name.IndexOf("_") + 1); // read from assembly Stream imgStream = ass.GetManifestResourceStream(name); Bitmap bitmap = Bitmap.FromStream(imgStream) as Bitmap; Image image = toImage(bitmap); imgStream.Close(); // crop image = cropTransparentLines(image); // colors image = reducer.reduceColors(image); // new pattern Card.SuitEnum suit = toSuit(cardName); Card.RankEnum rank = toRank(cardName); CardPattern pattern = new CardPattern(image, suit, rank); patterns.Add(pattern); } } return(patterns); }