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


Список статей цикла:
  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, то вы всегда можете обратиться ко мне.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

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




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



Слепая инъекция SQL
Зачем изучать алгоритмы программирования?
MS Visual C++ 2015 не устанавливается: ошибка 0x80070666