Создание помощника в преферанс. Этап третий: распознавание масти
Список статей цикла:
- Этап первый: план разработки
- Этап второй: распознавание достоинства
- Этап третий: распознавание масти
Как я уже писал в первой статье цикла, сначала я пошел иным путем: стал работать не только с цветом, но фигурами мастей. Сначала делил масть по цвету: красное, черное, а потом определял конкретную (черви-буби, крести-вини) с помощью расположения точек. К примеру, чем отличается вид масти червей от бубей? Если взять точку сверху по диагонали (отстоящую от центра масти на несколько пикселей вверх и вправо или влево), то у бубей будет здесь точка красного цвета, а у червей – белого. С винями и пиками такая точка-детектор точно та же.
Казалось бы, метод безукоризненный. Однако, если в идеале все работает, то вот в «полевых» испытаниях посыпались ошибки. В чем же дело? Во-первых, скриншот делается не идеально – цвета могут «смазываться». Во-вторых, сами карты прорисованы также не с точностью до пикселя – так что результаты скакали, мне это не подходило.
Решение пришло быстро и неожиданно: если колода карт пользовательская, то почему бы её немного не изменить? Существует множество оттенков красного и черного цветов, почему бы у мастей просто их немного не изменить? Если не присматриваться, то изменения будут совершенно незаметны. После изменения цветов мастей, метод определения их стал до безобразия прост:
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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.