Добавлен инструмент обучения. Найти его можно в вкладке графика, выделив нужную область с текстом и нажав правую кнопку мыши > Настройка распознавания текста.
Скачать демонстрационную базу
Скачать базу обучения
Обучалась в блокноте на стандартных шрифтах. Около 10.
Как правильно обучать базу
Видео работы функции и процесс обучения.
На этом видео показано использование оптического распознавания текста при создание бота для игры в визуальном редакторе.
Бот для серфинга. Разгадывает простую капчу, работает в фоновом режиме
Создание бота для Music Wars в реальном времени. Сканирование и распознавание данных с экрана
Пример как исправить текст если вместо букв вставляются цифры, к примеру 0 или 3 вместо о или з
Или наоборот. Вместо цифр похожие буквы.(для просмотра ссылки Вам необходимо авторизоваться)
readtext - сканирует указанную область экрана, окна или двухмерного массива int куда загружено изображение, чистит изображение от шума, распознает текст и записывает его в string или char
loadsymbolbase - загружает обученную базу. Можно загружать несколько баз.
symbolxpos - возвращает позицию символа по X от начала зоны поиска. Левый угол
symbolypos - возвращает позицию символа по Y от начала зоны поиска. Нижний угол
symbolwidth - возвращает ширину символа
symbolheight - возвращает высоту символа
symbolcorrect - возвращает оценку корректности распознания символа. максимальная 1
symboltype - возвращает тип. 0 цифра, 1 русс, 2 англ, 3 знак препинания и т.д.
enablesymbolbase - подключает конкретно выбранную базу загруженную ранее loadsymbolbase
disablesymbolbase - отключает конкретно выбранную базу загруженную ранее loadsymbolbase
Парамтры:
readtext (RU, #ch[0][0], 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
1 - какие типы символов будем искать
NUM цифры
RU русские
EN английские
MARK знаки
Можно комбинировать
NUM | RU | EN | MARK
Цитата:
readtext (NUM | RU | EN | MARK, #ch[0][0], 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
2 - куда будем сохранять текст
Можно в string
Цитата:
string text;
readtext (RU, #text, 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
readtext (RU, #text, 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
В этом случае многострочный текст будет разделен переводом строки.
Цитата:
string text[5];
readtext (RU, #text[0], 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
readtext (RU, #text[0], 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
В этом случае в text[0] будет первая строка, в text[1] вторая и т.д.
Можно в char
Цитата:
char c;
readtext (RU, #c, 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
readtext (RU, #c, 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
В этом случае в c будет один первый символ.
Цитата:
char c[200];
readtext (RU, #c[0], 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
readtext (RU, #c[0], 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
В этом случае в c будет весь текст. Строки будут разделены 0
Цитата:
char c[5][200];
readtext (RU, #c[0][0], 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
readtext (RU, #c[0][0], 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
В этом случае текст
кибор
бот
будет расположен так:
Цитата:
c[0][0]='к', c[0][1]='и', c[0][2]='б', c[0][3]='о', c[0][4]='р', c[0][5]=0;
c[1][0]='б', c[1][1]='о', c[1][2]='т', c[1][3]=0;
c[1][0]='б', c[1][1]='о', c[1][2]='т', c[1][3]=0;
Конец строки заполнится 0, поэтому надо выделять память больше чем текст.
3 - параметр фильтра текст / фон. узнать его можно в инструменте настройки и обучения.
4 - параметр сглаживания
5 - контрасность
6 - длина удаляемых горизонтальных линий
7 - длина удаляемых вертикальных линий
8 - указатель (если надо) на одномерный массив int в котором находятся цвета текста
-1 если не указан ни один цвет
1 если текстовым цветом считаются все кроме указанных фоновых.
9 - указатель (если надо) на одномерный массив int в котором находятся цвета фона
-1 если не указан ни один цвет
1 если фоновым цветом считаются все кроме указанных текстовых.
Если мы для текста или фона указали все цвета, необходимо указать определенный или определенные цвета для противоположного.
Не допускается указывать все цвета для текста и для фона одновременно
10 - допустимая разбежность этих цветов
Цитата:
int col_text[2];
col_text[0]=236455;
col_text[1]=23445;
int col_fon[1];
col_fon[0]=654767567;
readtext (RU | MARK, #ch[0][0], 4, 1, -1, 35, 35, #col_text[0], #col_fon[0], 25, 50, 11, 150, 641, 483, -1);
col_text[0]=236455;
col_text[1]=23445;
int col_fon[1];
col_fon[0]=654767567;
readtext (RU | MARK, #ch[0][0], 4, 1, -1, 35, 35, #col_text[0], #col_fon[0], 25, 50, 11, 150, 641, 483, -1);
Если не надо ставим -1
11 - величина обученности. Этот параметр указывает насколько мы доверяем программе делать решения по разделению символо, слиянию и
т.д. Указывать не более чем показывают оценки в инструменте настроек и обучения.
12 13 14 15 - зона сканирования. Функция требовательная. Не надо указывать большую зону с большим количеством символов. Только то чтонеобходимо распознать.
16 - указатель на окно, экран либо двухмерный массив int в котором находится изображение.
Цитата:
readtext (RU | MARK, #ch[0][0], 4, 1, -1, 35, 35, #col_text[0], #col_fon[0], 25, 50, 11, 150, 641, 483, -1);//весь экран
Цитата:
win w=window ("рф онлайн.jpg - Paint", "MSPaintApp", -1);
readtext (RU | MARK, #ch[0][0], 4, 1, -1, 35, 35, #col_text[0], #col_fon[0], 25, 50, 11, 150, 641, 483, w);//окно
readtext (RU | MARK, #ch[0][0], 4, 1, -1, 35, 35, #col_text[0], #col_fon[0], 25, 50, 11, 150, 641, 483, w);//окно
Цитата:
int Image_0[351][82];
loadimage (#Image_0[0][0], "C:\Image_0.bmp");
readtext (RU | MARK, #ch[0][0], 4, 1, -1, 35, 35, #col_text[0], #col_fon[0], 25, 50, 11, 150, 641, 483, #Image_0[0][0]);//изображение
loadimage (#Image_0[0][0], "C:\Image_0.bmp");
readtext (RU | MARK, #ch[0][0], 4, 1, -1, 35, 35, #col_text[0], #col_fon[0], 25, 50, 11, 150, 641, 483, #Image_0[0][0]);//изображение
Функция возвращает количество символов включая установленные пробелы и переносы строк.
-1 если зона сканирования вылазит за пределы изображения
-2 если символов больше чем предоставленно выделенной памяти для приема.
==============================
loadsymbolbase
Параметр
Цитата:
loadsymbolbase ("C:\simvol\База.sib");
Возвращает количество символов базы
Загружать одну и ту же базу необходимо только Один раз!
symbolxpos
Параметы:
Цитата:
symbolxpos(5);
Вернет позицию по X 5 распознанного символа. Распознается построчно с левого верхнего угла.
Цитата:
symbolxpos(2, 7);
Вернет позицию по X 8 символа в 3 строке.
Цитата:
symbolcorrect(0);
Вернет оценку корректности распознания первого символа от 1 и ниже.
Чем выше значение тем мы можем более доверять что символ распознан точно.
С остальными функциями аналогично
=====
loadsymbolbase позволяет загружать несколько баз распознавания текста.
loadsymbolbase("C:\basetext.sib");//0 база
loadsymbolbase("C:\mer.sib");//1 база
loadsymbolbase("C:\кум.sib");//2 база
Они все сливались в одну с которой работала функция распознавания текста readtext
Появились функции
enablesymbolbase - подключает конкретно выбранную базу загруженную ранее loadsymbolbase
disablesymbolbase - отключает конкретно выбранную базу загруженную ранее loadsymbolbase
Использовать данные функции можно динамически вовремя выполнения скрипта в любом месте.
Синтаксис:
enablesymbolbase(0);
disablesymbolbase(2);
Во время загрузки баз loadsymbolbase, они нумеруются по порядку загрузки от 0
Выше написанный код включает первую загруженную базу и отключает 3.
Так же возможно подключить или отключить все базы сразу
enablesymbolbase(ALL);
disablesymbolbase(ALL);
Подключать и отключать базы так же можно указав в enablesymbolbase или disablesymbolbase путь к загруженной базе:
Данный код загрузит три базы, но работать будет только с одной "C:\basetext1.sib"
CODE:
loadsymbolbase ("C:\basetext.sib");
loadsymbolbase ("C:\basetext1.sib");
loadsymbolbase ("C:\basetext2.sib");
/////////////////////
disablesymbolbase (ALL);
enablesymbolbase ("C:\basetext1.sib");
loadsymbolbase ("C:\basetext1.sib");
loadsymbolbase ("C:\basetext2.sib");
/////////////////////
disablesymbolbase (ALL);
enablesymbolbase ("C:\basetext1.sib");
=========================
По умолчанию во время загрузки базы loadsymbolbase , она подключается автоматически и не требует вызова enablesymbolbase
Пример сканирования экрана и вывода текстовой информации в виде строки
CODE:
string text;
loadsymbolbase ("C:\simvol\TEST\База.sib");//Загружаем базу данных
loop()
{
readtext(RU | NUM | MARK, #text, 2, 1, -1, -1, -1, -1, -1, 0, -1, 77, 162, 248, 192, -1);
textout(0, 50, 50, text+" ", 0);
sleep(20);
}
loadsymbolbase ("C:\simvol\TEST\База.sib");//Загружаем базу данных
loop()
{
readtext(RU | NUM | MARK, #text, 2, 1, -1, -1, -1, -1, -1, 0, -1, 77, 162, 248, 192, -1);
textout(0, 50, 50, text+" ", 0);
sleep(20);
}
Пример сканирования части экрана и поиска на нем нужных слов с указанием их позиций.
CODE:
char ch[20][100];
string t;
int n, u, u1, k, n1, x, y;
loadsymbolbase ("C:\simvol\TEST\База.sib");//Загружаем базу данных
sleep(500);
for (n=0; n<20; n++)ch[n][0]=0;
//Сканируем и распознаем текст. Записываем его в двухмерный массив char посточно
readtext(RU, #ch[0][0], 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
n1=0;
//Ищем в этом массиве слова КИБОР
for (n=0; n<20; n++)
{
t="";
k=size(#ch[n][0]);
for (u=0; u<k; u++)
{
if (ch[n][u]=='к')
{
x=symbolxpos(n, u)+11;
y=symbolypos(n, u)+153;
for (u1=u; u1<k; u1++)
{
if (ch[n][u1]!=' ')
{
t=t+ch[n][u1];
if (t=="кибор")
{
textout(n1, x, y, t, 0);
// mousemove(symbolxpos(n, u1)+11-10, symbolypos(n, u1)+150-2);
n1++;
//pause(1000);
t="";
u=u1;
goto d;
}
}
}
}
d:;
}
}
loop()sleep(100);;
string t;
int n, u, u1, k, n1, x, y;
loadsymbolbase ("C:\simvol\TEST\База.sib");//Загружаем базу данных
sleep(500);
for (n=0; n<20; n++)ch[n][0]=0;
//Сканируем и распознаем текст. Записываем его в двухмерный массив char посточно
readtext(RU, #ch[0][0], 4, 1, -1, 35, 35, -1, -1, 0, 50, 11, 150, 641, 483, -1);
n1=0;
//Ищем в этом массиве слова КИБОР
for (n=0; n<20; n++)
{
t="";
k=size(#ch[n][0]);
for (u=0; u<k; u++)
{
if (ch[n][u]=='к')
{
x=symbolxpos(n, u)+11;
y=symbolypos(n, u)+153;
for (u1=u; u1<k; u1++)
{
if (ch[n][u1]!=' ')
{
t=t+ch[n][u1];
if (t=="кибор")
{
textout(n1, x, y, t, 0);
// mousemove(symbolxpos(n, u1)+11-10, symbolypos(n, u1)+150-2);
n1++;
//pause(1000);
t="";
u=u1;
goto d;
}
}
}
}
d:;
}
}
loop()sleep(100);;
Работу этих скриптов можно увидеть на видео.
Нажмите для увеличения
Нажмите для увеличения
Для получения кода настроенной функции readtext можно нажать на кнопку
ПОЛУЧИТЬ КОД READTEXT
Генерируется полный код настроенной функции readtext, loadsymbolbase, переменных и т.д.
Координаты зоны сканирования вставляются экранные и совпадают с реальными только при получение снимка в режиме ЭКРАН. Поэтому при работе в оконном режиме их надо указать самому, так же как и указатель на окно.
=========================================
Этот код найдет зоны текста где написаны имена игроков и распознает имена.
Зоны определяются относительно фрагмента таблички под текстом. Пояснение на скрине.
Скачать
Базу распознавания с первого поста http://kibor-bot.com/files/basetext.sib
Искомое изображение части таблички http://kibor-bot.com/files/readtext_fifa/tab.bmp
Пояснение:
Нажмите для увеличения
Сканируется это изображение и распознается на нем текст. Расположить его так, что бы был на экране весь.
Нажмите для увеличения
CODE:
int tab[50][50];
int x[10], y[10];
int r=50, p=100;
int col, ex, ey;
int smX=38, smY=55;
int razmX=93, razmY=12;
int zona_text_X1, zona_text_Y1;
int zona_text_X2, zona_text_Y2;
string Text;
if (loadimage (#tab[0][0], "C:\tab.bmp")<1){messagebox ("нет C:\tab.bmp"); goto er;}
if (loadsymbolbase ("C:\basetext.sib")<1){messagebox ("нетC:\basetext.sib"); goto er;}
getdisplay(col, ex, ey);
pause(1000);
int k=findimage(10, #tab[0][0], 0, #x[0], #y[0], 0, 0, ex, ey, r, r, r, r, r, r, p, 1, -1);
for (int n=0; n<k; n++)
{
zona_text_X1=x[n]-smX;
zona_text_Y1=y[n]-smY;
zona_text_X2=zona_text_X1+razmX;
zona_text_Y2=zona_text_Y1+razmY;
readtext (EN, #Text, 9, 1, 50, -1, -1, -1, -1, 0, 50, zona_text_X1, zona_text_Y1, zona_text_X2, zona_text_Y2, -1);
messagebox (Text);
pause(1000);
}
er:;
int x[10], y[10];
int r=50, p=100;
int col, ex, ey;
int smX=38, smY=55;
int razmX=93, razmY=12;
int zona_text_X1, zona_text_Y1;
int zona_text_X2, zona_text_Y2;
string Text;
if (loadimage (#tab[0][0], "C:\tab.bmp")<1){messagebox ("нет C:\tab.bmp"); goto er;}
if (loadsymbolbase ("C:\basetext.sib")<1){messagebox ("нетC:\basetext.sib"); goto er;}
getdisplay(col, ex, ey);
pause(1000);
int k=findimage(10, #tab[0][0], 0, #x[0], #y[0], 0, 0, ex, ey, r, r, r, r, r, r, p, 1, -1);
for (int n=0; n<k; n++)
{
zona_text_X1=x[n]-smX;
zona_text_Y1=y[n]-smY;
zona_text_X2=zona_text_X1+razmX;
zona_text_Y2=zona_text_Y1+razmY;
readtext (EN, #Text, 9, 1, 50, -1, -1, -1, -1, 0, 50, zona_text_X1, zona_text_Y1, zona_text_X2, zona_text_Y2, -1);
messagebox (Text);
pause(1000);
}
er:;