Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
 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);
 }
Exemplo n.º 5
0
        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);
        }