![]() |
Создание помощника в преферанс. Этап второй: распознавание достоинстваСписок статей цикла:
public void scr() { Bitmap prt = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); Graphics graphics = Graphics.FromImage(prt as Image); graphics.CopyFromScreen(0, 0, 0, 0, prt.Size); Random rnd = new Random(); int rr = rnd.Next(100000); sk = Convert.ToInt32(DateTime.Now.Subtract(new DateTime(1970, 1, 1)).TotalSeconds)+rr; prt.Save(path + sk + ".png", System.Drawing.Imaging.ImageFormat.Png); }Весь код в методе стандартный, комментировать что-то нет смысла. Единственно, на что обращу ваше внимание, так это на то, что используем для сохранения изображения формат именно png - так получается качественная и четкая картинка. Сначала я как-то не обратил внимания на это и сохранял в jpg - в результате получались скриншоты экрана даже с идентичными картами в разных цветах, с размытыми границами - в общем, не самого лучшего качества. Переменная path - это путь, где будут ваши скрины. ![]() рис 1: скриншот экрана для помощника в преферанс Также нам потребуется метод, обрезающий скриншот по заданным координатам. Почему бы не обрезать сразу в методе создания скрина, спросите вы? Потому, что скрин нужен нам не один раз, отвечу я. private static Image cropImage(Image img, Rectangle cropArea) { Bitmap bmpImage = new Bitmap(img); return bmpImage.Clone(cropArea, bmpImage.PixelFormat); } ![]() рис 2: обрезанная десятка Вот теперь можно перейти и непосредственно к распознаванию. Метод для первой карты: private void otob() { scr();//получаем скриншот Image im = Image.FromFile(path + sk + ".png");//инициализируем файл изображения int x = 12, y = 528, wid = 14, hey = 22;//задаем координаты для обрезки Image im2 = cropImage(im, new Rectangle(x, y, wid, hey));//обрезаем im2.Save(path + sk + "-m.png", System.Drawing.Imaging.ImageFormat.Png);//сохраняем новое обрезанное //работа по распознаванию Ocr ocr = new Ocr(); Bitmap bmpImage = new Bitmap(path + sk + "-m.png"); tessnet2.Tesseract tessocr = new tessnet2.Tesseract(); tessocr.SetVariable("tessedit_char_whitelist", "01789AJKQ"); tessocr.Init(null, "eng", false); List<tessnet2.Word> text = ocr.DoOCRNormal((Bitmap)bmpImage, "eng"); //далее идет обработка и отображение, мы работаем с text[0].Text string zn = text[0].Text; if (zn!="10") zn = zn.Substring(0, 1); if (zn == "J") zn = "В"; if (zn == "Q") zn = "Д"; if (zn == "K") zn = "К"; if (zn == "A") zn = "Т"; string ms = mast(10, 549, 15, 15, false, pictureBox10); //определяем масть soot(ms, zn, 1); //соответствие pokazvishedshih(1);//вывод на экран }Собственно, ничего сложного в этом методе и нет - комментарии довольно подробные. Подключаем белый список из некоторых цифр и букв, а затем переводим в русские. Вот исходный код класса Ocr: public class Ocr { public List<tessnet2.Word> DoOCRNormal(Bitmap image, string lang) { tessnet2.Tesseract ocr = new tessnet2.Tesseract(); ocr.Init(null, lang, false); List<tessnet2.Word> result = ocr.DoOCR(image, Rectangle.Empty); return result; } }Некоторые карты необходимо переворачивать перед распознаванием, так как верхняя часть с достоинством закрывается другой. ![]() рис 3: перевернутая семерка Никаких проблем это нам не доставит, просто в метод otob для таких карт добавим строчку, переворачивающую изображение на 180 градусов: bmpImage.RotateFlip(RotateFlipType.Rotate180FlipNone);Не забываем подключить ссылку на tessnet2_64.dll в обозревателе решений. Напомню, что работу мы ведем в Microsoft Visual C# 2010. В заключение этой статьи отмечу, что dll для 32-х и 64-х разрядных систем отличаются - следует подключать именно ту tessnet2, которая подходит для вашей системы. В следующих статьях мы определим масть и сделаем еще кое-что. ![]() Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда. ![]() |
Мои услуги
|
© upread.ru 2013-2023 При перепечатке активная ссылка на сайт обязательна. |