На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Создание помощника в преферанс. Этап третий: распознавание масти


Список статей цикла:
  1. Этап первый: план разработки
  2. Этап второй: распознавание достоинства
  3. Этап третий: распознавание масти
В этой заметке мы научимся определять масть карты с помощью простого метода. Сначала небольшое предисловие, потом он сам с комментариями.

Как я уже писал в первой статье цикла, сначала я пошел иным путем: стал работать не только с цветом, но фигурами мастей. Сначала делил масть по цвету: красное, черное, а потом определял конкретную (черви-буби, крести-вини) с помощью расположения точек. К примеру, чем отличается вид масти червей от бубей? Если взять точку сверху по диагонали (отстоящую от центра масти на несколько пикселей вверх и вправо или влево), то у бубей будет здесь точка красного цвета, а у червей – белого. С винями и пиками такая точка-детектор точно та же.



Казалось бы, метод безукоризненный. Однако, если в идеале все работает, то вот в «полевых» испытаниях посыпались ошибки. В чем же дело? Во-первых, скриншот делается не идеально – цвета могут «смазываться». Во-вторых, сами карты прорисованы также не с точностью до пикселя – так что результаты скакали, мне это не подходило.



Решение пришло быстро и неожиданно: если колода карт пользовательская, то почему бы её немного не изменить? Существует множество оттенков красного и черного цветов, почему бы у мастей просто их немного не изменить? Если не присматриваться, то изменения будут совершенно незаметны. После изменения цветов мастей, метод определения их стал до безобразия прост:

   string mast(int x, int y, int wid, int hey, Boolean perev, PictureBox pb) {
            scr();
            Image im = Image.FromFile(path + sk + ".png");
            Image im2 = cropImage(im, new Rectangle(x, y, wid, hey));
            im2.Save(path + sk + "-m.png", System.Drawing.Imaging.ImageFormat.Png);
            Bitmap bmpImage = new Bitmap(path + sk + "-m.png");           
            if (perev) bmpImage.RotateFlip(RotateFlipType.Rotate180FlipNone); //поворачиваем на 180 градусов 
            pb.Image = bmpImage;

            string cv="масть не определена";
            Color pixelColor;
            string hex, hex2;

            pixelColor = bmpImage.GetPixel(7, 7);
            hex = pixelColor.R.ToString("X2") + pixelColor.G.ToString("X2") + pixelColor.B.ToString("X2");
            hex = hex.Substring(0, 1);
            hex2 = hex;

            if ((hex == "1") || (hex2 == "1")) cv = "вини";
            if ((hex == "0") || (hex2 == "0")) cv = "крести";
            if ((hex == "F") || (hex2 == "F"))cv = "буби";
            if ((hex == "D") || (hex2 == "D")) cv = "черви";
           return cv;        
        }


Метод на вход принимает координаты и размер участка, который необходимо вырезать из скриншота, а надо ли его переворачивать и где отображать. На самом деле программа проста: получаем скрин, обрезаем его, при необходимости поворачиваем, затем с помощью метода GetPixel() получаем цвет. Этот полученный цвет преобразуем в HEX-формат и берем первый символ из этого формата. Именно по этому символу и определяем цвет и, соответственно, масть.

Продолжение следует

Напоминаю, если вам требуется написать программу на заказ на C#, C++ или Java, то вы всегда можете обратиться ко мне.




тегистатьи IT, карты, преферанс, распознавание





Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Быстрая помощь по сайту, или заполнение всех полей
Урок 2. C# комментарии


© upread.ru 2013-2019
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.