| Kostick |
Отправлено: 03 Сентября, 2020 - 19:25:07
|


Мастер

Покинул форум
Сообщений всего: 184
Дата рег-ции: Авг. 2020
Репутация: 1

|
Пытаюсь создать бота в Black Desert online для автоматической рыбалки, который при появлении в определенной области букв W, A, S, D в рандомном порядке и количестве (до 10-ти букв) будет сканировать эту область и нажимать полученные буквы. Во время распознавания текста нажимаются не те кнопки, которые были получены в "настройках распознавания текста" в "тесте распознавания".
Цвет букв всегда меняется. За время тестов получил около ста оттенков:
11637604 6652202 1409461 1728190 11374691 11771914 7640475 15397759 6596737 2573298 15648058 811201 2057781 1272209 4494515 12763585 7368302 11286117 144048 7845317 7109775 11776433 8158444 7566297 7368638 6907824 7500234 6908089 9276813 10143128 9484174 8158332 1776002 8634560 8704402 10623387 16214670 4708263 4078689 15372265 460715 460702 16122861 14465670 4078700 14585609 14124678 12381883 11118765 255902 10892898 4817653 5460119 6210960 15290116 5353430 10455355 13402572 4414608 4736982 4276417 1381555 1381540 9034648 7189938 10526936 5591975 1128866 12753243 452764 9790611 7521216 8385202 4683997 8759874 11374903 14081655 9726429 5008053 197326 197310 1249936 14912652 4078695 4634335 1710196 7131644 5678203 7197951 9229028 12138090 4502157 735665 12756345 16739474 7131385 14474460 12014746 934549.
Цвета фона
3814709 197122
При этом серые оттенки могут пересекаться с оттенком букв, поэтому и появились ложные нажатия клавиши "i", т.к. полоска распознается как буква "i".
После манипуляций с добавлением уточнения цвета в код и неудачей решил вернутся к распознаванию с поставленной галкой "любой цвет" текста.
Программу делал в виртуальном редакторе.
Нажмите для увеличения

Нажмите для увеличения

Нажмите для увеличения

После получения кода в Виртуальном редакторе удаляю в строке
CODE:key_(0, -1, "text_KIB", 85, 0, 200);
кавычки в пункте "text_KIB", чтобы бот нажимал сами буквы, а не название переменной.
Программа работает так:
1) бот сканирует в изображении Нажмите для увеличения
данную область Нажмите для увеличения
. И в 80%-ах случаев происходят нажатия, не соответствующие тесту (узнаю я это потому, что перед запуском бота я делаю изображение в "графике", чтобы самому проверить, что я получил в "тесте распознавания" ).
Например, в тесте было получено
Нажмите для увеличения

а вот какие произведены нажатия(для просмотра ссылки Вам необходимо авторизоваться) Буква "i" пропускается регистрацией, т.к. я проверяю только нажатия клавиш "W, A, S, D".
Пользуюсь программой "hotkeynet", которая передает нажатия виртуальной машине с запущенной игрой и такой же программой "hotkeynet", связанной сервером. Эти манипуляции сделаны потому, что при запуске BDO в самой системе, из-за защиты xigncode3 в игре она блокирует все действия из-вне и не отвечает на нажатия ботов kibor'а.
CODE:string text_KIB;
int color_fon_KIB_6[2];
color_fon_KIB_6[0]=3814709; color_fon_KIB_6[1]=197122;
loadsymbolbase("F:\ПРОГГИ\kibor_set\basetext.sib");
int size_key_char_KIB=-1;
readtext(EN, #text_KIB, 40, 3, -1, -1, -1, 1, #color_fon_KIB_6[0], 0, 99, 491, 583, 1419, 655, -1);
key_(0, -1, text_KIB, 85, 0, 200);
function key_(int k, int m, string text, int pc, int p1, int p2)
{
pause(p1);
if (m==-1)
{
if (size_key_char_KIB==-1)
{
size_key_char_KIB=100;
new char key_char_KIB[size_key_char_KIB+1];
}
int size_key=size(text);
if (size_key_char_KIB<size_key)
{
delete key_char_KIB;
size_key_char_KIB=size_key;
new char key_char_KIB[size_key_char_KIB+1];
}
strcpy(#key_char_KIB[0], text);
for (int n=0; n<size_key; n++){key(key_char_KIB[n]); sleep(pc);}
}
else
{
if (m==1) key(k);
if (m==2) keydown(k);
if (m==3) keyup(k);
}
pause(p2);
}
(Отредактировано автором: 03 Сентября, 2020 - 19:43:47) |
| |
|
| Kibor |
Отправлено: 03 Сентября, 2020 - 19:47:08
|


Эксперт

Покинул форум
Сообщений всего: 8362
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 359

|
Kostick пишет: При этом серые оттенки могут пересекаться с оттенком букв
На скринах не показано.
Для того что бы отсеять ложные буквы, если они все же появятся, использовать надо оценку корректности распознанного символа.
У ложных она будет низкой.
(Добавление)
Или оставьте вертикальные линии.
Но обучите их на какой то символ, который будет игнорироваться.
(Добавление)
Короче обучите на линию знак которого нет среди букв.
К примеру #
После распознавания блок кода в котором
CODE:regexreplace(-1, #text_KIB, text_KIB, "#", "");
Будет так это работать
CODE:string text_KIB="w#q#a#y######";
messagebox (text_KIB);
regexreplace(-1, #text_KIB, text_KIB, "#", "");
messagebox (text_KIB); |
| |
|
| Kibor |
Отправлено: 03 Сентября, 2020 - 22:28:17
|


Эксперт

Покинул форум
Сообщений всего: 8362
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 359

|
Kostick пишет: Нажатые клавиши не соответствуют клавишам в тесте
Не знаю что у вас там не соответствует.
Запустите этот скрипт и кликните в блокнот
CODE:int size_key_char_KIB=-1;
string text_KIB="w#q#a#y######";
regexreplace(-1, #text_KIB, text_KIB, "#", "");
pause(2000);
key_(0, -1, text_KIB, 50, 0, 0);
function key_(int k, int m, string text, int pc, int p1, int p2)
{
pause(p1);
if (m==-1)
{
if (size_key_char_KIB==-1)
{
size_key_char_KIB=100;
new char key_char_KIB[size_key_char_KIB+1];
}
int size_key=size(text);
if (size_key_char_KIB<size_key)
{
delete key_char_KIB;
size_key_char_KIB=size_key;
new char key_char_KIB[size_key_char_KIB+1];
}
strcpy(#key_char_KIB[0], text);
for (int n=0; n<size_key; n++){key(key_char_KIB[n]); sleep(pc);}
}
else
{
if (m==1) key(k);
if (m==2) keydown(k);
if (m==3) keyup(k);
}
pause(p2);
}
|
| |
|
| Kostick |
Отправлено: 04 Сентября, 2020 - 18:56:08
|


Мастер

Покинул форум
Сообщений всего: 184
Дата рег-ции: Авг. 2020
Репутация: 1

|
Kibor пишет: Может поставить больше паузу между вводом символа?
Смотрите, я получаю изображение, выделяю область, захожу в распознавание текста, вижу, что в тесте получен достоверный вариант, в визуальном редакторе импортирую настройки с инструмента распознавания, получаю код, запускаю его в момент, когда появляются буквы, предварительно делая изображение в "графике", вижу сообщение с полученным результатом. После завершения кода снова захожу в графику, выделяю ту же самую область, захожу в распознавание текста, и смотрю, что было получено в тесте. В итоге в сообщении одно, в тесте другое, хотя код и настройки распознавания те же.
[youtube](для просмотра ссылки Вам необходимо авторизоваться) /youtube]
Сделал все черно-белым, чтоб не мучится с цветами.(Отредактировано автором: 04 Сентября, 2020 - 19:04:57) |
| |
|
| Kostick |
Отправлено: 04 Сентября, 2020 - 20:25:10
|


Мастер

Покинул форум
Сообщений всего: 184
Дата рег-ции: Авг. 2020
Репутация: 1

|
Kibor пишет: А это в помощь:
savescreen("C:\11111.bmp", старт_X, старт_Y, финиш_X, финиш_Y, -1);
Вставьте после readtext. Укажите тут зоны как в readtext.
После распознавания посмотрите что он заскринил и как на этом скрине распознает в инструменте настройки.
Благодарю, это помогло, помогло понять, что рамка совсем незначительно и незаметно для глаза появляется в разных местах. Теперь пытаюсь привязаться к поиску изображения рамки, чтобы по координатам ее углов привязаться к поиску изображения в этой рамке, т.е. чтоб координаты подставлялись в readtext.
(Добавление)
Kibor пишет: Для начала уберите все точки шумные.
Потом удалите все символы линии.
И потренируйтесь не в игре, а просто в паинте, в какой зоне он пытается что то распознать.
И почему.
А это в помощь:
savescreen("C:\11111.bmp", старт_X, старт_Y, финиш_X, финиш_Y, -1);
Вставьте после readtext. Укажите тут зоны как в readtext.
После распознавания посмотрите что он заскринил и как на этом скрине распознает в инструменте настройки.
Подскажите, пожалуйста, как найти координаты найденного изображения и сообщить их readtext'у, чтоб он оттуда начинал искать в области 950х140?(Отредактировано автором: 04 Сентября, 2020 - 20:31:06) |
| |
|
|