Автокликер Clickermann :: Форум

Основной раздел => Предложения => Topic started by: резнов on December 08, 2012, 11:50:47 AM

Title: Анализ текста в окне
Post by: резнов on December 08, 2012, 11:50:47 AM
В некоторых браузерках кнопки действий могут перемещаться,а значит lclick с ними не сработает. Так же весьма неудобно и нерационально делать тысячи картинок со значениями здоровья(тем более что при таком количестве сравнений  ошибиться проще простого,да и прога может подвиснуть)
Что конкретно нужно: кликер анализирует веб страницу (или область,заданную по координатам пользователем) и ищет надпись,допустим "бить врага" и помещает координаты в лог. Дальше находит среднее арифметическое между координатами (каждое среднее арифметическое ставится пользователем как переменная) дальше ,к примеру,команда lclick по указанным переменными координатам. Либо ,если брать в пример здоровье,кликер берет из области,заданной пользователем ,значение и сравнивает его с эталонным.в зависимости от условий скрипта он выполняет какие-либо действия. Т.е. для выполнения всего этого нужно 2 новых команды: найти текст и вычислить среднее арифметическое координат текста
Title: Re: Анализ текста в окне
Post by: Vint on December 08, 2012, 01:07:44 PM
Среднее арифметическое ты сейчас и там можешь посчитать, что мешает?
Поиск текста обсуждался в теме поиск текста в браузере. Да, хорошо бы делать это быстро и просто.
Только сдается мне что тебе это не подойдет. Потому что в большинстве таких игр текст на экране это не текст, а картинка с надписью. Нет, внутри программы это чаще именно текст, но тебе это не поможет. Попробуй выделить свою надпись и скопировать. Не выделится.
А кликкер  совсем не "фаинридер".
Title: Re: Анализ текста в окне
Post by: Сергей on December 09, 2012, 03:00:31 AM
А вообще было бы неплохо если бы в кликерман был интегрирован файнридер, или какая-нибудь подобная библиотека.
Задаешь область поиска, цвет фона и получаешь текст этой области.
И так же с поиском.

Хотя да, это достаточно трудно реализовать. Да ещё и неизвестно где такую библиотеку найти :)
Title: Re: Анализ текста в окне
Post by: Johnny on December 09, 2012, 11:31:14 AM
Задаешь область поиска, цвет фона и получаешь текст этой области.
AGClient  ;D
Title: Re: Анализ текста в окне
Post by: Vint on December 11, 2012, 10:44:14 AM
AGClient  ;D
Как вариант... Только производительность нужна хотя бы 10 китайцекартинок в секунду. ;D :'(
Title: Re: Анализ текста в окне
Post by: резнов on December 11, 2012, 06:06:31 PM
Среднее арифметическое ты сейчас и там можешь посчитать, что мешает?
Поиск текста обсуждался в теме поиск текста в браузере. Да, хорошо бы делать это быстро и просто.
Только сдается мне что тебе это не подойдет. Потому что в большинстве таких игр текст на экране это не текст, а картинка с надписью. Нет, внутри программы это чаще именно текст, но тебе это не поможет. Попробуй выделить свою надпись и скопировать. Не выделится.
А кликкер  совсем не "фаинридер".

 я знаю,что прошу:)) среднее арифметическое нужно,чтобы определять координаты кнопки(они довольно часто разные) а кнопка именно в форме ссылки ,а не картинки. была бы картинка - я бы тему не создавал
Title: Re: Анализ текста в окне
Post by: резнов on December 11, 2012, 06:07:12 PM
Задаешь область поиска, цвет фона и получаешь текст этой области.
AGClient  ;D
фон там для всех кнопок одинаков
Title: Re: Анализ текста в окне
Post by: Vint on December 11, 2012, 09:08:40 PM
я знаю,что прошу:)) среднее арифметическое нужно,чтобы определять координаты кнопки(они довольно часто разные) а кнопка именно в форме ссылки ,а не картинки. была бы картинка - я бы тему не создавал
скажи что тебе мешает посчитать среднее арифметическое? Сложение и деление пока работают.
Ты бы показал свои кнопки, что гадать.
Если ссылка, то должна находиться по CTRL+F (+F3).
Если не находится, то алис... для кликера это картинка. Может и можно как то, он все молчат.
Title: Re: Анализ текста в окне
Post by: резнов on December 12, 2012, 06:34:00 PM
я знаю,что прошу:)) среднее арифметическое нужно,чтобы определять координаты кнопки(они довольно часто разные) а кнопка именно в форме ссылки ,а не картинки. была бы картинка - я бы тему не создавал
скажи что тебе мешает посчитать среднее арифметическое? Сложение и деление пока работают.
Ты бы показал свои кнопки, что гадать.
Если ссылка, то должна находиться по CTRL+F (+F3).
Если не находится, то алис... для кликера это картинка. Может и можно как то, он все молчат.

полезно,но не то. нужен анализ текста(цифр,если быть точным)в определенной области окна,сравнение их с эталонным значением и действие по описанным инструкциям. допустим,если здоровье ниже 2000,то  лечить себя и т.д.
Title: Re: Анализ текста в окне
Post by: резнов on December 12, 2012, 07:04:41 PM
т.е. как я вижу свое предложение в виде куска куда:
 
1.$etalon=2000
2.$xp=analyz(координаты левого верхнего угла прямоугольной области),(координаты правого нижнего угла)
3.if($xp<$etalon) lclik(100,100) else lclick (100,20)
4. end_if
Title: Re: Анализ текста в окне
Post by: резнов on December 24, 2012, 11:15:15 AM
ну так что,это реализуемо?
Title: Re: Анализ текста в окне
Post by: Johnny on December 24, 2012, 09:17:18 PM
что это то? finereader прикрутить?
в кликере, по крайней мере последних версий, достаточно функционала чтоб найти что угодно где угодно. надо просто раскинуть мозгами.
для браузера решение вообще на поверхности лежит - Ctrl + F
Title: Re: Анализ текста в окне
Post by: ЦИТРИН on December 25, 2012, 01:27:57 AM
Там смотря как цифры в браузере представлены.
Иногда помогает простой даблклик  по корам в районе  цифры  и  команда туклип.
 Потом анализ переменных.
 Но бывает и так, что к цифре даблкликом  не подобраться.
В таких случаях обычно выходил из положения  командой ифпикчеин.

 
Title: Re: Анализ текста в окне
Post by: резнов on January 06, 2013, 10:41:09 AM
Там смотря как цифры в браузере представлены.
Иногда помогает простой даблклик  по корам в районе  цифры  и  команда туклип.
 Потом анализ переменных.
 Но бывает и так, что к цифре даблкликом  не подобраться.
В таких случаях обычно выходил из положения  командой ифпикчеин.
ифпикчеин тут не подойдет. придется делать более 6 тысяч картинок
Title: Re: Анализ текста в окне
Post by: резнов on January 06, 2013, 10:44:18 AM
что это то? finereader прикрутить?
в кликере, по крайней мере последних версий, достаточно функционала чтоб найти что угодно где угодно. надо просто раскинуть мозгами.
для браузера решение вообще на поверхности лежит - Ctrl + F

контрол ф неплох,но для анализа он не подойдет,потому что делать 6-7 тысяч комбинаций.... на одну проверку всех этих цифросочетаний у скрипта будет уходить немалое время,да и размер будет....
Title: Re: Анализ текста в окне
Post by: ЦИТРИН on January 07, 2013, 12:50:27 PM
ифпикчеин тут не подойдет. придется делать более 6 тысяч картинок
Зачем 6000?
 Если капча,  то  есть антикапча.
 Если обычная цифра, то их разнообразие ограничивается всего 10 картинками.
Анализировал в флашигре (файерфокс) через ифпикчеин цифры  размером шрифта примерно 8 размера.
п.с.
Делал давно. В новых версиях ещё не пробовал.
Title: Re: Анализ текста в окне
Post by: резнов on January 08, 2013, 05:56:27 PM
ифпикчеин тут не подойдет. придется делать более 6 тысяч картинок
Зачем 6000?
 Если капча,  то  есть антикапча.
 Если обычная цифра, то их разнообразие ограничивается всего 10 картинками.
Анализировал в флашигре (файерфокс) через ифпикчеин цифры  размером шрифта примерно 8 размера.
п.с.
Делал давно. В новых версиях ещё не пробовал.
т.е. для распознавания нужно будет загонять все это дело(картинку с цифрами) на сайт для расшифровки?
Title: Re: Анализ текста в окне
Post by: ЦИТРИН on January 08, 2013, 06:22:06 PM
. для распознавания нужно будет загонять все это дело(картинку с цифрами) на сайт для расшифровки?
Да.  Как-то так.
Там одна капча вроде бы 3 копейки на наши деньги стоит.
3 рубля за сотню.
30 р за тысячу.
В Вашем случае  180 рублей за  все 6000 картинок.
Если речь о капче , разумеется.
Вы так и не сформулировали свою задачу.
А мы тут гадаем.
Title: Re: Анализ текста в окне
Post by: резнов on January 24, 2013, 01:54:30 PM
Почему гадаете? я ж вроде объяснял задачу?
короче говоря вот пример страницы:

параметр №1;параметр №2

бесполезные картинки и т.д.
Ненужный параметр№1/ненужный параметр №2
параметры №3 №4 параметры№5 №6
Кнопка активности №1 // может быть,а может и отсутствовать
Кнопка активности №2
Кнопка активности №3
Кнопка активности №4
Кнопка активности №5
Кнопка активности №6 //появляется в зависимости от значений параметров №1 и №2

Кнопка неигровой активности(от 2 до 4 штук)
около 20 строк лога

Кнопка активности №7
Кнопка активности №8
Кнопка активности №9.

Что от этого нужно:
Если Параметр №1 <2000 - кнопка активности №1
Если Параметр №1 >2000 - кнопка активности №2
Если Параметр №3+параметр №4 < параметр №5 + параметр №6,то - кнопка неигровой активности №2
Если в логе есть "надпись" то - кнопка активности №4.

вот в принципе и все. примечание - работа скрипта поссылочно не подойдет - ссылки разные всегда,даже для одной и той же кнопки,т.е. искать придется именно название кнопки
Title: Re: Анализ текста в окне
Post by: СлавьЯнИнъ on January 24, 2013, 02:31:27 PM
Видимо, Резнов, антикапчу вообще не рассматривает?!
Если я правильно понял, то задача состоит в анализе игровых данных, в форме печатного текста или чисел.
Резнов, если хочешь научить скрипт распознавать именно текст, то следует вести попиксельную визуальную проверку.
Title: Re: Анализ текста в окне
Post by: Vint on January 24, 2013, 04:17:55 PM
Напиши свою подпрограмму распознования чисел по картинкам цифр под свой шрифт.
Картинок понадобится не 6000, а всего 11.
Например как товарищ: http://crapware.aidf.org/forum/index.php?topic=134.0
Но только без ошибок и под свою задачу.
Главное чтоб сглаживание сильно не мешало (каждый раз разные изображения цифр).
Ещё нужно учесть диапазон чисел, выводится ли число с соблюдением разрядности. Пример:
Code: [Select]
5432
32

или

Code: [Select]
5432
  32
И как нибудь определять конец числа в первом случае и начало в обоих (решено). Или маркер или изображение границы кнопки...
Title: Re: Анализ текста в окне
Post by: резнов on January 24, 2013, 07:53:53 PM
Видимо, Резнов, антикапчу вообще не рассматривает?!
Если я правильно понял, то задача состоит в анализе игровых данных, в форме печатного текста или чисел.
Резнов, если хочешь научить скрипт распознавать именно текст, то следует вести попиксельную визуальную проверку.

я как бэ не ас в кликере:) как это сделать?
Title: Re: Анализ текста в окне
Post by: СлавьЯнИнъ on January 24, 2013, 09:15:43 PM
Резнов. твоя тема: Анализ текста в окне.
michael. его тема: Помогите с процедурой распознавания чисел.

У вас может быть схожая задача. В его теме приведён пример кода. Спишись с ним и работайте над темой вместе.
И у кликера появится собственный OCR проект.  :)

В любом случае, Резнов, надо радоваться жизни в совместном творчестве.
Брать скрипт и вникать ))
Title: Re: Анализ текста в окне
Post by: Vint on January 24, 2013, 09:36:07 PM
Аж самому стало интересно решить задачу. В принципе в голове 2-3 схемы есть давно. Нет конкретной задачи или надобности. Еще интересней какой из вариантов выигрышней по скорости.
Моя беда, стараюсь почти все сделать универсальным и настраиваемым.  Если скрипт писать под конкретную задачу выйдет в 2 раза меньше.
Title: Re: Анализ текста в окне
Post by: Vint on January 31, 2013, 10:41:31 AM
Вот набросал распознавалку чисел. В основном для использования в играх, т.к. есть ограничения...
Старался сделать универсальным и настраиваемым. Не важно выравнивание идёт по первому или последнему разряду.

Старая версия, ещё под 4.7
[spoiler]Вариант скрипта с последовательным перебором разрядов.
Хотел обойтись без текстовых файлов, только переменные. Использование текстовых файлов уменьшило бы размер скрипта, но я думаю сказалось бы незначительно на скорости работы и удобстве настройки.
Скрипт при внедрении лучше организовать как подпрограмму.

О ограничениях.

Настройка.
Не пугаться! Письменно выглядит много, но всё на самом деле просто.

Сам скрипт.
Code: (clickermann) [Select]
#name "Распознавание чисел"
// Author: Vint
// Version: 1.1 (30.01.2013)
// Результат возвращается в $res если не найдено $res=-1
// Только целые числа. Максимум 10 разрядов. Расположение цифр равномерное.
// Вариант скрипта с последовательным перебором разрядов
// Хотел обойтись без текстовых файлов, только переменные


//====== переменные которые задаются 1 раз если всего один шрифт ====
//если в скрипте будет искаться несколько наборов шрифтов, то задавать каждый раз при вызове
$sdvig=6 // сдвиг, чуть меньше чем ширина 1 цифры с отступом
$pref="textures\digit_" // префикс имён файлов с цифрами


//====== переменные которые задаются при вызове поиска ====
//если место поиска всего одно, задавать только один раз
$field_x1=0 // поле под число, координата X1
$field_y1=0 // поле под число, координата y1
$field_x2=0 // поле под число, координата X2
$field_y2=0 // поле под число, координата y2


//====== внутренние переменные  ====
$razr_max=0 // максимальная разрядность числа
$xmin=5000
$res=-1 // очищаем результат
$i=0                // очищаем результат



//================== начало ====================================================
FOR ($obhod, $obhod<10) // очищаем результат
   GOSUB(sdvig_razryada)
END_CYC

GETSCREEN
FOR ($i, $i<10) // ищем самую левую цифру
   IF_PICTURE_IN ($field_x1,$field_y1,$field_x2,$field_y2, STRCONCAT($pref,$i,".bmp"))
      IF($_return1<$xmin)
         $xmin=$_return1
         INC($razr_max)
         $res1=$i
         IF($res1=10) // учитываем что 10-я картинка это 0
            $res1=0
         END_IF
      END_IF
   END_IF
END_CYC
IF($xmin=5000)
   LOGWRITE ("число не найдено")
   GOTO(endfindnumber)
END_IF

$field_x1=$xmin+$sdvig
$perebor=1
WHILE($perebor>0)
   $razr_temp=$razr_max
   FOR ($i,$i<11)
      IF_PICTURE_IN ($field_x1,$field_y1,$field_x1+INT($sdvig*1.3),$field_y2, STRCONCAT($pref,$i,".bmp"))
         $field_x1=$_return1+$sdvig
         IF($i<11)
            INC($razr_max)
            GOSUB(sdvig_razryada)
            IF($res1=10) // учитываем что 10-я картинка это 0
               $res1=0
            END_IF
         END_IF
         IF($i=11) // проверка если нашли маркер конца ...11.bmp, то конец
            $perebor=0
         END_IF
         $i=11              // выходим из цикла
      END_IF
   END_CYC
   IF(($razr_temp=$razr_max) | ($razr_max=10)) // проверка если не нашли или уже 10 разрядов, то конец
      $perebor=0
   END_IF
END_CYC

// подсчитываем
$res=$res1+$res2*10+$res3*100+$res4*1000+$res5*10000+$res6*100000+$res7*1000000+$res8*10000000+$res9*100000000+$res10*1000000000

endfindnumber:
LOGWRITE ("Найдено число:  ",$res)
HINTPOPUP("Найдено число:  ",$res)
HALT


//==============================================================================
SUB(sdvig_razryada)
   $res10=$res9
   $res9=$res8
   $res8=$res7
   $res7=$res6
   $res6=$res5
   $res5=$res4
   $res4=$res3
   $res3=$res2
   $res2=$res1
   $res1=$i
END_SUB
//==============================================================================

Во вложении Сам скрипт "Распознавание чисел 1.1.cms"+ скрипт для демонстрации и проверки "Распознавание чисел 1.1 пример Clickermann.cms" полностью настроенный с картинками.

Запускаем "Распознавание чисел 1.1 пример Clickermann.cms"
Открываем редактор кликера на полный экран. Распознаётся число в поле редактора "Цвет:".
Можно наводить мышь на любой цвет и горячими клавишами запускать скрипт. Результат в трее и в логе.

P. S.  Жаль на форуме затишье. Становится скучно.[/spoiler]


Обновил под Clickermann 4.11

Версия 1.3
Точнее полностью переписал. Раньше так не хватало массивов и scanpicture.
Заодно избавился от ограничений в 10 разрядов и обязательного отсутствия разделения разрядов
Теперь хоть 100000999, хоть 100 000 999
Файл скрипта во вложении "Распознавание чисел 1.3.cms"
Оформлено в подпрограмму.

Код
[spoiler]
Code: (clickermann) [Select]
#name "Распознавание чисел"
// Author: Vint
// Version: 1.3 (01.04.2015)
// Скрипт для Clickermann v4.11 002

// подключение number_read
// #include "Распознавание чисел 1.3.cms"

//==============================================================================
SUB(LOG_ARR)
   //LOGWRITE ("Размер массива: ",ARRSIZE($num))
   LOGWRITE (" ")
   LOGWRITE ("    0    1    2    3    4    5    6    7    8    9")
   LOGWRITE (" ")
   $maxn = 0
   FOR ($i=0, $i < 10)
      IF($num[$i] > $maxn)
         $maxn = $num[$i]
      END_IF
   END_CYC
   
   FOR($row=0, $row < 2)
      $text = ""
      FOR ($i=0, $i < 10)       
         $l = $num[10*$row + $i]
         FOR ($j=0, $j < (5 - STRLEN($l)))
            $text = STRCONCAT($text, " ")
         END_CYC
         $text = STRCONCAT($text, $l)
      END_CYC
      LOGWRITE ($text)
   END_CYC
   LOGWRITE (" ")
   
   FOR($row=2,$row < $maxn + 2)
      $text = ""
      FOR ($i=0, $i < 10)
         IF($num[$i] > ($row - 2))
            $l = $num[10*$row + $i]
         ELSE
            $l = "X"
         END_IF
         
         FOR ($j=0, $j < (5 - STRLEN($l)))
            $text = STRCONCAT($text, " ")
         END_CYC
         $text = STRCONCAT($text, $l)
      END_CYC
      LOGWRITE ($text)
   END_CYC
   LOGWRITE (" ")
END_SUB

//==============================================================================

SUB(number_read, $f_x1,$f_y1,$f_x2,$f_y2, $pref)
   // $f_x1, $f_y1 область ЛевоВерх
   // $f_x2, $f_y2 область ПравоНиз
   // $pref = "textures\digit_" префикс имён файлов с цифрами (для разных шрифтов)
     
   // Результат возвращается в $res если не найдено $res=-1
   
   // Только целые числа.
   // $pref  зависит от шрифта поиска
   
   $res = -1 // очищаем ответ
   UNDEFINE($num) // главный массив данных
   UNDEFINE($n_temp) // временный массив для SCANPICTURE
   
   GETSCREEN
   FOR ($i=0, $i < 10)
      SCANPICTURE($n_temp, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"))
      $a_size = ARRSIZE($n_temp)
      $num[$i] = $a_size / 2 // заносим количество элементов в этом разряде
      $num[$i+10] = 0 // счётчик разрядов, пока 0
      IF($a_size > 0)
         FOR($j=0, $j < $a_size, 2)
            $num[10*($j/2 + 2)+ $i] = $n_temp[$j] // заносим коорд X в массив
         END_CYC
         UNDEFINE($n_temp)
      END_IF
   END_CYC
   
   IF(ARRSIZE($num) > 0)
      IF($log = 1)
         LOG_ARR()
      END_IF
     
      $repeat = 1
      WHILE($repeat = 1)
         $empty = 0
         $xmin = 5000
         $pos_min = 0
         FOR ($i=0, $i < 10)
            IF($num[$i] > ($num[10 + $i]))
               $empty = 1
               $l = $num[10 * ($num[10+$i]+2) + $i]
               IF($l < $xmin)
                  $xmin = $l
                  $pos_min = $i
               END_IF
            END_IF
         END_CYC
         
         IF($empty = 0)
            $repeat = 0
         ELSE
            IF($res = -1)
               $res = STRCONCAT("", $pos_min)   // если первыё символ
            ELSE
               $res = STRCONCAT($res, $pos_min) // последующие символы
            END_IF
            $num[10 + $pos_min] = ($num[10 + $pos_min]) + 1 // INC счётчик для разряда
         END_IF
      END_CYC
      $res = INT($res)
   ELSE
      LOGWRITE ("число не найдено")
   END_IF
END_SUB

//LOGCLEAR
//$log = 1
//number_read(271,385,335,401, "textures\digit_")
//LOGWRITE ("Найдено число:  ",$res)
//HINTPOPUP("Найдено число:  ",$res)
//HALT
[/spoiler]

Тест в редакторе кликера и пример использования файл: "Тестирование распознавалки 1.3 XP.cms"
Видео теста: http://youtu.be/d55wq7cbVe8.

Add версия 1.4
Поддерживает числа с запятой.
Запятую/точку заготавливаем как digit_10.bmp (или свой префикс)
Возвращает результат как строку! Для перевода в число нужно учесть диапазон.

[spoiler]Для перевода в число нужно пробовать... там все сложно с диапазонами
Если число 0 целых...
0.0001234545
то перевести можно до 13 знака
Code: (clickermann) [Select]
$res = ROUND($res, -13)
если до
21.46999999
то до 8-го знака после запятой
Code: (clickermann) [Select]
$res = ROUND($res, -8)
для бОльших нужно пробовать

для целых всё сохраняется от старой версии, применяем только сами
Code: (clickermann) [Select]
$res =INT($res)[/spoiler]

Код:
[spoiler]
Code: (clickermann) [Select]
#name "Распознавание чисел"
// Author: Vint
// Version: 1.4 (14.04.2015)
// Скрипт для Clickermann v4.11 002

// подключение number_read
// #include "Распознавание чисел 1.4.cms"

//==============================================================================
SUB(LOG_ARR)
   //LOGWRITE ("Размер массива: ",ARRSIZE($num))
   LOGWRITE (" ")
   LOGWRITE ("    0    1    2    3    4    5    6    7    8    9    .")
   LOGWRITE (" ")
   $maxn = 0
   FOR ($i=0, $i < 11)
      IF($num[$i] > $maxn)
         $maxn = $num[$i]
      END_IF
   END_CYC
   
   FOR($row=0, $row < 2)
      $text = ""
      FOR ($i=0, $i < 10)
         $l = $num[11*$row + $i]
         FOR ($j=0, $j < (5 - STRLEN($l)))
            $text = STRCONCAT($text, " ")
         END_CYC
         $text = STRCONCAT($text, $l)
      END_CYC
      LOGWRITE ($text)
   END_CYC
   LOGWRITE (" ")
   
   FOR($row=2,$row < $maxn + 2)
      $text = ""
      FOR ($i=0, $i < 11)
         IF($num[$i] > ($row - 2))
            $l = $num[11*$row + $i]
         ELSE
            $l = "X"
         END_IF
         
         FOR ($j=0, $j < (5 - STRLEN($l)))
            $text = STRCONCAT($text, " ")
         END_CYC
         $text = STRCONCAT($text, $l)
      END_CYC
      LOGWRITE ($text)
   END_CYC
   LOGWRITE (" ")
END_SUB

//==============================================================================

SUB(number_read, $f_x1,$f_y1,$f_x2,$f_y2, $pref)
   // $f_x1, $f_y1 область ЛевоВерх
   // $f_x2, $f_y2 область ПравоНиз
   // $pref = "textures\digit_" префикс имён файлов с цифрами (для разных шрифтов)
   
   // Результат возвращается в $res если не найдено $res=-1
   
   // Только целые числа.
   // $pref  зависит от шрифта поиска
   
   $res = -1 // очищаем ответ
   UNDEFINE($num) // главный массив данных
   UNDEFINE($n_temp) // временный массив для SCANPICTURE
   
   GETSCREEN
   FOR ($i=0, $i < 11)
      SCANPICTURE($n_temp, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"))
      $a_size = ARRSIZE($n_temp)
      $num[$i] = $a_size / 2 // заносим количество элементов в этом разряде
      $num[$i+11] = 0 // счётчик разрядов, пока 0
      IF($a_size > 0)
         FOR($j=0, $j < $a_size, 2)
            $num[11*($j/2 + 2)+ $i] = $n_temp[$j] // заносим коорд X в массив
         END_CYC
         UNDEFINE($n_temp)
      END_IF
   END_CYC
   
   IF(ARRSIZE($num) > 0)
      IF($log = 1)
         LOG_ARR()
      END_IF
     
      $repeat = 1
      WHILE($repeat = 1)
         $empty = 0
         $xmin = 5000
         $pos_min = 0
         FOR ($i=0, $i < 11)
            IF($num[$i] > ($num[11 + $i]))
               $empty = 1
               $l = $num[11 * ($num[11+$i]+2) + $i]
               IF($l < $xmin)
                  $xmin = $l
                  $pos_min = $i
               END_IF
            END_IF
         END_CYC
         
         IF($empty = 0)
            $repeat = 0
         ELSE
            IF($res = -1)
               $res = STRCONCAT("", $pos_min)   // если первыё символ
            ELSE
               IF($pos_min < 10)
                  $res = STRCONCAT($res, $pos_min) // последующие символы цифры
               ELSE
                  $res = STRCONCAT($res, ".") // последующие символы  зпт
               END_IF   
            END_IF
            $num[11 + $pos_min] = ($num[11 + $pos_min]) + 1 // INC счётчик для разряда
         END_IF
      END_CYC
      //$res = ROUND($res, -8)
   ELSE
      LOGWRITE ("число не найдено")
   END_IF
END_SUB

//LOGCLEAR
//$log = 1
//number_read(271,385,335,401, "textures\digit_")
//LOGWRITE ("Найдено число:  ",$res)
//HINTPOPUP("Найдено число:  ",$res)
//HALT
[/spoiler]

Add версия 1.5
Версия 1.4 с поддержкой поиска с COLORMODE. Для каждой цифры можно задать индивидуальный %
Title: Re: Анализ текста в окне
Post by: резнов on January 31, 2013, 07:13:06 PM
Винт,круто,очень круто. В кликере я почти что полный нупь,так что можно нубский вопрос: текст можно этим кодом найти?
Title: Re: Анализ текста в окне
Post by: Vint on January 31, 2013, 08:22:25 PM
Винт,круто,очень круто. В кликере я почти что полный нупь,так что можно нубский вопрос: текст можно этим кодом найти?
Текст... Нет. Ты прямо меня в ступор ввел этим вопросом.
Я не вижу задачи для которой понадобится распознавать текст. Ты же не собираешься кликером проверять правописание или делать переводчик. Для всех задач где целесообразно использовать кликер, достаточно поиска картинки.
Хотя задачу придумать можно конечно.
Title: Re: Анализ текста в окне
Post by: i0 on August 02, 2014, 05:15:57 PM
угу, я вот придумал… на свою голову

"сигнализация" на случай грабежа твоего города в браузерке (flash).
хочется, чтобы она орала ник грабителя, а он только в картинке есть

ну это так, лирическое отступление :)
Title: Re: Анализ текста в окне
Post by: aden on August 02, 2014, 06:09:57 PM
угу, я вот придумал… на свою голову

"сигнализация" на случай грабежа твоего города в браузерке (flash).
хочется, чтобы она орала ник грабителя, а он только в картинке есть

ну это так, лирическое отступление :)
ну по аналогии раздуйте данный скрипт до распознавания текста только длина текста будет сильно ограничена и количество букв тут не 10 будет =)
Title: Re: Анализ текста в окне
Post by: Vint on April 01, 2015, 11:47:39 AM
Обновил распознавалку под Clickermann 4.11
http://crapware.aidf.org/forum/index.php?topic=88.msg1571#msg1571
Title: Re: Анализ текста в окне
Post by: Starfish on April 15, 2015, 02:51:15 PM
Спасибо за пример скрипта, мне помогло но частично. Я делаю шаблон цифр, сохраняю и в этом-'t окне он находит нужные мне числа. Но допустим когда обновляется строка порядок чисел меняется или количество чисел то пиксели в цифрах тоже меняются. Как я понял тут идет сравнение по пиксельно 1в1 100% и если сходство будет 99% то число не найдется?
Вот пример единиц, они разные (в середине отличается), соответственно он найдет только одну единицу если я сделаю шаблон по центральной.
(http://ipic.su/img/img7/fs/111.1429098625.jpg)
Собственно это можно обойти? Или какую программу посоветуете?
Title: Re: Анализ текста в окне
Post by: Vint on April 15, 2015, 04:43:04 PM
COLORMODE+%
обговаривалось много раз уже.
В зависимости от фона, обычно режим 7 или 8 плюс рассчитанный процент.

Если есть возможность отключить сглаживание - это нужно сделать.
Все системные шрифты и большинство во Flash используют сглаживание выставленное в системе.
Если это отдельный клиент, то может быть в его настройках... а может и не быть.
Title: Re: Анализ текста в окне
Post by: Starfish on April 16, 2015, 03:45:32 PM
Спасибо большое за ответ!

1) Начал искать параметры COLORMODE+%
Нашел 2 поста с этим и то там используется  COLORMODE($colorm, $stcoord_X,$stcoord_Y,$encoord_X,$encoord_Y) параметр + координаты, а где %?


2) COLORMODE надо было вставлять после getscreen так?

Code: [Select]
GETSCREEN
   COLORMODE(8)
   FOR ($i=0, $i < 10)
      SCANPICTURE($n_temp, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"))
      $a_size = ARRSIZE($n_temp)
      $num[$i] = $a_size / 2 // заносим количество элементов в этом разряде
      $num[$i+10] = 0 // счётчик разрядов, пока 0
      IF($a_size > 0)
         FOR($j=0, $j < $a_size, 2)
            $num[10*($j/2 + 2)+ $i] = $n_temp[$j] // заносим коорд X в массив
         END_CYC
         UNDEFINE($n_temp)
      END_IF
   END_CYC
3) Как отключить сглаживание шрифта в Flash player? Отключил в системе Win 7, в драйвере nvidia, в игре. Не помогло.
Title: Re: Анализ текста в окне
Post by: Vint on April 16, 2015, 04:18:07 PM
Спасибо большое за ответ!

1) Начал искать параметры COLORMODE+%
Нашел 2 поста с этим и то там используется  COLORMODE($colorm, $stcoord_X,$stcoord_Y,$encoord_X,$encoord_Y) параметр + координаты, а где %?
2) COLORMODE надо было вставлять после getscreen так?
3) Как отключить сглаживание шрифта в Flash player? Отключил в системе Win 7, в драйвере nvidia, в игре. Не помогло.

1) % в SCANPICTURE

2) лучше так  (+ в SCANPICTURE стоит совпадение 80%)
Code: (clickermann) [Select]
   GETSCREEN
   COLORMODE(8, $f_x1,$f_y1,$f_x2,$f_y2)
   FOR ($i=0, $i < 10)
      SCANPICTURE($n_temp, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"),-1,80)
      $a_size = ARRSIZE($n_temp)
      $num[$i] = $a_size / 2 // заносим количество элементов в этом разряде
      $num[$i+10] = 0 // счётчик разрядов, пока 0
      IF($a_size > 0)
         FOR($j=0, $j < $a_size, 2)
            $num[10*($j/2 + 2)+ $i] = $n_temp[$j] // заносим коорд X в массив
         END_CYC
         UNDEFINE($n_temp)
      END_IF
   END_CYC

3) А как отключал?
Персонализация -> Экран -> Настройка текста ClearType -> галка Включить ClearType
или
Свойства системы -> параметры быстродействия -> сглаживать неровности экранных шрифтов
Шрифт Segoe UI менял?

И перезагрузиться.

Но может и не помочь. Смотря как программист приложения сделал вывод текста.
Title: Re: Анализ текста в окне
Post by: Starfish on April 18, 2015, 09:12:19 AM
3) А как отключал?
Свойства системы -> параметры быстродействия -> сглаживать неровности экранных шрифтов
Шрифт Segoe UI не менял

Перезагрузиться.
Title: Re: Анализ текста в окне
Post by: 123 on April 30, 2015, 06:32:32 PM
Точно нужна встроенная распознавалка текста, хотя бы нормального, а не капча-извратного. Это избавило бы в некоторых случаях от горы дурной работы по созданию и тесту 100500 картинок на все возможные варианты - разные слова разными цветами, размерами и видами шрифтов. И не надо с нуля велосипед изобретать - наверняка тут никто не обломается, если его аккуратно готовый откуда-нибудь содрать. Или, на худой конец, создать онлайн-сервис спецом под работу в связке с кликерманом, или, хотя бы, указать на 1 или несколько самых удобных из существующих. Разумеется, бесплатных и безлимитных, чтобы без проблем справлялись с небольшими, но часто подкидываемыми скриншотами с малыми объёмами текста.
Title: Re: Анализ текста в окне
Post by: Vint on April 30, 2015, 07:30:22 PM
А они точно есть такие? Может вариант только тот же файнридер.
Я год назад задавался целью найти сетевую или консольную распознавалку. Бесплатной сетевой не нашел.
Нашел 2 или 3 консольные. Но там мало того что ставить прописывать не просто было. И они только на английский язык заточены. К одной есть модуль русского языка.. По дефолту эта хрень даже цифры путает набранные не рубленным шрифтом. Про буквы я вообще молчу. Правда это по дефолту. Ее можно там обучать настраивая на другие шрифты. Но процедура не тривиальна и я забил.
В общем хреновина сыровата, не зря всякие файнридеры уже больше десятка лет развиваются. В первых версиях видать тоже так распознавало.
Title: Re: Анализ текста в окне
Post by: Vint on May 27, 2015, 09:31:08 AM
Проблема с поиском ясное дело. Выложи образцы и шоты на которых распознаётся. Желательно несколько и конечно не пожатое.
Title: Re: Анализ текста в окне
Post by: Vint on May 28, 2015, 05:16:48 PM
Неа. Вчера сразу попробовал, но так на авось. В ФШ не сравнивал для анализа.
Сегодня времени не было глянуть.
Title: Re: Анализ текста в окне
Post by: Vint on May 28, 2015, 05:31:22 PM
Какой баг?

Проблема в большом размере шрифта. Область сглаживания очень большая 1-4 пкс. И при рендеринге оригинал елозит во всех направлениях на уровне субпикселов.
В итоге одна четвёрка отличается от другой гораздо больше чем они обе от единицы  :o Ну и т.п.

Сейчас ещё попробую вместо 8 колормода седьмой, но боюсь это не даст результата.
Стоит подумать о другом методе. Например поделить на зоны цифр и считать в области сумму чистого цвета 10310011
Может там граница более чёткая.
Title: Re: Анализ текста в окне
Post by: Vint on May 28, 2015, 10:08:04 PM
Она ещё и меняется?  :o
А если собьешь назад точно вернуть можно?
Тогда до 10. Сэм-восэм  :)
Или 8-10.
Подожди пока я эти попробую.
Title: Re: Анализ текста в окне
Post by: Vint on May 29, 2015, 08:41:56 AM
И при этом меняется размер шрифта?
Title: Re: Анализ текста в окне
Post by: Vint on May 29, 2015, 01:18:03 PM
Вот скрипт с картинками.
Распознавание переделано под COLORMODE использовал 7.
Подбор процента только на тех 3 примерах что есть. На них всё чётко определяет.
На примерах нет цифр 2 и 9, для них не выставлен процент!!!

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

Code: (clickermann) [Select]
#name "Распознавание чисел"
// Author: Vint
// Version: 1.5 (28.05.2015)
// Скрипт для Clickermann v4.11 002

// подключение number_read
// #include "Распознавание чисел 1.5.cms"


//==============================================================================
SUB(sort_arr)  // сортируем $data по возрастанию X
   $data_size = ARRSIZE($data)
   FOR($out=0, $out < $data_size, 2)
      $min = $data[$out]
      $ind = $out
     
      FOR($in=($out+2), $in < $data_size, 2)
         IF($data[$in] < $min)
            $min = $data[$in]
            $ind = $in
         END_IF
      END_CYC
      //LOGWRITE("минимум: ", $min, "  ", $ind, " - ", $out)
      $X =  $data[$ind]
      $Y =  $data[$ind+1]
     
      $data[$ind] = $data[$out]
      $data[$ind+1] = $data[$out+1]
      $data[$out] = $X
      $data[$out+1] = $Y
     
      //LOGWRITE($X, " / ", $Y)
      WAITMS(20)
   END_CYC
END_SUB

//==============================================================================
SUB(number_read, $f_x1,$f_y1,$f_x2,$f_y2, $pref, $c_mode)
   // $f_x1, $f_y1 область ЛевоВерх
   // $f_x2, $f_y2 область ПравоНиз
   // $pref = "textures\digit_" префикс имён файлов с цифрами (для разных шрифтов)
   // $c_mode - режим COLORMODE
   
   // Результат возвращается в $res если не найдено $res=-1
   
   
   $res = -1 // очищаем ответ
   UNDEFINE($data) // главный массив данных
   UNDEFINE($a_scan) // временный массив для SCANPICTURE
   $SHIFT_X = 15 // смещение (кол-во игнор пикселов вокруг найденного)
   $SHIFT_Y = 15
   
   GETSCREEN
   IF($c_mode > 0)
      COLORMODE($c_mode, $f_x1,$f_y1,$f_x2,$f_y2)
   END_IF
   FOR ($i=0, $i < 11)
      SWITCH($i)
      CASE(0)
         $pr = 95
      CASE(1)
         $pr = 99
         //      CASE(2)
         //         $pr = 95
      CASE(3)
         $pr = 93
      CASE(4)
         $pr = 95
      CASE(5)
         $pr = 95
      CASE(6)
         $pr = 95
      CASE(7)
         $pr = 95
      CASE(8)
         $pr = 94
         //      CASE(9)
         //         $pr = 95
      DEFAULT
         $pr = 100
      END_SWITCH
     
      SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"), 16744447, $pr)
     
      // заносим 'X,цифра' в $num с учётом мёртвых зон
      $a_scansize = ARRSIZE($a_scan)
      IF($log0 = 1)
         LOGWRITE ("Ищем картинку ", $i, "  найдено ", $a_scansize/2)
      END_IF
     
      FOR($j=0, $j < $a_scansize, 2)
         $X = $a_scan[$j]
         $Y = $a_scan[$j+1]
         
         // проверяем мёртвые зоны
         $dead_zone = 0
         $dead_size = ARRSIZE($dead)
         FOR($m=0, $m < $dead_size, 2)
            $X_old = $dead[$m]
            $Y_old = $dead[$m+1]
            IF($log0 = 1)
               LOGWRITE ("$X/$X_old = ", $X, " / ", $X_old)
               LOGWRITE ("$X/$Y = ", $X, " / ", $Y, "   ABS ", ABS($X - $X_old))
            END_IF
            IF((($Y - $Y_old) < $SHIFT_Y+1) & (ABS($X - $X_old) < $SHIFT_X+1))
               $dead_zone = 1
               $m = $dead_size + 10
            END_IF
         END_CYC
         
         IF($log0 = 1)
            LOGWRITE ("$dead_zone = ", $dead_zone)
            LOGWRITE ("$dead_size = ", $dead_size)
         END_IF
         IF($dead_zone = 0)
            ARRPUSH($dead, $X)
            ARRPUSH($dead, $Y)
            ARRPUSH($data, $X)
            ARRPUSH($data, $i)
            IF($log0 = 1)
               LOGWRITE ("добавляем ", $i, " $X/$Y = ", $X, " / ", $Y)
            END_IF
         END_IF
      END_CYC
      IF($log0 = 1)
         LOGWRITE ("после добавления ", $i, " всего ", ARRSIZE($data)/2)
         LOGWRITE (" ")
      END_IF
      UNDEFINE($dead)
      UNDEFINE($a_scan)
   END_CYC
   
   $data_size = ARRSIZE($data)
   IF($data_size > 0)
      sort_arr()
      IF($log0 = 1)
         LOGWRITE ("цифр после сортировки ", ARRSIZE($data)/2)
      END_IF
     
      FOR($i=1, $i < $data_size, 2)
         IF($res = -1)
            $res = STRCONCAT("", $data[$i])   // если первыё символ
         ELSE
            IF($data[$i] < 10)
               $res = STRCONCAT($res, $data[$i]) // последующие символы цифры
            ELSE
               $res = STRCONCAT($res, ".") // последующие символы  зпт
            END_IF
         END_IF
      END_CYC
      //$res = ROUND($res, -8)
   ELSE
      LOGWRITE ("число не найдено")
   END_IF
END_SUB

//==============================================================================


LOGCLEAR
$log = 1
//$log0 = 1
number_read(514,475,765,602, "textures\digit_", 7)
LOGWRITE ("Найдено число:  ",$res)
HINTPOPUP("Найдено число:  ",$res)
HALT
Title: Re: Анализ текста в окне
Post by: And_Ro on May 29, 2015, 07:03:15 PM
Извините, если не в тему  :( . Программка Portable ABBYY Screenshot Reader, весит всего 25м. Можно заставить кликер "таскать" руку для выделения зоны распознавания, результат (в зависимости от настроек) попадает в буфер обмена. Очень неплохо распознает текст, даже не горизонтальный (см. примеры в прицепе)! А вот если бы научиться передавать ей параметры зоны распознавания вместо графического выделения!!! Может кто "подломит"?  ;)
Title: Re: Анализ текста в окне
Post by: Vint on May 30, 2015, 10:12:22 AM
почти получилось :)
Я же говорю, у меня нет в примерах цифр 9 и 2. Не внес их в CASE
Title: Re: Анализ текста в окне
Post by: Pukerman on June 06, 2015, 10:41:33 PM
Здравствуйте, прочитал тему,но так и не понял как осуществить эффективный анализ текста в окне браузера.
Например хочу написать скрипт который бы приглашал в группу в Одноклассниках всех людей которые находятся в Онлайн.
Подскажите какой функцией осуществлять поиске текста в ограниченной области экрана ,потом нажимать на него , потом искать текст другой текст и так же на него нажимать.

Пробовал конечно делать скриншоты этого текста и потом пользоваться функцией "IF_PICTURE_IN", но слишком долговато выходит даже при суженной области поиска)
Title: Re: Анализ текста в окне
Post by: i0 on April 07, 2016, 06:51:29 PM
1.5, проблемка. судя по логу, все цифры находит, но не все почему-то добавляет:
Code: (лог) [Select]
18:44:28 Ищем картинку 0  найдено 3
18:44:28 $dead_zone = 0
18:44:28 $dead_size = 0
18:44:28 добавляем 0 $X/$Y = 235 / 62
18:44:28 $X/$X_old = 242 / 235
18:44:28 $X/$Y = 242 / 62   ABS 7
18:44:28 $dead_zone = 1
18:44:28 $dead_size = 2
18:44:28 $X/$X_old = 256 / 235
18:44:28 $X/$Y = 256 / 62   ABS 21
18:44:28 $dead_zone = 0
18:44:28 $dead_size = 2
18:44:28 добавляем 0 $X/$Y = 256 / 62
18:44:28 после добавления 0 всего 2
18:44:28 
18:44:28 Ищем картинку 1  найдено 0
18:44:28 после добавления 1 всего 2
18:44:28 
18:44:28 Ищем картинку 2  найдено 2
18:44:28 $dead_zone = 0
18:44:28 $dead_size = 0
18:44:28 добавляем 2 $X/$Y = 213 / 62
18:44:28 $X/$X_old = 220 / 213
18:44:28 $X/$Y = 220 / 62   ABS 7
18:44:28 $dead_zone = 1
18:44:28 $dead_size = 2
18:44:28 после добавления 2 всего 3
18:44:28 
18:44:28 Ищем картинку 3  найдено 0
18:44:28 после добавления 3 всего 3
18:44:28 
18:44:28 Ищем картинку 4  найдено 0
18:44:28 после добавления 4 всего 3
18:44:28 
18:44:28 Ищем картинку 5  найдено 0
18:44:28 после добавления 5 всего 3
18:44:28 
18:44:28 Ищем картинку 6  найдено 0
18:44:28 после добавления 6 всего 3
18:44:28 
18:44:28 Ищем картинку 7  найдено 0
18:44:28 после добавления 7 всего 3
18:44:28 
18:44:28 Ищем картинку 8  найдено 0
18:44:28 после добавления 8 всего 3
18:44:28 
18:44:28 Ищем картинку 9  найдено 2
18:44:28 $dead_zone = 0
18:44:28 $dead_size = 0
18:44:28 добавляем 9 $X/$Y = 228 / 62
18:44:28 $X/$X_old = 249 / 228
18:44:28 $X/$Y = 249 / 62   ABS 21
18:44:28 $dead_zone = 0
18:44:28 $dead_size = 2
18:44:28 добавляем 9 $X/$Y = 249 / 62
18:44:28 после добавления 9 всего 5
18:44:28 
18:44:28 Ищем картинку 10  найдено 0
18:44:28 после добавления 10 всего 5
18:44:28 
18:44:28 цифр после сортировки 5
18:44:28 Найдено число:  29090

может, я как-то не так цифры-образцы обрезаю или область задаю?
Title: Re: Анализ текста в окне
Post by: Vint on April 08, 2016, 08:34:04 AM
Шрифтик простой. мёртвую зону уменьши $SHIFT_X =
Там достаточно 1-2 на этом размере шрифта, ну 4 на крайняк, а ты наверно 7 засадил.
Title: Re: Анализ текста в окне
Post by: i0 on April 08, 2016, 08:37:22 AM
уупс. не сообразил что надо менять параметр для каждого шрифта, ща уменьшу)
Title: Re: Анализ текста в окне
Post by: Vint on April 08, 2016, 08:52:36 AM
Мёртвая зона введена, чтобы в пределах
$SHIFT_X по горизонтали и
$SHIFT_Y по вертикали
не учитывало одну и ту же цифру.
Это нужно при использовании % совпадения, т.к. например он при 90% может найти несколько вариантов одной цифры начиная с разных позиций старта. И все они впишутся в процент.
Для маленьких шрифтов достаточно 1-2 пиксела, для больших можно учесть насколько размыто их сглаживание...
Если лень считать, можно всегда тупо брать половину размера шрифта, подойдёт всегда.
Вот для наглядности цифра 4 при данном % совпадения нашлась и подошла 3 раза. Но это одна и та же позиция и мы отбрасываем лишние.
Title: Re: Анализ текста в окне
Post by: i0 on April 08, 2016, 10:02:10 AM
всё отлично заработало
вынес для себя $shift_x, $shift_y и $c_ignore в параметры подпрограммы
Title: Re: Анализ текста в окне
Post by: ЦИТРИН on April 08, 2016, 01:11:27 PM
всё отлично заработало
вынес для себя $shift_x, $shift_y и $c_ignore в параметры подпрограммы
Зайди на  эту тему --> http://crapware.aidf.org/forum/index.php?topic=2483.0

Может  так проще будет реализовать распознавание.
Title: Re: Анализ текста в окне
Post by: Валера Л on May 12, 2016, 07:17:02 PM
Привет всем!
Помогите чайнику, научить кликера,распознавать цифры,в установленном диапазоне, внутри рамки.
А после совпадения, должен сработать Хальт. 

Title: Re: Анализ текста в окне
Post by: Валера Л on May 12, 2016, 11:17:03 PM
а какой в этом смысл, ну распознает кликер цифру и остановится? Собирай образцы цифр и вставляй их в имеющийся на форуме скрипт распознавания чисел. уже научили распознавать и давно, заодно и поиск по форуму освоишь.

Согласен! Из той инфы, которую я предоставил, смысла не видно.
Смысл в том, что мне надо найти комбинацию цифр, с высоким процентом, которую надо сохранить.
Конечно, идеальный, был бы вариант, для меня, это автоматическое сохранение результатов в какую нибудь папку.
Но так как,я, в программировании  ........
То, для начала, я решил, обойтись функцией "Halt' и ручным сохранением результатов.
Интересно,мне, знать: где собирать образцы цифр?
Title: Re: Анализ текста в окне
Post by: Валера Л on May 13, 2016, 12:12:04 AM
поросят ловят в хлеву, волков в лесу, а образцы цифр ловят в скрины с мониторов и вырезают в паинте до нужного размера, как сало на ломтики. ;D
Code: (clickermann) [Select]
#name "Скрин экрана"
GETSCREEN
screenshot("цифры на разделку_")
HINTPOPUP("цифру...", "я поймал")
BEEP(800,200)
HALT


О! Сало на ломтики резать, я умею.
А цифры.....
Ну, ладно.
Утро вечера, нет ночи, мудренее.
Спасибо за участие и советы.
А сделать скрин в нужном формате поможет этот простой скрипт!  8)
Title: Re: Анализ текста в окне
Post by: Oraven on May 13, 2016, 09:41:57 AM
Лучше сразу применяй цветокоррекцию, и для снимка можно сразу указать область, порежет автоматически.

Code: (clickermann) [Select]
// Получение скриншота с цветокоррекцией (фильтр 6)
GETSCREEN
COLORMODE(6)
SCREENSHOTEX(500,500, 550,550, "Image_", 0) // вырежет в координате 500,500, 550,550
HALT
Title: Re: Анализ текста в окне
Post by: Кликермен on May 13, 2016, 01:36:34 PM
я пuсал скрuпm нарезкu) mам задаешь гранuцы, u обучаешь его, он авmомаmом запucываеm.
http://crapware.aidf.org/forum/index.php?topic=2434.msg15265#msg15265 (http://crapware.aidf.org/forum/index.php?topic=2434.msg15265#msg15265)
Title: Re: Анализ текста в окне
Post by: Валера Л on May 14, 2016, 01:46:01 PM
Наконец-то появилось время пообщаться с кликерманами.
Спасибо всем за ответ и советы.
Title: Re: Анализ текста в окне
Post by: Валера Л on May 14, 2016, 01:59:33 PM
я пuсал скрuпm нарезкu) mам задаешь гранuцы, u обучаешь его, он авmомаmом запucываеm.
http://crapware.aidf.org/forum/index.php?topic=2434.msg15265#msg15265 (http://crapware.aidf.org/forum/index.php?topic=2434.msg15265#msg15265)

Скрипт, возможно, хороший.
Но он не подходит для моих целей.
Так как постоянно перезапускает браузер, а мне нужна статическая страница.
Но,прозапас, запомню, а вдруг пригодится.


Title: Re: Анализ текста в окне
Post by: Кликермен on May 14, 2016, 02:37:35 PM
mы шуmuшь?  уберu ф5, u все будеm  нормально! нашел же проблему..
 я показал как можно нарезаmь бысmро u не вручную, дальше дело за малым  собраmь все в одно чuсло
Title: Re: Анализ текста в окне
Post by: Валера Л on May 14, 2016, 02:43:54 PM
mы шуmuшь?  уберu ф5, u все будеm  нормально! нашел же проблему..
 я показал как можно нарезаmь бысmро u не вручную, дальше дело за малым  собраmь все в одно чuсло

Не! Не шучу!
Я кроме русского,белорусского и церковно-славянского, других языков не знаю.
Я так понимаю ф5-это " TFWRITE($cmd, "chcp 1251>nul") "
Title: Re: Анализ текста в окне
Post by: Кликермен on May 14, 2016, 03:08:52 PM
mы шуmuшь?  уберu ф5, u все будеm  нормально! нашел же проблему..
 я показал как можно нарезаmь бысmро u не вручную, дальше дело за малым  собраmь все в одно чuсло

Не! Не шучу!
Я кроме русского,белорусского и церковно-славянского, других языков не знаю.
Я так понимаю ф5-это " TFWRITE($cmd, "chcp 1251>nul") "
KEYPRESS(#F5)
Title: Re: Анализ текста в окне
Post by: Валера Л on May 17, 2016, 10:27:45 PM
Не! Не шучу!
Я кроме русского,белорусского и церковно-славянского, других языков не знаю.
Я так понимаю ф5-это " TFWRITE($cmd, "chcp 1251>nul") "
[/quote]
KEYPRESS(#F5)
[/quote]

Запускал скрипт. Как-то странно он работает.
Записывает одни 1, а при следующем запуске, пишет одни 6.
Title: Re: Анализ текста в окне
Post by: Валера Л on May 17, 2016, 10:49:19 PM
Господа, кликерманы!
Помогите, мне, правильно написать команды.
С горем-пополам составил скрипт. Но он работает не так как-бы хотелось-бы:

LCLICK(794,732)
WAITMS(200)
LCLICK(778,610)  // 4375039
WAITMS(200)
LCLICK(719,287)  // 196821
end

COLORG(52224)
LCLICK(889,105)
WAIT(0,05)
end   

Объясню, какую цель я преследую:
Первые, две, команды работают по координатам.
После того как они сработают, всплывает окно, либо в красном контуре, либо в зеленом.
Вот их,я бы хотел, что-бы скрипт распознавал по цветам и закрывал.
Я пытался изобразить, но получилась чихня.
Курсор прыгает по всем координатам.
Я так понимаю надо прописывать условия, а как?
Спасибо.

Title: Re: Анализ текста в окне
Post by: Oraven on May 18, 2016, 08:52:57 AM
end - такой команды в кликере нет, нечего писать всякий мусор.
COLORG(52224) - эта функция извлекает зеленый канал из цвета в десятеричном формате. Тебе такое не нужно.
WAIT(0,05) - здесь ошибка в запятой, нужно писать точку. Или просто WAITMS(50)

В данном случаи используется комбинированное условие из двух функций проверки цвета по координате. Укажи правильно координату рамки и цвета.
Code: (clickermann) [Select]
LCLICK(794,732)
WAITMS(200)
LCLICK(778,610)  // 4375039
WAITMS(200)
LCLICK(719,287)  // 196821
WAITMS(600)

GETSCREEN // снимок экрана в буфер кликера для последующего анализа
IF((PXL(100,100) = 255)|(PXL(100,100) = 52224)) // координата и цвет зеленого и красного
   LCLICK(889,105)
   WAITMS(500)
END_IF
Title: Re: Анализ текста в окне
Post by: Валера Л on May 18, 2016, 03:55:21 PM
end - такой команды в кликере нет, нечего писать всякий мусор.
COLORG(52224) - эта функция извлекает зеленый канал из цвета в десятеричном формате. Тебе такое не нужно.
WAIT(0,05) - здесь ошибка в запятой, нужно писать точку. Или просто WAITMS(50)

В данном случаи используется комбинированное условие из двух функций проверки цвета по координате. Укажи правильно координату рамки и цвета.
Code: (clickermann) [Select]
LCLICK(794,732)
WAITMS(200)
LCLICK(778,610)  // 4375039
WAITMS(200)
LCLICK(719,287)  // 196821
WAITMS(600)

GETSCREEN // снимок экрана в буфер кликера для последующего анализа
IF((PXL(100,100) = 255)|(PXL(100,100) = 52224)) // координата и цвет зеленого и красного
   LCLICK(889,105)
   WAITMS(500)
END_IF


Вот, спасибо!!!!!
Все работает.
Правда я сделал некоторые изменения.
Почему?
Потому что, всплывающие окна находятся на разных уровнях.
Получилось вот так:
LCLICK(792,737)  // 7959563
WAITMS(20)
LCLICK(791,610)  // 255
WAITMS(800)

 
GETSCREEN // снимок экрана в буфер кликера для последующего анализа
IF((PXL(343,302) = 3748071) // координата и цвет красного
   LCLICK(724,320)  // 15623680
   WAITMS(500) 
END_IF

IF(PXL(168,122) = 52224)) // координата и цвет зеленого
    LCLICK(891,140)  // 15623680
    WAITMS(500)
END_IF

У меня еще есть вопрос: " Как код нарезки интегрировать в код скрипта?"
Тоже надо начинать с "IF"?
Title: Re: Анализ текста в окне
Post by: Oraven on May 18, 2016, 07:33:55 PM
поправочка, лишние скобки в условии.
Code: (clickermann) [Select]
LCLICK(792,737)  // 7959563
WAITMS(20)
LCLICK(791,610)  // 255
WAITMS(800)

GETSCREEN // снимок экрана в буфер кликера для последующего анализа
IF(PXL(343,302) = 3748071) // координата и цвет красного
   LCLICK(724,320)  // 15623680
   WAITMS(500)
END_IF

IF(PXL(168,122) = 52224) // координата и цвет зеленого
   LCLICK(891,140)  // 15623680
   WAITMS(500)
END_IF
Title: Re: Анализ текста в окне
Post by: Валера Л on May 18, 2016, 10:00:35 PM
поправочка, лишние скобки в условии.
Code: (clickermann) [Select]
LCLICK(792,737)  // 7959563
WAITMS(20)
LCLICK(791,610)  // 255
WAITMS(800)

GETSCREEN // снимок экрана в буфер кликера для последующего анализа
IF(PXL(343,302) = 3748071) // координата и цвет красного
   LCLICK(724,320)  // 15623680
   WAITMS(500)
END_IF

IF(PXL(168,122) = 52224) // координата и цвет зеленого
   LCLICK(891,140)  // 15623680
   WAITMS(500)
END_IF


Спасибо, исправлю.
А как на счет интеграции кода нарезки, в код скрипта?
Как его, правильно, интегрировать?
Title: Re: Анализ текста в окне
Post by: Валера Л on May 19, 2016, 12:48:35 PM
что подразумевается под термином нарезка?

Я подразумеваю вот это:

 "....а образцы цифр ловят в скрины с мониторов и вырезают в паинте до нужного размера, как сало на ломтики. ;D"

пыс. Что то мне перестали приходить уведомления, с форы.
         В связи с чем не могу своевременно реагировать на ответы
Title: Re: Анализ текста в окне
Post by: Валера Л on May 20, 2016, 05:43:18 PM
Всем привет.
"Разделка","вырезка", "нарезка вырезки". Решил я обойти эту "кулинарную" тему.
Сделаю шаблоны своими руками,в редакторе.
К примеру в "паинте".
В связи с чем пытаюсь научить скрипт обращаться в файл, в котором хранятся шаблоны, и определять нужную комбинацию.

Надеюсь на помощь крутых Кликермэнов
Может кто поможет?

Пример шаблона:




Title: Re: Анализ текста в окне
Post by: Oraven on May 21, 2016, 09:28:31 AM
Вот написал более короткий скрипт распознавания любых символов. Пробелы не учитываются!
Code: (clickermann) [Select]
#name "Распознавание символов v1.0"

SUB(An, $let, $pict)
   SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, $pict, -1, 100)
   FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
      ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
      ARRPUSH($ARR_OUT, $let)
   END_CYC
   UNDEFINE($ARR_SCAN)
END_SUB

// область распознавания
$x1 = 222 // верхний левый угол
$y1 = 592

$x2 = 302 // нижний правый
$y2 = 615

GETSCREEN
An("0","Letters\0.bmp")
An("1","Letters\1.bmp")
An("2","Letters\2.bmp")
An("3","Letters\3.bmp")
An("4","Letters\4.bmp")
An("5","Letters\5.bmp")
An("6","Letters\6.bmp")
An("7","Letters\7.bmp")
An("8","Letters\8.bmp")
An("9","Letters\9.bmp")

$siz = ARRSIZE($ARR_OUT)
$srtcheck = 0
$srt = 0
FOR($a=$siz-2,($a>0)&($srt=0),-2)
   FOR($b=0,$b<$a,2)
      IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
         $srtcheck = 1
         $tmp = $ARR_OUT[$b]
         $tmp2 = $ARR_OUT[$b+1]
         $ARR_OUT[$b] = $ARR_OUT[$b+2]
         $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
         $ARR_OUT[$b+2] = $tmp
         $ARR_OUT[$b+3] = $tmp2
      END_IF
   END_CYC
   IF($srtcheck = 0)
      $srt = 1
   END_IF
END_CYC

$str = ""
FOR($a=0,$a<ARRSIZE($ARR_OUT),2)   
   IF(STRLEN($str) > 0)
      $str = STRCONCAT($str, $ARR_OUT[$a+1])
   ELSE
      $str = $ARR_OUT[$a+1]
   END_IF   
END_CYC
UNDEFINE($ARR_OUT)
LOGWRITE ($str) // в $str выводятся распознанные символы

HALT
Title: Re: Анализ текста в окне
Post by: Oraven on May 21, 2016, 03:20:39 PM
Улучшенный скрипт для версии 4.12 кликера.

Теперь скрипт сам определяет символ по первому символу из имени картинки. Нужно лишь нарезать картинки символов и обозвать их соответствующим образом.
К сожалению пока на 4.12 функция GETFILELIST работает крайне плохо. В большинстве случаев просто не возвращает имена файлов поэтому пока от него мало толку.

Code: (clickermann) [Select]
#name "Распознавание символов v1.1"
// для версии кликера v4.12+

SUB(recognize, $x1,$y1, $x2,$y2)
   GETFILELIST($Letters_arr, "Letters\*.bmp")
   GETSCREEN($x1,$y1, $x2,$y2)
   FOR($Let_num=0,$Let_num<ARRSIZE($Letters_arr))
      SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, STRCONCAT("Letters\", $Letters_arr[$Let_num]), -1, 100)
      FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
         ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
         $Let = STRCUT($Letters_arr[$Let_num], 1, 1)
         SWITCH($Let)
         CASE(".") // решение проблемы точки
            ARRPUSH($ARR_OUT, "..")
         DEFAULT
            ARRPUSH($ARR_OUT, $Let)
         END_SWITCH
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
   
   $siz = ARRSIZE($ARR_OUT)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-2,($a>0)&($srt=0),-2)
      FOR($b=0,$b<$a,2)
         IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
            $srtcheck = 1
            $tmp = $ARR_OUT[$b]
            $tmp2 = $ARR_OUT[$b+1]
            $ARR_OUT[$b] = $ARR_OUT[$b+2]
            $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
            $ARR_OUT[$b+2] = $tmp
            $ARR_OUT[$b+3] = $tmp2
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   
   $str = ""
   FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
     
      IF(STRLEN($str) > 0)
         IF($ARR_OUT[$a]-$ARR_OUT[$a-2] > 10) // обпределение пробела
            $str = STRCONCAT($str, " ")
         END_IF
         $str = STRREPLACE(STRCONCAT($str, $ARR_OUT[$a+1]), "..", ".")
      ELSE
         $str = STRREPLACE($ARR_OUT[$a+1], "..", ".")
      END_IF
     
   END_CYC
   UNDEFINE($ARR_OUT)
   // в $str выводятся распознанные символы
END_SUB


recognize(673,437, 738,454) // область распознавания
LOGWRITE ($str)
recognize(24,192, 165,222) // область распознавания
LOGWRITE ($str)

HALT

Скрипт для 4.13 версии
Code: (clickermann) [Select]
SUB(recognize, $x1,$y1, $x2,$y2, $c_ignor, $prc)
   GETFILELIST($Letters_arr, "Letters\*.bmp")
   FOR($Let_num=0,$Let_num<ARRSIZE($Letters_arr))
      SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, STRCONCAT("Letters\", $Letters_arr[$Let_num]), $c_ignor, $prc)
      FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
         ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
         ARRPUSH($ARR_OUT, STRCUT($Letters_arr[$Let_num], 1, 1))
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
   $siz = ARRSIZE($ARR_OUT)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-2,($a>0)&($srt=0),-2)
      FOR($b=0,$b<$a,2)
         IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
            $srtcheck = 1
            $tmp = $ARR_OUT[$b]
            $tmp2 = $ARR_OUT[$b+1]
            $ARR_OUT[$b] = $ARR_OUT[$b+2]
            $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
            $ARR_OUT[$b+2] = $tmp
            $ARR_OUT[$b+3] = $tmp2
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   $str = ""
   FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
      IF(STRLEN($str) > 0)
         IF($ARR_OUT[$a]-$ARR_OUT[$a-2] > 10) // обпределение пробела
            $str = STRCONCAT($str, " ")
         END_IF
         $str = STRCONCAT($str, $ARR_OUT[$a+1])
      ELSE
         $str = $ARR_OUT[$a+1]
      END_IF
   END_CYC
   UNDEFINE($ARR_OUT)
END_SUB


GETSCREEN
recognize(147,783, 219,809, -1, 100) // область распознавания, цвет прозрачности, процент совпадения
LOGWRITE ($str) // в переменную $str выводятся распознанные символы

HALT

В данном примере реализован независимый процент совпадения для каждого символа.
Параметры пишутся непосредственно в имени файла.
Например "0_84.bmp" означает что символ для поиска "0" а процент совпадения "84"
Code: (clickermann) [Select]
// требуемая версия 4.13 и выше

SUB(recognize, $x1,$y1, $x2,$y2) // описание подпрограммы пишем вначале скрипта
   GETFILELIST($Letters_arr, "Letters\*.bmp")
   FOR($Let_num=0,$Let_num<ARRSIZE($Letters_arr))
      STRSEPARATE($Letters_arr[$Let_num], "_", $a_l)
      SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, STRCONCAT("Letters\", $Letters_arr[$Let_num]), -1, STRREPLACE($a_l[ARRSIZE($a_l)-1],".bmp",""))
      UNDEFINE($a_l)
      FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
         ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
         ARRPUSH($ARR_OUT, STRCUT($Letters_arr[$Let_num], 1, 1))
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
   $siz = ARRSIZE($ARR_OUT)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-2,($a>0)&($srt=0),-2)
      FOR($b=0,$b<$a,2)
         IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
            $srtcheck = 1
            $tmp = $ARR_OUT[$b]
            $tmp2 = $ARR_OUT[$b+1]
            $ARR_OUT[$b] = $ARR_OUT[$b+2]
            $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
            $ARR_OUT[$b+2] = $tmp
            $ARR_OUT[$b+3] = $tmp2
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   $str = ""
   FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
      IF(STRLEN($str) > 0)
         IF($ARR_OUT[$a]-$ARR_OUT[$a-2] > 50) // определение пробела (сколько пикселов между символами считать за пробел)
            $str = STRCONCAT($str, " ")
         END_IF
         $str = STRCONCAT($str, $ARR_OUT[$a+1])
      ELSE
         $str = $ARR_OUT[$a+1]
      END_IF
   END_CYC
   UNDEFINE($ARR_OUT)
   UNDEFINE($ARR_SCAN)
END_SUB

//=============================================


// вызов подпрограммы распознавания
GETSCREEN
COLORMODE(6)
recognize(100,100, 400,400) // область распознавания
LOGWRITE($str) // переменная с результатом (смотрим лог)

HALT
Title: Re: Анализ текста в окне
Post by: dramster on May 21, 2016, 05:47:13 PM
вот тебе еще вариант, взял отсюда http://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743 , на представленных тобой двух картинках работает отлично.
код немного подредактировал, вынес переменные уровня цветокоррекции и цвета цифр.
Code: (clickermann) [Select]
#name "ReCapcha"

SUB(pos_size)
   UNDEFINE($num_line_start)
   UNDEFINE($num_line_end)
   UNDEFINE($num_real)
   UNDEFINE($num_y1)
   UNDEFINE($num_y2)
   
   GETSCREEN($x1_fr,$y1_fr,$x2_fr,$y2_fr)
   COLORMODE($clmod,$x1_fr,$y1_fr,$x2_fr,$y2_fr)
   
   
   scanpxl($cap_arr,$x1_fr,$y1_fr,$x2_fr,$y2_fr, $num_color)
   IF(ARRSIZE ($cap_arr) = 0)
      print("капчи в этом поле нету")
      halt
   END_IF
   $y1_cap=$cap_arr[1]
   $y2_cap=ARRPOP($cap_arr)
   
   
   FOR($x=$x1_fr,$x<$x2_fr)
      FOR($y=$y1_cap,$y<$y2_cap+1)
         
         IF(pxl($x,$y) = $num_color)
            $x1_cap= $x

            $y=$y2_cap+1
            $x=$x2_fr
         END_IF
      END_CYC
   END_CYC
   
   FOR($x=$x2_fr,$x>$x1_fr,-1)
      FOR($y=$y1_cap,$y<$y2_cap+1)
         IF(pxl($x,$y) = $num_color)
            $x2_cap= $x
            $y=$y2_cap+1
            $x=$x1_fr
         END_IF
      END_CYC
   END_CYC
   
   //print($x1_cap," ",$y1_cap," ",$x2_cap," ",$y2_cap)
   //=======================================
   
   ARRPUSH ($num_line_start, $x1_cap)
   FOR($x=$x1_cap,$x<$x2_cap)
      FOR($y=$y1_cap,$y<$y2_cap+1)
         IF(pxl($x,$y)  = $num_color)
            IF((pxl($x+1,$y)  = $num_color)|(pxl($x+1,$y-1) =$num_color)|(pxl($x+1,$y+1) = $num_color))
               $y=999999
            END_IF
         END_IF
         
      END_CYC
      IF($y=$y2_cap+1)
         ARRPUSH ($num_line_end, $x)
         FOR($x_check=$x+1,$x_check<$x2_cap)
            FOR($y_check=$y1_cap,$y_check<$y2_cap+1)
               IF(pxl($x_check,$y_check)  = $num_color)
                  $x= $x_check
                  ARRPUSH ($num_line_start, $x)
                  $y_check=$y2_cap+1
                  $x_check=$x2_cap
               END_IF
            END_CYC
         END_CYC
      END_IF
   END_CYC
   ARRPUSH ($num_line_end, $x2_cap)
   
   //===================================
   
   FOR($num=0,$num<arrsize($num_line_start))
      FOR($y=$y1_cap,$y<$y2_cap)
         FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
            IF(pxl($x,$y)  = $num_color)
               ARRPUSH($num_y1,$y)
               $y=99999
               $x=$num_line_end[$num]+1
            END_IF
         END_CYC
      END_CYC
   END_CYC
   
   FOR($num=0,$num<arrsize($num_line_start))
      FOR($y=int($y2_cap),$y>$y1_cap,-1)
         FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
            IF(pxl($x,$y)  = $num_color)
               ARRPUSH($num_y2,$y)
               $y=$y1_cap
               $x=$num_line_end[$num]+1
            END_IF
         END_CYC
      END_CYC
   END_CYC
   print("=====================")
   print("найдено цифр в поле - ",arrsize($num_line_start))
   
   
   //   FOR($a=0,$a<arrsize($num_line_start))
   //      print($num_line_start[$a],",",$num_y1[$a],",",$num_line_end[$a],",",$num_y2[$a])
   //   END_CYC
END_SUB

//=============================================
SUB(side)
   FOR($num=0,$num<arrsize($num_line_start))
      $step =($num_y2[$num]-$num_y1[$num])/4
     
      FOR($a=0,$a<4)
         IF_PIXEL_IN($num_line_start[$num],$num_y1[$num]+ROUND(($step*$a),0),$num_line_end[$num],$num_y1[$num]+ROUND(($step*$a),0),$num_color)
            $x=$_return1
         END_IF
         
         IF_PIXEL_IN($num_line_start[$num],$num_y1[$num]+ROUND(($step*($a+1)),0),$num_line_end[$num],$num_y1[$num]+ROUND(($step*($a+1)),0),$num_color)
            IF($x-$_return1=0)
               ARRPUSH ($side, 0)
            else
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)>2)
                  ARRPUSH ($side, -1)
               else
                  IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)>0)
                     ARRPUSH ($side, -2)
                  END_IF
               END_IF
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)<-2)
                  ARRPUSH ($side, 1)
               else
                  IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)<0)
                     ARRPUSH ($side, 2)
                  END_IF
               END_IF
            END_IF
         else
            ARRPUSH ($side, 0)
         END_IF
         
         FOR($e=$num_line_end[$num],$e>$num_line_start[$num],-1)
            IF(pxl($e,$num_y1[$num]+ROUND(($step*$a),0)) = $num_color)
               $x=$e
               $e=$num_line_start[$num]
            END_IF
         END_CYC
         FOR($e=$num_line_end[$num],$e>$num_line_start[$num],-1)
            IF(pxl($e,$num_y1[$num]+ROUND(($step*($a+1)),0)) = $num_color)
               $xs=$e
               $e=$num_line_start[$num]
            END_IF
         END_CYC
         
         IF($x-$xs=0)
            ARRPUSH ($side, 0)
         else
            IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)>2)
               ARRPUSH ($side, -1)
            else
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)>0)
                  ARRPUSH ($side, -2)
               END_IF
            END_IF
            IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)<-2)
               ARRPUSH ($side, 1)
            else
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)<0)
                  ARRPUSH ($side, 2)
               END_IF
            END_IF
         END_IF
         
      END_CYC
     
      print("-------------")
     
      $side_str = $side[0]
      FOR($b=1,$b<arrsize($side))
         $side_str = STRCONCAT ($side_str,":",$side[$b])
      END_CYC
      //  print($side_str)
     
      FOR($c=0,$c<10)
         
         FOR($n=1,$n<TFCOUNT(STRCONCAT("num_",$c))+1)
            STRSEPARATE (TFREAD (STRCONCAT("num_",$c),$n), ":", $temp_arr)
           
            FOR($i=0,$i<8)
               IF(int($temp_arr[$i]) ! int($side[$i]))
                  $i=999
               END_IF
            END_CYC
            IF($i < 999)
               print("цифра ", $num+1," это ",$c)
               ARRPUSH ($num_fin,$c)
               ARRPUSH ($cap_all_arr,$c)
               $n=TFCOUNT(STRCONCAT("num_",$c))+1
               $c=10
            END_IF
            UNDEFINE($temp_arr)
         END_CYC
      END_CYC
     
      IF(arrsize($num_fin)<1)
         print("цифра ",$num+1," не распознана")
         $n_file = INPUTBOX(STRCONCAT("введи цифру которая в капче под номером ",$num+1), 0, 120)
         IF($n_file = "")
            halt
         END_IF
         ARRPUSH ($cap_all_arr,$n_file)
         TFWRITE (STRCONCAT("num_",$n_file), $side_str)
      END_IF
     
      UNDEFINE($side)
      UNDEFINE($num_fin)
   END_CYC
   
   $cap_all_str = $cap_all_arr[0]
   FOR($a=1,$a<arrsize($cap_all_arr))
      $cap_all_str = STRCONCAT ($cap_all_str,$cap_all_arr[$a])
   END_CYC
   print("-------------")
   print($cap_all_str)
   print(" ")
   
END_SUB
//=============================================
//=============================================
//=============================================
$clmod = 7  //уровень коррекции цвета
$num_color = 8388607     //цвет цифр при указанном выше уровне цветокоррекции.


$x1_fr=325     // координаты поля с капчей (целиком, то что белое)
$y1_fr=395
$x2_fr=369
$y2_fr=419


pos_size()      // определение границ цифр в капче

side()     //распознаватель

//в этоге мы имеем массив с цифрами  $cap_all_arr
//и строку  $cap_all_str


halt

обучение не сложное. всегото нужно прописать координаты твоей картинки с числом, без знака "%". точку данный код определит как цифру, это не проблема. обучаеш точку под цифру 1 например (я так и сделал)
первая твоя картинка к примеру будет выглядеть так
Code: [Select]
17:34:31 найдено цифр в поле - 4
17:34:31 -------------
17:34:31 цифра 1 это 6
17:34:31 -------------
17:34:31 цифра 2 это 1
17:34:31 -------------
17:34:31 цифра 3 это 1
17:34:31 -------------
17:34:31 цифра 4 это 5
17:34:31 -------------
17:34:31 6115
дальше уже понятно что предпоследняя цифра "1" это точка, с помощью функций работы со строками заменишь уже сам. или если тебе не важно что после точки, то пропишешь границы твоего числа до точки, 2 знака.


если же тебе это всеравно покажется сложным, предоставь на форуме картинки всех цифр, можно в разнобой, я обучу и дам тебе нужные файлы.
Title: Re: Анализ текста в окне
Post by: Валера Л on May 23, 2016, 11:49:47 AM
вот тебе еще вариант, взял отсюда http://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743 , на представленных тобой двух картинках работает отлично.
код немного подредактировал, вынес переменные уровня цветокоррекции и цвета цифр.
Code: (clickermann) [Select]
#name "ReCapcha"

SUB(pos_size)
   UNDEFINE($num_line_start)
   UNDEFINE($num_line_end)
   UNDEFINE($num_real)
   UNDEFINE($num_y1)
   UNDEFINE($num_y2)
   
   GETSCREEN($x1_fr,$y1_fr,$x2_fr,$y2_fr)
   COLORMODE($clmod,$x1_fr,$y1_fr,$x2_fr,$y2_fr)
   
   
   scanpxl($cap_arr,$x1_fr,$y1_fr,$x2_fr,$y2_fr, $num_color)
   IF(ARRSIZE ($cap_arr) = 0)
      print("капчи в этом поле нету")
      halt
   END_IF
   $y1_cap=$cap_arr[1]
   $y2_cap=ARRPOP($cap_arr)
   
   
   FOR($x=$x1_fr,$x<$x2_fr)
      FOR($y=$y1_cap,$y<$y2_cap+1)
         
         IF(pxl($x,$y) = $num_color)
            $x1_cap= $x

            $y=$y2_cap+1
            $x=$x2_fr
         END_IF
      END_CYC
   END_CYC
   
   FOR($x=$x2_fr,$x>$x1_fr,-1)
      FOR($y=$y1_cap,$y<$y2_cap+1)
         IF(pxl($x,$y) = $num_color)
            $x2_cap= $x
            $y=$y2_cap+1
            $x=$x1_fr
         END_IF
      END_CYC
   END_CYC
   
   //print($x1_cap," ",$y1_cap," ",$x2_cap," ",$y2_cap)
   //=======================================
   
   ARRPUSH ($num_line_start, $x1_cap)
   FOR($x=$x1_cap,$x<$x2_cap)
      FOR($y=$y1_cap,$y<$y2_cap+1)
         IF(pxl($x,$y)  = $num_color)
            IF((pxl($x+1,$y)  = $num_color)|(pxl($x+1,$y-1) =$num_color)|(pxl($x+1,$y+1) = $num_color))
               $y=999999
            END_IF
         END_IF
         
      END_CYC
      IF($y=$y2_cap+1)
         ARRPUSH ($num_line_end, $x)
         FOR($x_check=$x+1,$x_check<$x2_cap)
            FOR($y_check=$y1_cap,$y_check<$y2_cap+1)
               IF(pxl($x_check,$y_check)  = $num_color)
                  $x= $x_check
                  ARRPUSH ($num_line_start, $x)
                  $y_check=$y2_cap+1
                  $x_check=$x2_cap
               END_IF
            END_CYC
         END_CYC
      END_IF
   END_CYC
   ARRPUSH ($num_line_end, $x2_cap)
   
   //===================================
   
   FOR($num=0,$num<arrsize($num_line_start))
      FOR($y=$y1_cap,$y<$y2_cap)
         FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
            IF(pxl($x,$y)  = $num_color)
               ARRPUSH($num_y1,$y)
               $y=99999
               $x=$num_line_end[$num]+1
            END_IF
         END_CYC
      END_CYC
   END_CYC
   
   FOR($num=0,$num<arrsize($num_line_start))
      FOR($y=int($y2_cap),$y>$y1_cap,-1)
         FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
            IF(pxl($x,$y)  = $num_color)
               ARRPUSH($num_y2,$y)
               $y=$y1_cap
               $x=$num_line_end[$num]+1
            END_IF
         END_CYC
      END_CYC
   END_CYC
   print("=====================")
   print("найдено цифр в поле - ",arrsize($num_line_start))
   
   
   //   FOR($a=0,$a<arrsize($num_line_start))
   //      print($num_line_start[$a],",",$num_y1[$a],",",$num_line_end[$a],",",$num_y2[$a])
   //   END_CYC
END_SUB

//=============================================
SUB(side)
   FOR($num=0,$num<arrsize($num_line_start))
      $step =($num_y2[$num]-$num_y1[$num])/4
     
      FOR($a=0,$a<4)
         IF_PIXEL_IN($num_line_start[$num],$num_y1[$num]+ROUND(($step*$a),0),$num_line_end[$num],$num_y1[$num]+ROUND(($step*$a),0),$num_color)
            $x=$_return1
         END_IF
         
         IF_PIXEL_IN($num_line_start[$num],$num_y1[$num]+ROUND(($step*($a+1)),0),$num_line_end[$num],$num_y1[$num]+ROUND(($step*($a+1)),0),$num_color)
            IF($x-$_return1=0)
               ARRPUSH ($side, 0)
            else
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)>2)
                  ARRPUSH ($side, -1)
               else
                  IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)>0)
                     ARRPUSH ($side, -2)
                  END_IF
               END_IF
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)<-2)
                  ARRPUSH ($side, 1)
               else
                  IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)<0)
                     ARRPUSH ($side, 2)
                  END_IF
               END_IF
            END_IF
         else
            ARRPUSH ($side, 0)
         END_IF
         
         FOR($e=$num_line_end[$num],$e>$num_line_start[$num],-1)
            IF(pxl($e,$num_y1[$num]+ROUND(($step*$a),0)) = $num_color)
               $x=$e
               $e=$num_line_start[$num]
            END_IF
         END_CYC
         FOR($e=$num_line_end[$num],$e>$num_line_start[$num],-1)
            IF(pxl($e,$num_y1[$num]+ROUND(($step*($a+1)),0)) = $num_color)
               $xs=$e
               $e=$num_line_start[$num]
            END_IF
         END_CYC
         
         IF($x-$xs=0)
            ARRPUSH ($side, 0)
         else
            IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)>2)
               ARRPUSH ($side, -1)
            else
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)>0)
                  ARRPUSH ($side, -2)
               END_IF
            END_IF
            IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)<-2)
               ARRPUSH ($side, 1)
            else
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)<0)
                  ARRPUSH ($side, 2)
               END_IF
            END_IF
         END_IF
         
      END_CYC
     
      print("-------------")
     
      $side_str = $side[0]
      FOR($b=1,$b<arrsize($side))
         $side_str = STRCONCAT ($side_str,":",$side[$b])
      END_CYC
      //  print($side_str)
     
      FOR($c=0,$c<10)
         
         FOR($n=1,$n<TFCOUNT(STRCONCAT("num_",$c))+1)
            STRSEPARATE (TFREAD (STRCONCAT("num_",$c),$n), ":", $temp_arr)
           
            FOR($i=0,$i<8)
               IF(int($temp_arr[$i]) ! int($side[$i]))
                  $i=999
               END_IF
            END_CYC
            IF($i < 999)
               print("цифра ", $num+1," это ",$c)
               ARRPUSH ($num_fin,$c)
               ARRPUSH ($cap_all_arr,$c)
               $n=TFCOUNT(STRCONCAT("num_",$c))+1
               $c=10
            END_IF
            UNDEFINE($temp_arr)
         END_CYC
      END_CYC
     
      IF(arrsize($num_fin)<1)
         print("цифра ",$num+1," не распознана")
         $n_file = INPUTBOX(STRCONCAT("введи цифру которая в капче под номером ",$num+1), 0, 120)
         IF($n_file = "")
            halt
         END_IF
         ARRPUSH ($cap_all_arr,$n_file)
         TFWRITE (STRCONCAT("num_",$n_file), $side_str)
      END_IF
     
      UNDEFINE($side)
      UNDEFINE($num_fin)
   END_CYC
   
   $cap_all_str = $cap_all_arr[0]
   FOR($a=1,$a<arrsize($cap_all_arr))
      $cap_all_str = STRCONCAT ($cap_all_str,$cap_all_arr[$a])
   END_CYC
   print("-------------")
   print($cap_all_str)
   print(" ")
   
END_SUB
//=============================================
//=============================================
//=============================================
$clmod = 7  //уровень коррекции цвета
$num_color = 8388607     //цвет цифр при указанном выше уровне цветокоррекции.


$x1_fr=325     // координаты поля с капчей (целиком, то что белое)
$y1_fr=395
$x2_fr=369
$y2_fr=419


pos_size()      // определение границ цифр в капче

side()     //распознаватель

//в этоге мы имеем массив с цифрами  $cap_all_arr
//и строку  $cap_all_str


halt

обучение не сложное. всегото нужно прописать координаты твоей картинки с числом, без знака "%". точку данный код определит как цифру, это не проблема. обучаеш точку под цифру 1 например (я так и сделал)
первая твоя картинка к примеру будет выглядеть так
Code: [Select]
17:34:31 найдено цифр в поле - 4
17:34:31 -------------
17:34:31 цифра 1 это 6
17:34:31 -------------
17:34:31 цифра 2 это 1
17:34:31 -------------
17:34:31 цифра 3 это 1
17:34:31 -------------
17:34:31 цифра 4 это 5
17:34:31 -------------
17:34:31 6115
дальше уже понятно что предпоследняя цифра "1" это точка, с помощью функций работы со строками заменишь уже сам. или если тебе не важно что после точки, то пропишешь границы твоего числа до точки, 2 знака.


если же тебе это всеравно покажется сложным, предоставь на форуме картинки всех цифр, можно в разнобой, я обучу и дам тебе нужные файлы.

Спасибо!
Наконец-то у меня выходные.
Пытаюсь разобраться.
Что-то мой W10 не распознает язык
Пишет вот такое:

 =====================
11:24:18 ??????? ???? ? ???? - 1
11:24:18 -------------
11:26:56 =====================
11:26:56 ??????? ???? ? ???? - 1
11:26:56 -------------
11:27:07 ????? 1 ?? ??????????
11:27:15 -------------
11:27:15 0
11:27:15 
11:27:42 =====================
11:27:42 ??????? ???? ? ???? - 1
11:27:42 -------------
11:28:04 =====================
11:28:04 ??????? ???? ? ???? - 1
11:28:05 -------------
11:38:58 =====================
11:38:58 ??????? ???? ? ???? - 1
11:38:58 -------------
11:41:03 =====================
11:41:03 ??????? ???? ? ???? - 1
11:41:03 -------------
11:41:10 ????? 1 ??? 0
11:41:10 -------------
11:41:10 0
11:41:10 
11:41:12 =====================
11:41:12 ??????? ???? ? ???? - 1
11:41:12 -------------
11:42:55 ????? ? ???? ???? ????
11:45:12 =====================
11:45:12 ??????? ???? ? ???? - 1
11:45:12 -------------
11:46:03 =====================
11:46:03 ??????? ???? ? ???? - 1
11:46:03 -------------
Title: Re: Анализ текста в окне
Post by: Oraven on May 23, 2016, 02:18:34 PM
Ну и в чем проблема то, сделай 10 картинок цифр и точку и вперед.

Вот для 4.11 версии с учетом точки
Code: (clickermann) [Select]
#name "Распознавание символов v1.0.1"
// для версии кликера v4.11

SUB(An, $let, $pict)
   SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, $pict, -1, 100)
   FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
      ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
      SWITCH($Let)
      CASE(".") // решение проблемы точки
         ARRPUSH($ARR_OUT, "..")
      DEFAULT
         ARRPUSH($ARR_OUT, $Let)
      END_SWITCH
   END_CYC
   UNDEFINE($ARR_SCAN)
END_SUB

// область распознавания
$x1 = 292 // верхний левый угол
$y1 = 586

$x2 = 442 // нижний правый
$y2 = 631

GETSCREEN
An("0","Letters\0.bmp")
An("1","Letters\1.bmp")
An("2","Letters\2.bmp")
An("3","Letters\3.bmp")
An("4","Letters\4.bmp")
An("5","Letters\5.bmp")
An("6","Letters\6.bmp")
An("7","Letters\7.bmp")
An("8","Letters\8.bmp")
An("9","Letters\9.bmp")
An(".","Letters\.0.bmp")

$siz = ARRSIZE($ARR_OUT)
$srtcheck = 0
$srt = 0
FOR($a=$siz-2,($a>0)&($srt=0),-2)
   FOR($b=0,$b<$a,2)
      IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
         $srtcheck = 1
         $tmp = $ARR_OUT[$b]
         $tmp2 = $ARR_OUT[$b+1]
         $ARR_OUT[$b] = $ARR_OUT[$b+2]
         $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
         $ARR_OUT[$b+2] = $tmp
         $ARR_OUT[$b+3] = $tmp2
      END_IF
   END_CYC
   IF($srtcheck = 0)
      $srt = 1
   END_IF
END_CYC

$str = ""
FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
   IF(STRLEN($str) > 0)
      $str = STRREPLACE(STRCONCAT($str, $ARR_OUT[$a+1]), "..", ".")
   ELSE
      $str = STRREPLACE($ARR_OUT[$a+1], "..", ".")
   END_IF
END_CYC
UNDEFINE($ARR_OUT)
LOGWRITE ($str) // в $str выводятся распознанные символы

HALT
Title: Re: Анализ текста в окне
Post by: Oraven on May 23, 2016, 02:20:41 PM
На счет кодировки, нужно в реестре поправить значения

Нужно приравнять кодировки 1250 и 1252 к 1251
Code: [Select]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"
"1251"="c_1251.nls"
"1252"="c_1251.nls"

И перезагрузить комп.
Title: Re: Анализ текста в окне
Post by: Oraven on May 23, 2016, 02:22:23 PM
Если там графика меняется то дополнительно нужно делать цветокоррекцию, и скрины цифр тоже делать с цветокоррекцией.
Title: Re: Анализ текста в окне
Post by: Валера Л on May 23, 2016, 03:36:22 PM
На счет кодировки, нужно в реестре поправить значения

Нужно приравнять кодировки 1250 и 1252 к 1251
Code: [Select]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"
"1251"="c_1251.nls"
"1252"="c_1251.nls"

И перезагрузить комп.



Кодировки приравнял, комп перезагрузил.
Все осталось без изменений.
По-прежнему рисует вопросики.


Все! Нашел причину.
Title: Re: Анализ текста в окне
Post by: aster on September 30, 2016, 03:33:03 PM
помогите плз, скрипт распознования работает отлично,но как заставить его работать в цикле?
при последующем запросе распознования не определяет цифры,а добавляет в строку старые значения
что то нужно обнулить,а вот что не могу понять
скрипт dramsterа имею ввиду
Title: Re: Анализ текста в окне
Post by: Золотой on September 30, 2016, 03:39:03 PM
помогите плз, скрипт распознования работает отлично,но как заставить его работать в цикле?
при последующем запросе распознования не определяет цифры,а добавляет в строку старые значения
что то нужно обнулить,а вот что не могу понять
скрипт dramsterа имею ввиду
А зачем тут понимать? После завершения твоего цикла, просто прописываешь удаление сначала массивов, потом наращиваемых переменных, если не поможет вообще всех переменных, дело-то простое и много ума не надо.
Title: Re: Анализ текста в окне
Post by: aster on September 30, 2016, 04:12:55 PM
А зачем тут понимать? После завершения твоего цикла, просто прописываешь удаление сначала массивов, потом наращиваемых переменных, если не поможет вообще всех переменных, дело-то простое и много ума не надо.

если не трудно можно пример как обнулить массив?
Title: Re: Анализ текста в окне
Post by: Oraven on September 30, 2016, 04:20:18 PM
А зачем тут понимать? После завершения твоего цикла, просто прописываешь удаление сначала массивов, потом наращиваемых переменных, если не поможет вообще всех переменных, дело-то простое и много ума не надо.

если не трудно можно пример как обнулить массив?

Code: (clickermann) [Select]
UNDEFINE($arr)
Title: Re: Анализ текста в окне
Post by: aster on September 30, 2016, 04:35:02 PM
Code: (clickermann) [Select]
UNDEFINE($arr)

просто огромное спасибо , помоглло )))

Title: Re: Анализ текста в окне
Post by: YoClickamann on October 05, 2016, 10:03:34 AM
Кто-нибудь здесь знаком с Sikuli, OpenCV, ProjectNaphta?
Title: Re: Анализ текста в окне
Post by: Vint on October 05, 2016, 10:38:48 AM
Жениться вам надо барин.

Твоя неугомонная энергия несёт тебя по верхушкам тем, унося в сказочную даль.
Title: Re: Анализ текста в окне
Post by: i0 on October 05, 2016, 10:51:02 AM
Твоя неугомонная энергия несёт тебя по верхушкам тем, унося в сказочную даль.
ну а мы кругозор расширяем, норм )
Title: Re: Анализ текста в окне
Post by: Vint on October 05, 2016, 11:05:58 AM
 :)
Поискал, что же такое эта Сыкуля (Sikuli), блин, ну и название.
Увидел древнюю, примитивную и тормозную поделку с интересной задумкой. Но не стоящую внимания.
Есть много более полезных вещей, от селениума до упилота с автоитами... вплоть до любого высокоуровнего языка.

Про OpenCV читал только. Не было сферы применения. Ардуино не балуюсь и машинное зрение это не та область, где можно поковыряться два дня и прекрасно использовать в любых проектах. Всё динамично развивается и находится хоть и не в зачаточном состоянии, но далеко от конца пути.
Title: Re: Анализ текста в окне
Post by: Ddimas on October 19, 2016, 11:06:36 AM
Ребят, подскажите пожалуйста следующее...

нужно чтобы в определенной области экрана делал анализ цифр, он же ресурс(деньги)....и после этого листал дальше по кликом или когда нашел определенные действие, типа клика)) ...что я мог задать поиск цифр, более чем искомые

Title: Re: Анализ текста в окне
Post by: Золотой on October 19, 2016, 12:08:40 PM
Ребят, подскажите пожалуйста следующее...

нужно чтобы в определенной области экрана делал анализ цифр, он же ресурс(деньги)....и после этого листал дальше по кликом или когда нашел определенные действие, типа клика)) ...что я мог задать поиск цифр, более чем искомые
анализ цифр это слишком примитивно, воспользуйтесь выложенным на форуме скриптом " распознавание чисел"... и после этого поток сознания не оформленный в понятные предложения.
подскажите , что такое определённые действия типа клика, но не клик?
Title: Re: Анализ текста в окне
Post by: i0 on October 19, 2016, 12:12:52 PM
Ребят, подскажите пожалуйста следующее...
я понял по "он же ресурс(деньги)" включительно.
дальше мозг силится связать несогласованные слова и понимает, что: "да ну нафиг"
Title: Re: Анализ текста в окне
Post by: Vint on October 19, 2016, 12:34:01 PM
Может дальше это машинный перевод с украинского... или татарского?
Title: Re: Анализ текста в окне
Post by: Ddimas on October 19, 2016, 01:50:35 PM
Ну набросились)) я думал подскажите((.......вроде просто же...в определенном месте экрана(наверное по координатам), есть цифры, и к ним нужно применить следующие.....понять кликеру, величина числа и после нажать на нужное место), короче чтоб обновляла базы и искала нужное количество ресурсов, не точно а от заданной величины...да и ле есть шаблоны..может сам разберусь, побовал найти)) честно....спасибо
Title: Re: Анализ текста в окне
Post by: Vint on October 19, 2016, 02:22:09 PM
Ты повторно объяснил то, что все и так поняли и кстати ответили http://crapware.aidf.org/forum/index.php?topic=88.msg17859#msg17859
Не поняли вторую часть поста из-за несвязанных между собой слов.

То что посоветовали использовать, даже искать не нужно. Оно находится прямо в этой теме:
http://crapware.aidf.org/forum/index.php?topic=88.msg1571#msg1571

Заготавливаются скрины-заготовки каждой цифры, настраивается скрипт и он распознаёт число. Дальше уже значение применять в своём скрипте.

Если это не флэш, и число можно выделить мышью, то выделять и копировать в буфер обмена.
Title: Re: Анализ текста в окне
Post by: Cleoss on October 20, 2016, 01:38:40 AM
.......вроде просто же...в определенном месте экрана(наверное по координатам), есть цифры, и к ним нужно применить следующие.....понять кликеру, величина числа и после нажать на нужное место), короче чтоб обновляла базы и искала нужное количество ресурсов, не точно а от заданной величины...да и ле есть шаблоны..

Это тест Тьюринга) куда там компам, админы не все догнали))
Title: Re: Анализ текста в окне
Post by: Shamax on March 20, 2017, 09:05:25 AM
(https://pp.userapi.com/c837135/v837135525/2e25b/yMPhESdI94c.jpg)
помогите сделать скрипт
сравнить 2 цифры
если 1 не равно 2 то кликать в определенной точке
Title: Re: Анализ текста в окне
Post by: Shamax on March 20, 2017, 10:56:18 AM
(https://pp.userapi.com/c837135/v837135525/2e25b/yMPhESdI94c.jpg)
помогите сделать скрипт
сравнить 2 цифры
если 1 не равно 2 то кликать в определенной точке
Народ когда уже научитесь отличать, что такое цифра, а что такое число? Если не все предложения в рублях тогда сравнивать стоит суммы с пересчётом в одну валюту с учётом указанного курса.
Помогите - это конечно конечно вопиющее требование, вроде "спасите", но хотелось бы понять чем вас не устраивает скрипт по распознаванию чисел который написал уважаемый Vint?
Вы хотите Проводить такую цветокорекцию картинок, чтоб изображение сводилось к одинаковому и близкому в процентах или требуется ещё более свежее решение? Просто нормальным скриптам своё предложение проще запоминать, чем узнавать по картинке. Здесь конечно есть мушкетёры которые"...пишут скрипты ради того, чтобы ПИСАТЬ", но может достаточно просто потыкать носом в уже написаннное? Тем более что если вы не умеете включать чужие скрипты в состав своих, то и написанные по вашему сценарию скрипт будет проблематично использовать на практике.

ну это реально сделать или нет?
сравнить число и все можно только последние 2 цифры сравнивать
ну я не знаю как это реализовать,
за сколько можно это сделать по деньгам
Title: Re: Анализ текста в окне
Post by: gsukhado on August 07, 2017, 01:32:00 PM
Всем день добрый.
Попробовал использовать для своих целей Распознавание чисел 1.5.cms
Есть поле с шахтами, в левом нижнем углу которых указывается их уровень, надо его распознать
В основном коде ставлю строку
         number_read($tmp_x-18,$tmp_y+6,$tmp_x+8,$tmp_y+25, "textures\digit_", 7)
Нарезал со скриншотов цифры, прилагаются в архиве.
Хоть что-то распознает в среднем при качестве распознавания CASE(7) со значением $pr = 70 и ниже - но при этом попадает вообще пальцем в небо (чаще всего распознает якобы уровень 7, независимо от того какая на самом деле).
Смещения пробовал ставить от $SHIFT_X = 1 $SHIFT_Y = 1 до $SHIFT_X = 3 $SHIFT_Y = 5, не помогает.
В строке SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"), 16744447, $pr) попробовал заменить на SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"), -1, $pr) - тоже не помогло

Уважаемые знатоки, что тут еще надо "подвернуть", чтобы заработало для конкретной ситуации?

Код в основной части:
Code: (clickermann) [Select]
//основная часть
#include "Распознавание чисел 1.5.cms" //подключение для распознавания уровня шахт

print("--------------")
print("Начинаем фармить на поверхности")
   undefine($mass_shaht)
   getscreen
   colormode(7)
   $sh_x=0 //задание координат шахты для атаки, если (0,0) - то атаковать нечего
   $sh_y=0
 
   // ---Поиск шахты с золотом   
   SCANPICTURE ($mass_shaht, 70, 400, 355, 685, "g1_gold_7v1.bmp",-1,70) // ищем с 70% совпадения
   Print("количество золотых шахт до проверки = ", arrsize($mass_shaht)/2 )
   
   $arrsize_fict=arrsize($mass_shaht)
   while ($arrsize_fict > 0)
      $tmp_y=arrpop($mass_shaht)
      $tmp_x=arrpop($mass_shaht)
     
      IF_PICTURE_IN ($tmp_x-5+11, $tmp_y-46-5, $tmp_x+23+5, $tmp_y-20+5, "g1_taiming_7v2.bmp",-1,70) // проверка на наличие тайминга
         print("...тайминг есть, атаковать нельзя")
         // поиск уровня обнаруженной шахты
         $log = 1
         number_read($tmp_x-18,$tmp_y+6,$tmp_x+8,$tmp_y+25, "textures\digit_", 7)
         print ("уровень шахты:  ", $res, " просто посмотрели")
         
      else
         print("...тайминга нет")
         $sh_x=$tmp_x
         $sh_y=$tmp_y
         // поиск уровня обнаруженной шахты
         $log = 1
         number_read($tmp_x-18,$tmp_y+6,$tmp_x+8,$tmp_y+25, "textures\digit_", 7)
         if ($res < 13)
        print ("...уровень шахты:  ", $res, " атакуем")
$arrsize_fict=0 //для прерывания цикла while - если нашли цель, то иные можно не проверять
GOTO(end_while)
         else
            print("...уровень шахты:  ", $res, " НЕ атакуем")
         end_if
      end_if
      $arrsize_fict=arrsize($mass_shaht)
      end_while:   
   end_cyc
//далее алгоритм собственно атаки

P.S.Не очень понял где лучше данный вопрос задать: то ли создавать отдельный вопрос в основном чате "Общие вопросы", то ли не плодить нового и продолжить имеющуюся тему. Решил продолжить имеющуюся
Title: Re: Анализ текста в окне
Post by: Vint on August 07, 2017, 03:12:48 PM
Смещения пробовал ставить от $SHIFT_X = 1 $SHIFT_Y = 1 до $SHIFT_X = 3 $SHIFT_Y = 5, не помогает.
Зачем ставить наугад? Размеры символов 4-5х8, вот $SHIFT_X = 3 $SHIFT_Y = 5 нормально подходит

В строке SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"), 16744447, $pr) попробовал заменить на
В твоём варианте 16744447 вообще никаким боком, это из другого примера. Конечно -1 (или может цвет фона в образцах).



Что то нарезанные образцы цифр сильно рафинированные. Неужели настоящие?
На скрине "экран_без_цветокоррекции" их так колбасит, что до образцов им очень далеко.
При таком маленьком шрифте и такой дикой разнице, там некоторые и на 50% не найдёт.
что тут еще надо "подвернуть", чтобы заработало для конкретной ситуации?
А шрифт никак нельзя увеличить? Выставить более высокое разрешение в игре или подобрать размер окна чтоб размер был ближе к не сглаженным эталонам.

Если нельзя, то я сочувствую. Или выбрать другой способ или тщательно настраивать каждую цифру подбором образца и процента. Потом ещё исключить взаимное влияние.
Title: Re: Анализ текста в окне
Post by: gsukhado on August 07, 2017, 06:17:37 PM
Vint, спасибо за ответы!
Что то нарезанные образцы цифр сильно рафинированные. Неужели настоящие?
Нет, пытался их облагородить :)

При таком маленьком шрифте и такой дикой разнице, там некоторые и на 50% не найдёт.
А шрифт никак нельзя увеличить? Выставить более высокое разрешение в игре или подобрать размер окна чтоб размер был ближе к не сглаженным эталонам.
Если нельзя, то я сочувствую. Или выбрать другой способ или тщательно настраивать каждую цифру подбором образца и процента. Потом ещё исключить взаимное влияние.
С ноутбука, так что размер в bluestack какой есть...
...Хотя попробую повернуть экран набок на 90 градусов, тогда размер экрана bluestack увеличится почти в 2 раза, буду надеяться что поможет....
Title: Re: Анализ текста в окне
Post by: faser on August 07, 2017, 06:20:40 PM
А шрифт никак нельзя увеличить? Выставить более высокое разрешение в игре или подобрать размер окна чтоб размер был ближе к не сглаженным эталонам.

Если нельзя, то я сочувствую. Или выбрать другой способ или тщательно настраивать каждую цифру подбором образца и процента. Потом ещё исключить взаимное влияние.
там палка о 2-х концах. Надо чтобы больше шахт влазило, но при этом картинки будут - хрен разберешь. Можно приблизить, иметь хорошие картинки и отлично определять текст, но при этом на экран будет влезать всего пара шахт (если повезёт) нужного уровня. Постоянный фарм пары шахт - прямая дорга в баню. По хорошему, надо приблизить и помимо поиска картинок задать алгоритм слайда карты в пределах синей границы. Ну или хотя бы в большом приближении жестко задать количество свайпов типа: вправо, вправо, вниз, влево, влево, вверх)
Title: Re: Анализ текста в окне
Post by: gsukhado on August 07, 2017, 09:17:01 PM
там палка о 2-х концах. Надо чтобы больше шахт влазило, но при этом картинки будут - хрен разберешь. Можно приблизить, иметь хорошие картинки и отлично определять текст, но при этом на экран будет влезать всего пара шахт (если повезёт) нужного уровня. Постоянный фарм пары шахт - прямая дорга в баню. По хорошему, надо приблизить и помимо поиска картинок задать алгоритм слайда карты в пределах синей границы. Ну или хотя бы в большом приближении жестко задать количество свайпов типа: вправо, вправо, вниз, влево, влево, вверх)
Да, все верно - "обход" свайпами внутри синей границы - это следующий шаг в восстановлении студенческих навыков программирования ))
Но сделать алгоритм рандомного блуждания внутри границы - сам не потяну, придется высчитывать и жестко прописывать свайпы обхода...
Title: Re: Анализ текста в окне
Post by: gsukhado on August 08, 2017, 11:29:28 AM
Общий вопрос по алгоритму Распознавание чисел 1.5.cms (http://crapware.aidf.org/forum/index.php?topic=88.msg1571#msg1571 )

Для случаев, когда конкретные написания цифр могут достаточно сильно отклоняться от "шаблона", можно ли использовать не конкретные образцы, а их массивы? Например, сделать подпапки "texures\number0\", "texures\number1\", "texures\number2\"... в которые накидывать разные написания одной и той же цифры. А алгоритм бы проверял на совпадение каждому из вариантов цифры в соответствующей подпапке.
А совсем идеально - чтобы если совпадений не найдено (установив высокую точность, например от 95), но скриншот данного кусочка экрана сразу складировался в отдельной папке - из которой потом вручную можно было бы нарезать цифры и добавить в нужную подпапку...

Есть мастера, которые могли бы так доделать алгоритм распознавания? Или тогда комп каждое распознавание будет по полчаса делать?
Title: Re: Анализ текста в окне
Post by: Vint on August 08, 2017, 01:50:11 PM
Здесь такого нет. Но так делали другой способ распознавания, в основном для капчи.

С распознаванием чисел в данной ситуации это тупик. Слишком большая разница в рендерах.
Постоянно будут новые варианты и на настройку уйдёт гораздо больше времени, не говоря уж о скорости. Скорость будет всё падать и падать.
Хочешь - попробуй. Я бы не советовал так искать в данном случае.

Вот вся тема с несколькими вариантами
http://crapware.aidf.org/forum/index.php?topic=2336.0
Title: Re: Анализ текста в окне
Post by: Vint on August 08, 2017, 01:58:43 PM
Если там не много шаблонов, а к примеру, 2 или 3 на цифру, то можно легко доделать.

Если у всех цифр по 3 шаблона, то просто добавить поисков:
Code: (clickermann) [Select]
SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,"_1.bmp"), 16744447, $pr)
SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,"_2.bmp"), 16744447, $pr)
SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,"_3.bmp"), 16744447, $pr)

Если у всех разное, то добавить через IF или SWITCH
Code: (clickermann) [Select]
      SWITCH($i)
      CASE(0)
         $pr = 95
         SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,"_2.bmp"), 16744447, $pr)
      CASE(1)
         $pr = 99
      CASE(3)
         $pr = 93
         SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,"_2.bmp"), 16744447, $pr)
         SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,"_3.bmp"), 16744447, $pr)
      CASE(4)
...

Или сделать массив таблицу с количеством скринов для каждой цифры.
Или раскидать цифры по папкам и сформировав путь искать по всем образцам в папке.

Но начнутся пересечения. При проценте отличном от 100, одну и ту же цифру может находить на одном и том же месте несколько раз.
И начнёт путать между цифрами, особенно 6-8-9-0 и 1-7
При 100% количество образцов будет не маленьким. И всё равно межцифровые ошибки возможны.
Title: Re: Анализ текста в окне
Post by: faser on August 08, 2017, 04:52:35 PM
Общий вопрос по алгоритму Распознавание чисел 1.5.cms (http://crapware.aidf.org/forum/index.php?topic=88.msg1571#msg1571 )

Для случаев, когда конкретные написания цифр могут достаточно сильно отклоняться от "шаблона", можно ли использовать не конкретные образцы, а их массивы? Например, сделать подпапки "texures\number0\", "texures\number1\", "texures\number2\"... в которые накидывать разные написания одной и той же цифры. А алгоритм бы проверял на совпадение каждому из вариантов цифры в соответствующей подпапке.
А совсем идеально - чтобы если совпадений не найдено (установив высокую точность, например от 95), но скриншот данного кусочка экрана сразу складировался в отдельной папке - из которой потом вручную можно было бы нарезать цифры и добавить в нужную подпапку...

Есть мастера, которые могли бы так доделать алгоритм распознавания? Или тогда комп каждое распознавание будет по полчаса делать?
предлагаю продолжить здесь:
http://crapware.aidf.org/forum/index.php?topic=3345.msg22991#msg22991
 т.к. это скорее вопросы не к скрипту распознавания цифр, а к нашему частному случаю в игре
Title: Re: Анализ текста в окне
Post by: gsukhado on August 11, 2017, 01:37:08 AM
Пытаюсь настроить под себя и разобраться с алгоритмом  Распознавание чисел 1.5.cms
Строка  102: $dead_size = ARRSIZE($dead)
Но ведь переменной $dead до этого никак не вводили и значение ей не задавали. Единственное что мы делаем, это _в_конце (!) цикла применяем UNDEFINE($dead).
Откуда в таком случае получается размер массива ARRSIZE($dead) ?
Title: Re: Анализ текста в окне
Post by: Oraven on August 11, 2017, 08:05:48 AM
$dead это массив, и да вначале он равен 0 и цикл будет пропущен. Но потом идет формирование этого массива если $dead_zone = 0 и на следующем круге FOR($j=0, $j < $a_scansize, 2) $dead_size уже не будет равна 0
Code: (clickermann) [Select]
         IF($dead_zone = 0)
            ARRPUSH($dead, $X)
            ARRPUSH($dead, $Y)
            ARRPUSH($data, $X)
            ARRPUSH($data, $i)
Title: Re: Анализ текста в окне
Post by: gsukhado on August 14, 2017, 12:26:31 AM
Извините, если не в тему  :( . Программка Portable ABBYY Screenshot Reader, весит всего 25м. Можно заставить кликер "таскать" руку для выделения зоны распознавания, результат (в зависимости от настроек) попадает в буфер обмена. Очень неплохо распознает текст, даже не горизонтальный (см. примеры в прицепе)! А вот если бы научиться передавать ей параметры зоны распознавания вместо графического выделения!!! Может кто "подломит"?  ;)

Попробовал, да весело распознает ;)
только если так приспособить:
переключаемся на окно с текстом
KEYPRESS R
выделяем область
KEYPRESS ENTER
распознанный текст в буфере
А для начинающего подробней можно, как это все запрограммировать?
...попробовал Portable ABBYY Screenshot Reader вручную - строку с буквами и цифрами распознает хорошо. А если только цифры без букв - то совсем плохо :(
Title: Re: Анализ текста в окне
Post by: gsukhado on August 14, 2017, 01:19:06 PM
Стоит подумать о другом методе. Например поделить на зоны цифр и считать в области сумму чистого цвета 10310011
Может там граница более чёткая.
Имеется в виду что-то типа такого алгоритма? https://habrahabr.ru/post/101446/


А для случаев плохого распознавания (одни и те же цифры достаточно сильно друг от друга отличаются), вот этот вариант не поможет случайно, никто не пробовал?
https://habrahabr.ru/post/158431/
"Создаём новую двумерную матрицу b(x,y). В неё будем писать результаты.
Берём четыре соседних пикселя — квадрат.
Если хотя бы один из цветов этих пикселей остался в списке основных цветов — пишем в новую матрицу b(0,0)=Х. Если ни одного нет — пишем b(0,0)=0.
Берём следующие 4 пикселя. Повторять до конца матрицы, а в случае больших изображений операцию даже можно прогнать дважды."
Title: Re: Анализ текста в окне
Post by: Vint on August 14, 2017, 02:31:59 PM
Да, на том шрифте предлагалось что-то типа такого. Но там шрифт большой.
На среднем и на мелком такой вариант не подойдёт.
Title: Re: Анализ текста в окне
Post by: gsukhado on August 14, 2017, 05:16:29 PM
Судя по картинке на хабре, там размер по высоте около 13 пикселей.
Если я могу сделать цифры такого же размера, то получается попробовать алгоритм можно? Где-то он для кликермана уже был реализован? (я как программист слабоват)
...или ты про алгоритм "по сумме чистого цвета", а не про "двумерную матрицу"?
Title: Re: Анализ текста в окне
Post by: Vint on August 14, 2017, 05:50:13 PM
Я про первый, там 20х30. Твоё изменение поста и не видел тогда.

А вторая... не понял, чем она отличается от нашего обычного сравнения с шаблоном?
"Один из сайтов" это наверно Авито. Жешев - чёртов пособник спамеров  ;D
Title: Re: Анализ текста в окне
Post by: gsukhado on August 14, 2017, 06:17:05 PM
А вторая... не понял, чем она отличается от нашего обычного сравнения с шаблоном?
У меня проблема в том, что цифры между собой сильно разные, не получается отловить просто по шаблону. За счет поворота BlueStacks горизонтально на экране ноутбука, получилось увеличить размер цифр до примерно 6 на 13.
Если я правильно понял описание по ссылке у Жешева - то за счет его алгоритма происходит "усреднение" фактических скринов с экрана, т.е. они как бы приближаются к однотипному шаблону. Или я не правильно понял что Жешев делает?
Title: Re: Анализ текста в окне
Post by: Vint on August 14, 2017, 06:27:08 PM
Усреднение. Ну попробуй.
У Драмстера кажись в одном из вариантов есть сравнение с усреднённым образцом. Почти то же самое, но наоборот.

Просто все вот эти попиксельные действия не очень быстрые. И нужно перекрашивать в буфере.

Выложи хоть новые скрины с новым размером шрифта.
Title: Re: Анализ текста в окне
Post by: gsukhado on August 14, 2017, 06:59:12 PM
Вот еще не обработанные нарезки со скринов, плюс общий скрин экрана
(нарезки, по которым искал - не выкладываю, т.к. возможно не вполне верно и нарезал)

upd: добавил заготовки для цифр поштучно, вне архива
Title: Re: Анализ текста в окне
Post by: Vint on August 14, 2017, 09:56:34 PM
Ничего страшного, это же не самораспаковывающиеся.
Я в любом случае архив распаковываю архиватором по ПКМ без запуска.
Меня последнюю неделю, на рабочую почту, долбят направленными письмами. Всё шифровальщик хотят всучить. Как покопаешься, чего там только нет в загрузчиках и макросы к офису и шелл и баты. Зачем столько. Выше ведь вероятность что один из типов антивирь не пропустит в не зависимости от содержимого.
Title: Re: Анализ текста в окне
Post by: gsukhado on August 14, 2017, 10:24:17 PM
Какой смысл открывать архив от неизвестного человека?  А если у вас на компе вирус и вы об этом не подозреваете?
Зачем архивировать скрины, если эта программа работает с несжатыми форматами изображений?
1.По безопасности:
Не очень понимаю, в чем тут может быть вирус, если нет ни одного запускаемого файла?
2.По удобству:
Набор цифр вроде удобней брать архивом сразу, чем поштучно скачивать.
Но добавил заготовки в то же сообщение и поштучно, если архивом есть риски
3.Объективные ограничения:
Общий скрин экрана в *.bmp = 5 мб, форумом не принимается по размеру, так что только архивом
Title: Re: Анализ текста в окне
Post by: dramster on August 15, 2017, 12:36:29 AM
Усреднение. Ну попробуй.
У Драмстера кажись в одном из вариантов есть сравнение с усреднённым образцом. Почти то же самое, но наоборот.

насколько я понял, это ты про это http://crapware.aidf.org/forum/index.php?topic=2336.30
не слишком рабочая штука, насколько я помню, судя по тестам которые в том сообщении. сразу после написания - забыл про этот вариант, и далее делал упор на форму символов как вот тут http://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743
при распознавании всегда пользовался именно этом вариантом. с тех пор скрипт кардинально изменился.

насчет задачи gsukhado, я предпологаю, что если убрать лишние цвета, определить координаты каждой цифры (ну или числа), то вполне себе определял бы распознаватель по шаблонам с процентом точности совпадения. хотя, может я и ошибаюсь.
твои числа
(http://i.imgur.com/jBPbf09.png)

вот отфильтрованный вариант
(http://i.imgur.com/nrRxfoG.png)


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

вот накалякал под вышеуказанную заготовку

Code: (clickermann) [Select]
#name "text_reader"


////////////////////////////////////////////////////////////////////////////////
/////////разбивает текст на строки//////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

SUB(lines,$x1_text,$y1_text,$x2_text,$y2_text)
   UNDEFINE ($x1_line_arr)
   UNDEFINE ($y1_line_arr)
   UNDEFINE ($x2_line_arr)
   UNDEFINE ($y2_line_arr)
   
   IF_PIXEL_IN($x1_text,$y1_text, $x1_text,$y2_text, $char_color)
      print("текста не влазит в границы распознавания слева")
      halt
   END_IF
   IF_PIXEL_IN($x2_text,$y1_text, $x2_text,$y2_text, $char_color)
      print("текста не влазит в границы распознавания справа")
      halt
   END_IF
   
   IF(PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)<$x2_text-$x1_text+1)
      print("первоя строка обрезана,неучитывается")
      while(PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)<$x2_text-$x1_text+1)
         inc($y1_text)
      END_CYC
   END_IF
   
   while($y1_text<$y2_text)
     
      while((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)=$x2_text-$x1_text+1)&($y1_text<$y2_text))
         inc($y1_text)
      END_CYC
     
     
      IF($y1_text<$y2_text)
         arrpush($x1_line_arr, $x1_text)
         arrpush($y1_line_arr, $y1_text)
         
         
         $h_str_temp=0
         while($h_str_temp<$h_str)
           
            while((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)<$x2_text-$x1_text+1)&($y1_text<$y2_text))
               inc($y1_text)
               inc($h_str_temp)
            END_CYC
           
            IF($h_str_temp<$h_str)
               while((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)=$x2_text-$x1_text+1)&($y1_text<$y2_text))
                  inc($y1_text)
               END_CYC
               $h_str_temp = 0
               
               $del_arr = arrpop($x1_line_arr)
               $del_arr = arrpop($y1_line_arr)
               arrpush($x1_line_arr, $x1_text)
               arrpush($y1_line_arr, $y1_text)
            END_IF
           
         END_CYC
         
         
      END_IF
     
      IF(PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)=$x2_text-$x1_text+1)
         arrpush($x2_line_arr, $x2_text)
         arrpush($y2_line_arr, $y1_text-1)
      else
         print("последняя строка обрезана,неучитывается")
         $del_arr = arrpop($x1_line_arr)
         $del_arr = arrpop($y1_line_arr)
      END_IF
     
   END_CYC
   
   print("количество строк - ",arrsize($x1_line_arr))
   // координаты в лог и скрины
   //   FOR($a=0,$a<arrsize($x1_line_arr))
   //      print($x1_line_arr[$a]," ",$y1_line_arr[$a]," ",$x2_line_arr[$a]," ",$y2_line_arr[$a])
   //      SCREENSHOTEX($x1_line_arr[$a],$y1_line_arr[$a],$x2_line_arr[$a],$y2_line_arr[$a])
   //   END_CYC
   
   IF(arrsize($x1_line_arr)=0)
      print("текста не найденно")
      halt
   END_IF
   
END_SUB
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
/////////размер и количество символов в строке//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
SUB(pos_size,$x1_line,$y1_line,$x2_line,$y2_line)
   
   UNDEFINE ($x1_char_arr)
   UNDEFINE ($y1_char_arr)
   UNDEFINE ($x2_char_arr)
   UNDEFINE ($y2_char_arr)
   
   
   FOR($x1_line_temp=$x1_line,$x1_line_temp<$x2_line+1)
      FOR($y1_line_temp=$y1_line,$y1_line_temp<$y2_line+1)
         IF(pxl($x1_line_temp,$y1_line_temp)=$char_color)
            arrpush($x1_char_arr,$x1_line_temp)
            while(PXLCOUNT($x1_line_temp,$y1_line,$x1_line_temp,$y2_line,$back_color)<$y2_line-$y1_line+1)
               inc($x1_line_temp)
            END_CYC
            arrpush($x2_char_arr,$x1_line_temp-1)
         END_IF
      END_CYC
   END_CYC
   
   FOR($i_char=0,$i_char<arrsize($x1_char_arr))
      SCANPXL ($pix_temp,$x1_char_arr[$i_char],$y1_line,$x2_char_arr[$i_char],$y2_line,$char_color)
      arrpush($y1_char_arr,$pix_temp[1])
      arrpush($y2_char_arr,$pix_temp[arrsize($pix_temp)-1])
      UNDEFINE ($pix_temp)
   END_CYC
   
   
   print("количество символов в строке - ",arrsize($x1_char_arr))
   
   //скрины каждого символа
   //   FOR($a=0,$a<arrsize($x1_char_arr))
   //      SCREENSHOTEX($x1_char_arr[$a],$y1_char_arr[$a],$x2_char_arr[$a],$y2_char_arr[$a])
   //   END_CYC
   
END_SUB
////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////
////////////////очертание символов//////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
SUB(shape,$x1_char,$y1_char,$x2_char,$y2_char)
   
   UNDEFINE($left_1)
   UNDEFINE($left_2)
   UNDEFINE($left_3)
   UNDEFINE($left_4)
   UNDEFINE($left_5)
   UNDEFINE($right_1)
   UNDEFINE($right_2)
   UNDEFINE($right_3)
   UNDEFINE($right_4)
   UNDEFINE($right_5)
   UNDEFINE($up_1)
   UNDEFINE($up_2)
   UNDEFINE($up_3)
   UNDEFINE($up_4)
   UNDEFINE($up_5)
   UNDEFINE($down_1)
   UNDEFINE($down_2)
   UNDEFINE($down_3)
   UNDEFINE($down_4)
   UNDEFINE($down_5)
   int(($y2_char-$y1_char+1)/2)
   
   //лево
   FOR($temp=$x1_char,(pxl($temp,$y2_char)!$char_color)&($temp<$x2_char))
      inc($left_1)
   END_CYC
   $left_1 = ROUND($left_1/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_1 > 9)
      $left_1 = 9
   END_IF
   FOR($temp=$x1_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp<$x2_char))
      inc($left_2)
   END_CYC
   $left_2 = ROUND($left_2/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_2 > 9)
      $left_2 = 9
   END_IF
   FOR($temp=$x1_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/2,0))!$char_color)&($temp<$x2_char))
      inc($left_3)
   END_CYC
   $left_3 = ROUND($left_3/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_3 > 9)
      $left_3 = 9
   END_IF
   FOR($temp=$x1_char,(pxl($temp,$y1_char+ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp<$x2_char))
      inc($left_4)
   END_CYC
   $left_4 = ROUND($left_4/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_4 > 9)
      $left_4 = 9
   END_IF
   FOR($temp=$x1_char,(pxl($temp,$y1_char)!$char_color)&($temp<$x2_char))
      inc($left_5)
   END_CYC
   $left_5 = ROUND($left_5/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_5 > 9)
      $left_5 = 9
   END_IF
   
   //право
   FOR($temp=$x2_char,(pxl($temp,$y2_char)!$char_color)&($temp>$x1_char),-1)
      inc($right_1)
   END_CYC
   $right_1 = $right_1 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_1 = ROUND($right_1/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_1 > 9)
      $right_1 = 9
   END_IF
   FOR($temp=$x2_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp>$x1_char),-1)
      inc($right_2)
   END_CYC
   $right_2 = $right_2 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_2 = ROUND($right_2/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_2 > 9)
      $right_2 = 9
   END_IF
   FOR($temp=$x2_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/2,0))!$char_color)&($temp>$x1_char),-1)
      inc($right_3)
   END_CYC
   $right_3 = $right_3 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_3 = ROUND($right_3/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_3 > 9)
      $right_3 = 9
   END_IF
   FOR($temp=$x2_char,(pxl($temp,$y1_char+ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp>$x1_char),-1)
      inc($right_4)
   END_CYC
   $right_4 = $right_4 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_4 = ROUND($right_4/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_4 > 9)
      $right_4 = 9
   END_IF
   FOR($temp=$x2_char,(pxl($temp,$y1_char)!$char_color)&($temp>$x1_char),-1)
      inc($right_5)
   END_CYC
   $right_5 = $right_5 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_5 = ROUND($right_5/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_5 > 9)
      $right_5 = 9
   END_IF
   
   //верх
   FOR($temp=$y1_char,(pxl($x1_char,$temp)!$char_color)&($temp<$y2_char))
      inc($up_1)
   END_CYC
   $up_1 = ROUND($up_1/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_1 > 9)
      $up_1 = 9
   END_IF
   FOR($temp=$y1_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp<$y2_char))
      inc($up_2)
   END_CYC
   $up_2 = ROUND($up_2/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_2 > 9)
      $up_2 = 9
   END_IF
   FOR($temp=$y1_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/2,0),$temp)!$char_color)&($temp<$y2_char))
      inc($up_3)
   END_CYC
   $up_3 = ROUND($up_3/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_3 > 9)
      $up_3 = 9
   END_IF
   FOR($temp=$y1_char,(pxl($x2_char-ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp<$y2_char))
      inc($up_4)
   END_CYC
   $up_4 = ROUND($up_4/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_4 > 9)
      $up_4 = 9
   END_IF
   FOR($temp=$y1_char,(pxl($x2_char,$temp)!$char_color)&($temp<$y2_char))
      inc($up_5)
   END_CYC
   $up_5 = ROUND($up_5/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_5 > 9)
      $up_5 = 9
   END_IF
   
   //низ
   FOR($temp=$y2_char,(pxl($x1_char,$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_1)
   END_CYC
   $down_1 = ROUND($down_1/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_1 > 9)
      $down_1 = 9
   END_IF
   FOR($temp=$y2_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_2)
   END_CYC
   $down_2 = ROUND($down_2/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_2 > 9)
      $down_2 = 9
   END_IF
   FOR($temp=$y2_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/2,0),$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_3)
   END_CYC
   $down_3 = ROUND($down_3/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_3 > 9)
      $down_3 = 9
   END_IF
   FOR($temp=$y2_char,(pxl($x2_char-ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_4)
   END_CYC
   $down_4 = ROUND($down_4/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_4 > 9)
      $down_4 = 9
   END_IF
   FOR($temp=$y2_char,(pxl($x2_char,$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_5)
   END_CYC
   $down_5 = ROUND($down_5/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_5 > 9)
      $down_5 = 9
   END_IF
   
   
   //   print($left_1," ",$left_2," ",$left_3," ",$left_4," ",$left_5)
   //   print($right_1," ",$right_2," ",$right_3," ",$right_4," ",$right_5)
   //   print($up_1," ",$up_2," ",$up_3," ",$up_4," ",$up_5)
   //   print($down_1," ",$down_2," ",$down_3," ",$down_4," ",$down_5)
   
   $shape_str=STRCONCAT($left_1,$left_2,$left_3,$left_4,$left_5,$right_1,$right_2,$right_3,$right_4,$right_5,$up_1,$up_2,$up_3,$up_4,$up_5,$down_1,$down_2,$down_3,$down_4,$down_5,"~")
   
   //print($shape_str)
   
END_SUB
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
////////////////контраст////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
SUB(kontrast,$x1_contr,$y1_contr,$x2_contr,$y2_contr,$mid,$k)
   
   FOR($y_temp=$y1_contr,$y_temp<$y2_contr+1)
      FOR($x_temp=$x1_contr,$x_temp<$x2_contr+1)
         $col1= pxl($x_temp,$y_temp)
         IF(((colorr($col1)+colorg($col1)+colorb($col1))/3) > $mid)
            $outr=colorr($col1)+$k
            $outg=colorg($col1)+$k
            $outb=colorb($col1)+$k
            IF($outr < $mid)
               $outr=$mid
            END_IF
            IF($outg < $mid)
               $outg=$mid
            END_IF
            IF($outb < $mid)
               $outb=$mid
            END_IF
         else
            $outr=colorr($col1)-$k
            $outg=colorg($col1)-$k
            $outb=colorb($col1)-$k
            IF($outr > $mid)
               $outr=$mid
            END_IF
            IF($outg > $mid)
               $outg=$mid
            END_IF
            IF($outb > $mid)
               $outb=$mid
            END_IF
         END_IF
         IF($outr < 0)
            $outr=0
         END_IF
         IF($outg < 0)
            $outg=0
         END_IF
         IF($outb < 0)
            $outb=0
         END_IF
         IF($outr > 255)
            $outr=255
         END_IF
         IF($outg > 255)
            $outg=255
         END_IF
         IF($outb > 255)
            $outb=255
         END_IF
         PXLREPLACE($x_temp,$y_temp,$x_temp,$y_temp,$col1,COLORGEN($outr,$outg,$outb))
      END_CYC
   END_CYC
   SCREENSHOTEX($x1_contr,$y1_contr,$x2_contr,$y2_contr)
   
END_SUB
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
////////////////распознавание и обучение////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
IF(TFCOUNT("data.txt") = 0)
   TFWRITE ("data.txt"," ")
END_IF
$all_str = ""
SUB(reader,$shape,$n_char)
   
   
   
   FOR($n_str=1,$n_str<TFCOUNT("data.txt")+1)
      IF(STRPOS (TFREAD ("data.txt",$n_str), $shape) > 0)
         $t_char = STRCUT(TFREAD ("data.txt",$n_str), 1, STRPOS(TFREAD("data.txt",$n_str),":~")-1)
         //print($t_char)
         strfilter($t_char, "*", 0 )
         $all_str = STRCONCAT ($all_str,$t_char)
         $n_str=TFCOUNT("data.txt")+1
         $check=0
      else
         $check=1
      END_IF
   END_CYC
   
   IF($check=1)
      move(int(($x2_char_arr[$n_char]-$x1_char_arr[$n_char])/2)+$x1_char_arr[$n_char],$y2_char_arr[$n_char])
      $char_write = INPUTBOX(STRCONCAT("введи цифру под номером ",$n_char+1), "", 120)
      IF($char_write = "")
         print("cancel")
         halt
      END_IF
      $all_str = STRCONCAT ($all_str,$char_write)
      $check=0    //////////////////
     
      FOR($n_str=1,$n_str<TFCOUNT("data.txt")+1)
         IF(STRPOS (TFREAD ("data.txt",$n_str), STRCONCAT($char_write,":~")) =1)
            TFWRITE ("data.txt",STRCONCAT(TFREAD("data.txt",$n_str),$shape))
            TFDELETE ("data.txt",$n_str)
            $n_str=TFCOUNT("data.txt")+1
            $check=0
         else
            $check=1
         END_IF
      END_CYC
      IF($check=1)
         TFWRITE ("data.txt",STRCONCAT($char_write,":~",$shape))
      END_IF
   END_IF
   
END_SUB
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

//lines($x1_text,$y1_text,$x2_text,$y2_text) // определяет координаты строк
//ответ - массивы   $x1_line_arr,$y1_line_arr,$x2_line_arr,$y2_line_arr

//pos_size($x1_line,$y1_line,$x2_line,$y2_line) // координаты и количество символов
//ответ - массивы   $x1_char_arr,$y1_char_arr,$x2_char_arr,$y2_char_arr

//shape($x1_char,$y1_char,$x2_char,$y2_char)  //очертание каждого символа
//ответ - строка очертания вида  01110311112042200240~

//reader($shape)  //обучение и распознавание
//если цифра не распознана, то вылезет окно ввода, где нужно вписать нужную цифру, на эту цифру указывает курсор.
//ответ - строка $all_str


///////основной код/////////////////////////////////////////////////////////////




$char_color = 16777215   // цвет символов
$back_color = 8355711  //  цвет фона
$accur = 5       //точность  (1 - макс точность)
$h_str = 5     //минимальная высота строки, уменьшить, если определит лишние строки (типа точки в "Ё" или закарючка в "Й" )

$x1 = 558
$y1 = 1347
$x2 = 867
$y2 = 1386


//обязательная обработка изображения до двух цветов
GETSCREEN($x1,$y1,$x2,$y2)
COLORMODE(7, $x1,$y1,$x2,$y2)

PXLREPLACE ($x1,$y1,$x2,$y2, 8355839, 8355711)
PXLREPLACE ($x1,$y1,$x2,$y2, 8388607, 8355711)
PXLREPLACE ($x1,$y1,$x2,$y2, 8388479, 8355711)

//SCREENSHOTEX($x1,$y1,$x2,$y2)



lines($x1,$y1,$x2,$y2)

FOR($line=0,$line<arrsize($x1_line_arr))
   pos_size($x1_line_arr[$line],$y1_line_arr[$line],$x2_line_arr[$line],$y2_line_arr[$line])
   
   FOR($char=0,$char<arrsize($x1_char_arr))
      shape($x1_char_arr[$char],$y1_char_arr[$char],$x2_char_arr[$char],$y2_char_arr[$char])
      reader($shape_str,$char)
     
     
   END_CYC
END_CYC


print($all_str)




halt

при первом пуске скрипта, идет обучения. при этом, первые 3 единицы нужно обучать, а четвертая и пятая уже определяются автоматом.

скрип очень сложный. не используя его пару месяцев, пришлось немного попотеть пока настроил , при этом нашел пару ошибок в алгоритме  :D .


Title: Re: Анализ текста в окне
Post by: gsukhado on August 15, 2017, 05:57:53 PM
dramster, спасибо, буду разбираться!
Пока на вскидку два вопроса:
а)Не увидел обращения к подпрограмме kontrast (строка 332). Она нужна?
б)Строки 393-396 по сути можно вынести в самое начало основной части программы?
Title: Re: Анализ текста в окне
Post by: Автоматизатор on August 15, 2017, 07:07:08 PM

насколько я понял, это ты про это http://crapware.aidf.org/forum/index.php?topic=2336.30
не слишком рабочая штука, насколько я помню, судя по тестам которые в том сообщении. сразу после написания - забыл про этот вариант, и далее делал упор на форму символов как вот тут http://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743
при распознавании всегда пользовался именно этом вариантом. с тех пор скрипт кардинально изменился.




Можешь поделиться идеей, что ты изменил в распознавании чисел? я тот самый дода, но на том сайте игры я больше не сижу, сейчас в одном текстовом чате пытаюсь сломать капчу. пользуюсь твоим алгоритмом, но чет вообще не очень, прогресс 1 угадананя капча из 10. потмоу что либо цифры налезают друг на друга, либо моя цветокоррекция все режет. я ушел с кликера уже давно, сейчас на делфи просто программирую.

1.Алгоритм: качаю капчу, вот такого типа(во вложении).
2. все пиксели, ргб которых менее 700,000  превращаю в белый
3. около цифр присутствует фон сильный, из менее насыщенного цвета самой цифры(например цифра красная, а обводка розовая) - я это убираю так: все пиксели с ргб выше 13,000,000 превращаю в белый, затем превращаю все в ч/б и убираю точки, рядом с которыми менее двух закрашенных пикселей
4. затем определяю границы каждой цифры, заношу в массивы(тут тоже косяк с цифрами которые наезжают друг на друга, я без понятия как можно отделять программно.)
5. затем создал матрицу как здесь драмстерhttp://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743 (http://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743), но он использовал 4 координат по вертикали, а я пять взял.
6. потом проверка - если находим комбинацию нужную, то знаем что это за цифра, если нет то ввод вручную.
Недостатки моего способа:1. не знаю как отделить две цифры.
2. из-за коррекции шума, порой режется цифра до неузнаваемости(единичка страдает, бывает отрезается наполовину) или 4, короче некоторые числа сильно обрезаются.
Во вложении прикрепил пикселизацию(ч/б) видно, что порой нормально цифры видно как тут(https://pp.userapi.com/c836427/v836427995/6446c/DNoqZoqLH8M.jpg), весь мусор убран, а порой отсекает лишнее,  с цифр(0184) - четверка сильно потрепана(https://pp.userapi.com/c836427/v836427995/64463/3xr0FWJBvE4.jpg). Подскажите куда копать, друзья. могу скинуть исходник на делфи

Update
Попробую сейчас посчитать преобладающие цвета. также цифры фиксированной высоты, это тоже может сыграть на руку в алгоритме
Title: Re: Анализ текста в окне
Post by: dramster on August 15, 2017, 09:33:20 PM
dramster, спасибо, буду разбираться!
Пока на вскидку два вопроса:
а)Не увидел обращения к подпрограмме kontrast (строка 332). Она нужна?
б)Строки 393-396 по сути можно вынести в самое начало основной части программы?

а. подпрограмма kontrast нужна в редких случаях, когда очень сложно отделить символ от фона. работает она очень медленно, особенно если облась распознавания большая. но на капчах, это все равно быстрее, чем отправка и ожидание с сервисов распознавания. подробнее  о контрасте тут http://crapware.aidf.org/forum/index.php?topic=2399.0

б. совершенно верно. можно поставить где угодно, но выше основного скрипта. эта обрезка нужна лишь для первого запуска, когда файла "data.txt" не существует, а по алгоритму к этому файлу идет обращение и поиск строк, которых также не существует.
сильно не охота щас вникать, но возможно, после всех моих извращений по скрипту, этот кусок и не нужен.
Title: Re: Анализ текста в окне
Post by: dramster on August 15, 2017, 10:01:05 PM
1.Алгоритм: качаю капчу, вот такого типа(во вложении).
2. все пиксели, ргб которых менее 700,000  превращаю в белый
3. около цифр присутствует фон сильный, из менее насыщенного цвета самой цифры(например цифра красная, а обводка розовая) - я это убираю так: все пиксели с ргб выше 13,000,000 превращаю в белый, затем превращаю все в ч/б и убираю точки, рядом с которыми менее двух закрашенных пикселей
4. затем определяю границы каждой цифры, заношу в массивы(тут тоже косяк с цифрами которые наезжают друг на друга, я без понятия как можно отделять программно.)
5. затем создал матрицу как здесь драмстерhttp://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743 (http://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743), но он использовал 4 координат по вертикали, а я пять взял.
6. потом проверка - если находим комбинацию нужную, то знаем что это за цифра, если нет то ввод вручную.
Недостатки моего способа:1. не знаю как отделить две цифры.
2. из-за коррекции шума, порой режется цифра до неузнаваемости(единичка страдает, бывает отрезается наполовину) или 4, короче некоторые числа сильно обрезаются.

я так понял, что отделить цифры от фона у тебя получилось. насчет "точки, рядом с которыми менее двух закрашенных пикселей", давно уже хотел написать такой алгоритм, чтобы убирать лишнее, делать "толщину" цифр меньше, вроде не сложно, но както руки не доходят  :(.

Quote
тут тоже косяк с цифрами которые наезжают друг на друга, я без понятия как можно отделять программно.
с твоим вариантом сразу в голову пришла идея разделять такие цифры по цветам (я надеюсь там количество цветов ограничено). но есть затык с цифрами одинакового цвета находящиеся рядом, как в твоей последней капче 8 и 7 . хотя таких случае наверно не много, можно и пропустить. нужно пробовать. надеюсь идею понял - с начала ищешь красные цифры - распознаешь, потом зеленые - распознаешь, и тд.

Quote
но он использовал 4 координат по вертикали, а я пять взял.
бери обновленный вариант отсюда http://crapware.aidf.org/forum/index.php?topic=88.msg23101#msg23101 . там у меня с каждой из четырех сторон по пять точек. в этоге выходит строка типа 01110311112042200240~ . плюс возможность выставления точности $accur, где при его значении =1 , строка будет иметь цифры от 0 до 9. а при увеличении этого значения - будут только нолики и единички. помогает в при случаях, когда какието цифры похожи друг на друга, типа 1 и 7, или 8 и 0 . если цифры обычные и не искривлены, то смело можно присваивать этой переменно 6-7, быстрее обучится.

Quote
единичка страдает, бывает отрезается наполовину.
тут тебе в помощь контраст. http://crapware.aidf.org/forum/index.php?topic=2399.0 . там какраз  таки есть пример с таким случаем.
 капча (http://i.imgur.com/xouifPc.png)
колормод 8 (http://i.imgur.com/ONP0WPD.png)
в двойке прострел

$mid=170 $k=255 (http://i.imgur.com/1KCslXW.png)
$mid=190 $k=255 (http://i.imgur.com/2BnS0bg.png)



Title: Re: Анализ текста в окне
Post by: Автоматизатор on August 15, 2017, 10:06:41 PM
я так понял, что отделить цифры от фона у тебя получилось. насчет "точки, рядом с которыми менее двух закрашенных пикселей", давно уже хотел написать такой алгоритм, чтобы убирать лишнее, делать "толщину" цифр меньше, вроде не сложно, но както руки не доходят  :(.

Спасибо за советы, сейчас буду пробовать) только один нюанс, я ушел с кликера, поэтому чистый код взять не смогу, только алгоритмы. Кликер медленный, а я работаю с пост и гет запросами, регулярками, поэтому пока на delphi
Title: Re: Анализ текста в окне
Post by: dramster on August 15, 2017, 10:38:25 PM
я так понял, что отделить цифры от фона у тебя получилось. насчет "точки, рядом с которыми менее двух закрашенных пикселей", давно уже хотел написать такой алгоритм, чтобы убирать лишнее, делать "толщину" цифр меньше, вроде не сложно, но както руки не доходят  :(.
ради интереса, попробуй обработать вот такую капчу (новая капча с фрибитко.ин) своей прогай.
 
(http://i.imgur.com/UfmLLwK.png)

выйдет там оставить только буквы или нет? эта капча давно мне мозг мозолит, никак не возьмусь :D .
Title: Re: Анализ текста в окне
Post by: dramster on August 16, 2017, 12:21:14 AM
всеже набросал сам скриптик по анализу количества соседних пикселей.

Code: (clickermann) [Select]
$limit = 4   //лимит соседник пикселей
$x1 = 1049
$y1 = 1371
$x2 = 1232
$y2 = 1433

GETSCREEN
SCREENSHOTEX($x1,$y1,$x2,$y2)

FOR($a=0,$a<5)   //количество прогонов
     
   UNDEFINE($pxl_replace)   
   FOR($y=$y1,$y<$y2+1)
      FOR($x=$x1,$x<$x2+1)
         
         $point = 0
         IF(pxl($x,$y) = 0)
            IF(pxl($x-1,$y) = 0)
               inc($point)
            END_IF
            IF(pxl($x-1,$y-1) = 0)
               inc($point)
            END_IF
            IF(pxl($x,$y-1) = 0)
               inc($point)
            END_IF
            IF(pxl($x+1,$y-1) = 0)
               inc($point)
            END_IF
            IF(pxl($x+1,$y) = 0)
               inc($point
            END_IF
            IF(pxl($x+1,$y+1) = 0)
               inc($point)
            END_IF
            IF(pxl($x,$y+1) = 0)
               inc($point)
            END_IF
            IF(pxl($x-1,$y+1) = 0)
               inc($point)
            END_IF
           
            IF($point < $limit)
               arrpush($pxl_replace, $x)
               arrpush($pxl_replace, $y)
            END_IF
           
         END_IF
         
      END_CYC
   END_CYC
   
   FOR($i_pxl=0,$i_pxl<arrsize($pxl_replace),2)
      PXLREPLACE($pxl_replace[$i_pxl],$pxl_replace[$i_pxl+1],$pxl_replace[$i_pxl],$pxl_replace[$i_pxl+1],0,16777215)
   END_CYC
   
   SCREENSHOTEX($x1,$y1,$x2,$y2)
END_CYC
halt

результат:

делал по пять прогонов отсеивания, первый скрин - оригинал

$limit = 4
(http://i.imgur.com/QqzI0Km.png)
(http://i.imgur.com/jmKTdrD.png)
(http://i.imgur.com/JQpfzMv.png)
(http://i.imgur.com/DixWthC.png)
(http://i.imgur.com/F2TkZh7.png)
(http://i.imgur.com/CcLX9x2.png)
визуально результат отличный, но для автораспознавания врядли подойдет, да и буквы залазят друг на друга

$limit = 5
(http://i.imgur.com/f6nOXeR.png)
(http://i.imgur.com/XnKYt8Z.png)
(http://i.imgur.com/gMrvRYI.png)
(http://i.imgur.com/seOqUBs.png)
(http://i.imgur.com/fsoiYYx.png)
(http://i.imgur.com/DPnS2uF.png)

как нибудь попробую, придется долго обучать, но результат скорее всего меня не обрадует  :(


Title: Re: Анализ текста в окне
Post by: Автоматизатор on August 16, 2017, 08:37:00 AM
я так понял, что отделить цифры от фона у тебя получилось. насчет "точки, рядом с которыми менее двух закрашенных пикселей", давно уже хотел написать такой алгоритм, чтобы убирать лишнее, делать "толщину" цифр меньше, вроде не сложно, но както руки не доходят  :(.
ради интереса, попробуй обработать вот такую капчу (новая капча с фрибитко.ин) своей прогай.
 
(http://i.imgur.com/UfmLLwK.png)

выйдет там оставить только буквы или нет? эта капча давно мне мозг мозолит, никак не возьмусь :D .

Вот такая ситуация получилась: сначала подсчтитал цвета, там было много серого намешано, также белого и черного. весь серый превращаем в черный, оставляя ч/б изображение:
0;6935//черный
16777215;12104//белый
(https://pp.userapi.com/c836427/v836427758/55216/xE_5O4lx9fg.jpg)
Затем по такому алгоритму: (https://pp.userapi.com/c836427/v836427758/5520f/JvawTEI0_F4.jpg)
С изначальной переменной black3=9, проходим последовательно все 8 точек относительно центрального пикселя и при белой соседней точке отнимаем black3:=black3-1. А затем чистим, если black3=3/4/5/6(На свой выбор) Я прогнал твою картинку по 1 -ничего не изменилось.
2 - (https://pp.userapi.com/c836427/v836427758/55227/JXl185vRpOY.jpg)
3- (https://pp.userapi.com/c836427/v836427758/5522e/PCPMWiNt6xs.jpg)
4 - (https://pp.userapi.com/c836427/v836427758/55235/D4SEAbXPBJw.jpg)
5 - (https://pp.userapi.com/c836427/v836427758/5523c/7dmte5szAaI.jpg)
6- (https://pp.userapi.com/c836427/v836427758/55243/2RcY5401jcs.jpg)

Мне нравится фильтр по 4 точкам, а дальше уже можно просто отсечь лишнее, определив наиболее большую кучность черных точек
Title: Re: Анализ текста в окне
Post by: Vint on August 16, 2017, 12:45:34 PM
всеже набросал сам скриптик по анализу количества соседних пикселей...

Позвольте чуть оптимизировать (чёт меня пробило)
Code: (clickermann) [Select]
//===  Вариант 2  ==============================================================
SUB(NoDirt_2, $x1,$y1, $x2,$y2, $limit)
    GETSCREEN($x1-1,$y1-1, $x2+1,$y2+1)
    SCREENSHOTEX($x1,$y1, $x2,$y2)
   
    FOR($a=0, $a < 5)   // количество прогонов
        UNDEFINE($pRepl)
        FOR($y=$y1, $y < $y2+1)
            FOR($x=$x1, $x < $x2+1)
                IF(PXL($x, $y) = 0)
                    $point = PXLCOUNT($x-1, $y-1, $x+1, $y+1, 0) - 1
                    IF($point < $limit)
                        ARRPUSH($pRepl, $x)
                        ARRPUSH($pRepl, $y)
                    END_IF
                END_IF
            END_CYC
        END_CYC
       
        //LOGWRITE("$pRepl  ", ARRSIZE($pRepl)/2)
        FOR($i_pxl=0, $i_pxl < ARRSIZE($pRepl), 2)
            PXLREPLACE($pRepl[$i_pxl],$pRepl[$i_pxl+1],$pRepl[$i_pxl],$pRepl[$i_pxl+1], 0, 16777215)
        END_CYC
       
        SCREENSHOTEX($x1,$y1, $x2,$y2)
    END_CYC
END_SUB

Quote
//NoDirt_1($Gx1,$Gy1, $Gx2,$Gy2, $Glimit)
// время выполнения NoDirt_ : 39374 мс
// 0:0:39.374

//NoDirt_2($Gx1,$Gy1, $Gx2,$Gy2, $Glimit)
// время выполнения NoDirt_ : 26448 мс
// 0:0:26.448


И следом же позакрашивать дыры
[spoiler=Код]
Code: (clickermann) [Select]
//===  Вариант 1  ==============================================================
SUB(NoHoles_1, $x1,$y1, $x2,$y2)
    GETSCREEN($x1-1,$y1-1, $x2+1,$y2+1)
    UNDEFINE($pRepl)
    FOR($y=$y1, $y < $y2)
        FOR($x=$x1, $x < $x2)
            IF(PXL($x, $y) = 16777215)
                $point = PXLCOUNT($x, $y, $x+1, $y+1, 0)
                IF($point = 3)
                    ARRPUSH($pRepl, $x)
                    ARRPUSH($pRepl, $y)
                END_IF
            END_IF
        END_CYC
    END_CYC
   
    //LOGWRITE("$pRepl  ", ARRSIZE($pRepl)/2)
    FOR($i_pxl=0, $i_pxl < ARRSIZE($pRepl), 2)
        PXLREPLACE($pRepl[$i_pxl],$pRepl[$i_pxl+1],$pRepl[$i_pxl],$pRepl[$i_pxl+1], 16777215, 0)
    END_CYC
    SCREENSHOTEX($Gx1,$Gy1, $Gx2,$Gy2, "NoHoles_")
END_SUB
[/spoiler]
(http://savepic.net/9652801.png)

а лучше так
Code: (clickermann) [Select]
//===  Вариант 2  ==============================================================
SUB(NoHoles_2, $x1,$y1, $x2,$y2)
    GETSCREEN($x1-1,$y1-1, $x2+1,$y2+1)
    UNDEFINE($pRepl)
    FOR($y=$y1, $y < $y2)
        FOR($x=$x1, $x < $x2)
            $point = PXLCOUNT($x, $y, $x+1, $y+1, 0)
            IF($point = 3)
                ARRPUSH($pRepl, $x)
                ARRPUSH($pRepl, $y)
            END_IF
        END_CYC
    END_CYC
   
    //LOGWRITE("$pRepl  ", ARRSIZE($pRepl)/2)
    FOR($i_pxl=0, $i_pxl < ARRSIZE($pRepl), 2)
        PXLREPLACE($pRepl[$i_pxl],$pRepl[$i_pxl+1],$pRepl[$i_pxl]+1,$pRepl[$i_pxl+1]+1, 16777215, 0)
    END_CYC
    SCREENSHOTEX($Gx1,$Gy1, $Gx2,$Gy2, "NoHoles_")
END_SUB

(http://savepic.net/9692736.png)
Title: Re: Анализ текста в окне
Post by: gsukhado on August 29, 2017, 07:07:28 PM
вот накалякал под вышеуказанную заготовку
dramster, для ситуации глюкнутой картинки (изначально по ряду причин захват не той области для распознавания), как во вложении - у меня происходит зацикливание строк 43-62. Если я правильно понимаю, то это за счет строки 54 $h_str_temp = 0 и того, что нижний артефакт меньше чем $h_str.
Не подскажешь, как убрать зацикливание, какие дополнительные проверки ввести?
Title: Re: Анализ текста в окне
Post by: dramster on August 29, 2017, 09:54:53 PM
да, действительно, не сталкивался с таким случаем. скрипт думает, что строка не превысила минимальную высоту $h_str, и пытается пропустить ее, но далее то рабочая область заканчивается, и цикл лупит без перерыва.

в данный момент у меня не та машина чтобы норм потестить, да и времени и сил нету, через недельку пересмотрю и перепроверю. примерно прикинул как исправить баг. добавил еще условие в цикл, ну и еще.... в общем вот, замени глючный цикл вот этим.
Code: (clickermann) [Select]
$h_str_temp=0
while(($h_str_temp<$h_str)&($y1_text<$y2_text))
   
   while((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)<$x2_text-$x1_text+1)&($y1_text<$y2_text))
      inc($y1_text)
      inc($h_str_temp)
   END_CYC
   
   IF(($h_str_temp<$h_str)&($y1_text<$y2_text))
      while((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)=$x2_text-$x1_text+1)&($y1_text<$y2_text))
         inc($y1_text)
      END_CYC
      $h_str_temp = 0
     
      $del_arr = arrpop($x1_line_arr)
      $del_arr = arrpop($y1_line_arr)
      arrpush($x1_line_arr, $x1_text)
      arrpush($y1_line_arr, $y1_text)
   END_IF
   
END_CYC

потести.

по идее можно было просто минимальную высоту $h_str уменьшить, и все проблемы.

Title: Re: Анализ текста в окне
Post by: gsukhado on August 29, 2017, 10:49:23 PM
...
по идее можно было просто минимальную высоту $h_str уменьшить, и все проблемы.
Нет, вариант уменьшения высоты не подойдет - а вдруг артефакт окажется высотой в одну пикселю? :)
За скрипт спасибо, буду тестировать потом отпишусь
Title: Re: Анализ текста в окне
Post by: gsukhado on September 08, 2017, 01:16:43 AM
За скрипт спасибо, буду тестировать потом отпишусь
Докладываю: для однотипных цифр работает просто влет, схватил по паре-тройке разных вариантов написания и уверенно все распознает.
В конкретной игре, с которой вожусь - большинство цифр плавающие, по шрифту одни и те же, но размер может отличаться до полутора раз. Поэтому скриптом уже наловилось по 30-40 их вариантов, и обучение еще не завершилось. Но алгоритм распознавания отличный ))
Правда, обнаружилась еще бяка - иногда по экрану в игре гуляют произвольные человечки, которые топчутся и по цифрам, и в итоге при распознавании может выдать ошибку (см скрин). Редко, но бывает. Можно ли как-то на эту ошибку сразу программно реагировать и просто говорить что сценарий прерывать не надо?
Title: Re: Анализ текста в окне
Post by: Vint on September 08, 2017, 09:05:45 AM
Так на ноль делите батенька. Так недолго и вселенную аннигилировать  ;D

Я так понял это в месте
Code: (clickermann) [Select]
$right_1 = ROUND($right_1 / (INT(($y2_char-$y1_char+1)/2)) / $accur, -1)*10И им подобных.

Как минимум высчитать заранее
Code: (clickermann) [Select]
INT(($y2_char-$y1_char+1)/2)Записать в переменную и проверять на 0. Тем более это выражение встречается во всех пяти вычислениях $right, от $right_1 до $right_5

Ну и в других направлениях посмотреть аналогичные места.
Title: Re: Анализ текста в окне
Post by: gsukhado on September 08, 2017, 07:10:54 PM
ммм...
Но это означает, если я правильно понимаю, что алгоритм не отсеивает малые строки, что должна делать переменная $h_str ? Или я не правильно понял ее значение?

Чтобы было не совсем абстрактно, привожу полностью код, с которым вожусь. Блок по распознаванию - строка 412. Предполагаю, что все-таки что-то не то с подпрограммой lines, строка 33.
... опс, "Сообщение превышает максимально допустимую длину (20000 знаков).", придется обрезать

Code: (clickermann) [Select]
#name "Фарм Наземный"

//   Начало основной программы - строка 800

//   Изменяемые переменные
$glob_map_SUMMARNO=500 // общее число повторений работы по карте
$glob_map_for_centrirovanie_MAX_1=15 // как часто прыгаем в начало, минимальное значение
$glob_map_for_centrirovanie_MAX_2=20 // как часто прыгаем в начало, максимальное значение
$max_lvl_shaht=15 // максимальный уровень шахт, которые можем атаковать
$verojatn_proverki_voisk=1 // доля вероятности проверки войск, чем выше - тем реже проверяем
$rezhim_obuchenia=0 // если =1 то при не вводе цифры будет остановка программы

////////////////////////////////////////////////////////////////////////////////
//////////  описание важных подпрограмм                                            ////
////////////////////////////////////////////////////////////////////////////////
//lines($x1_text,$y1_text,$x2_text,$y2_text) // определяет координаты строк
//ответ - массивы   $x1_line_arr,$y1_line_arr,$x2_line_arr,$y2_line_arr
/////////
//pos_size($x1_line,$y1_line,$x2_line,$y2_line) // координаты и количество символов
//ответ - массивы   $x1_char_arr,$y1_char_arr,$x2_char_arr,$y2_char_arr
////////
//shape($x1_char,$y1_char,$x2_char,$y2_char)  //очертание каждого символа
//ответ - строка очертания вида  01110311112042200240~
////////
//reader($shape)  //обучение и распознавание
//если цифра не распознана, то вылезет окно ввода, где нужно вписать нужную цифру, на эту цифру указывает курсор.
//ответ - строка $all_str

////////////////////////////////////////////////////////////////////////////////
/////////разбивает текст на строки//////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

SUB(lines,$x1_text,$y1_text,$x2_text,$y2_text)
   UNDEFINE ($x1_line_arr)
   UNDEFINE ($y1_line_arr)
   UNDEFINE ($x2_line_arr)
   UNDEFINE ($y2_line_arr)
   //   print("===>подпрогр Lines")
   
   IF_PIXEL_IN($x1_text,$y1_text, $x1_text,$y2_text, $char_color)
      print("...(текст не влазит в границы распознавания слева)")
      $uspeh_raspoznav=0
      GOTO(to_end_lines)
   END_IF
   
   IF_PIXEL_IN($x2_text,$y1_text, $x2_text,$y2_text, $char_color)
      print("...(текст не влазит в границы распознавания справа)")
      $uspeh_raspoznav=0
      GOTO(to_end_lines)
   END_IF
   
   IF(PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)<$x2_text-$x1_text+1)
      print("...(первая строка обрезана, НЕ учитывается)") // в т.ч. скидывает помехи?
      while(PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)<$x2_text-$x1_text+1)
         inc($y1_text)
      END_CYC
      if ($y1_text=$y2_text)   //т.е. вообще везде какие-то помехи
         $uspeh_raspoznav=0
         GOTO(to_end_lines)
      end_if
   END_IF
   
   while($y1_text<$y2_text)
      //      print("исходное $y1_text= ", $y1_text, " и $y2_text=", $y2_text)
      while((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)=$x2_text-$x1_text+1)&($y1_text<$y2_text))
         inc($y1_text)
      END_CYC
      //      print("взяли для границ цифр $y1_text= ", $y1_text)
     
      IF($y1_text<$y2_text)
         arrpush($x1_line_arr, $x1_text)
         arrpush($y1_line_arr, $y1_text)
         
         $h_str_temp=0
         while(($h_str_temp<$h_str)&($y1_text<$y2_text))
           
            while((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)<$x2_text-$x1_text+1)&($y1_text<$y2_text))
               inc($y1_text)
               inc($h_str_temp)
            END_CYC
            //            print("сюда дошли?_2-1 $h_str_temp=", $h_str_temp, " $h_str=", $h_str, " $y1_text=", $y1_text, " $y2_text=", $y2_text)     
            IF(($h_str_temp<$h_str)&($y1_text<$y2_text))
               
               while((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)=$x2_text-$x1_text+1)&($y1_text<$y2_text))
                  inc($y1_text)
               END_CYC
               $h_str_temp = 0
               $del_arr = arrpop($x1_line_arr)
               $del_arr = arrpop($y1_line_arr)
               arrpush($x1_line_arr, $x1_text)
               arrpush($y1_line_arr, $y1_text)
            END_IF
         END_CYC
      END_IF
     
      IF(PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)=$x2_text-$x1_text+1)
         arrpush($x2_line_arr, $x2_text)
         arrpush($y2_line_arr, $y1_text-1)
      else
         print("...(последняя строка обрезана, НЕ учитывается)")
         $del_arr = arrpop($x1_line_arr)
         $del_arr = arrpop($y1_line_arr)
      END_IF
   END_CYC
   
   //   print("итог Lines- количество строк = ",arrsize($x1_line_arr))
   
   // координаты в лог и скрины
   //FOR($a=0,$a<arrsize($x1_line_arr))
   //      print($x1_line_arr[$a]," ",$y1_line_arr[$a]," ",$x2_line_arr[$a]," ",$y2_line_arr[$a])
   //   SCREENSHOTEX($x1_line_arr[$a],$y1_line_arr[$a],$x2_line_arr[$a],$y2_line_arr[$a], ["подпрогр_Lines_скрин_итога_"])
   //END_CYC
   
   IF(arrsize($x1_line_arr)=0)
      print("...(текста не найдено)")
      $uspeh_raspoznav=0
      GOTO(to_end_lines)
      //      ggclick1(795, 15, 3)  //свернули окно игры
      //      halt
   END_IF
   
   to_end_lines:
   
END_SUB

////////////////////////////////////////////////////////////////////////////////
/////////размер и количество символов в строке//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
SUB(pos_size,$x1_line,$y1_line,$x2_line,$y2_line)
   //   print("===>подпрогр pos_size")
   UNDEFINE ($x1_char_arr)
   UNDEFINE ($y1_char_arr)
   UNDEFINE ($x2_char_arr)
   UNDEFINE ($y2_char_arr)
   
   
   FOR($x1_line_temp=$x1_line,$x1_line_temp<$x2_line+1)
      FOR($y1_line_temp=$y1_line,$y1_line_temp<$y2_line+1)
         IF(pxl($x1_line_temp,$y1_line_temp)=$char_color)
            arrpush($x1_char_arr,$x1_line_temp)
            while(PXLCOUNT($x1_line_temp,$y1_line,$x1_line_temp,$y2_line,$back_color)<$y2_line-$y1_line+1)
               inc($x1_line_temp)
            END_CYC
            arrpush($x2_char_arr,$x1_line_temp-1)
         END_IF
      END_CYC
   END_CYC
   
   FOR($i_char=0,$i_char<arrsize($x1_char_arr))
      SCANPXL ($pix_temp,$x1_char_arr[$i_char],$y1_line,$x2_char_arr[$i_char],$y2_line,$char_color)
      arrpush($y1_char_arr,$pix_temp[1])
      arrpush($y2_char_arr,$pix_temp[arrsize($pix_temp)-1])
      UNDEFINE ($pix_temp)
   END_CYC
   
   
   //   print("количество символов в строке - ",arrsize($x1_char_arr))
   
   //скрины каждого символа
   //   FOR($a=0,$a<arrsize($x1_char_arr))
   //      SCREENSHOTEX($x1_char_arr[$a],$y1_char_arr[$a],$x2_char_arr[$a],$y2_char_arr[$a], ["подпр_Pos_size_очертание_символа_"])
   //   END_CYC
   
END_SUB
////////////////////////////////////////////////////////////////////////////////
////////////////очертание символов//////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
SUB(shape,$x1_char,$y1_char,$x2_char,$y2_char)
   //   print("===>подпрогр shape")
   UNDEFINE($left_1)
   UNDEFINE($left_2)
   UNDEFINE($left_3)
   UNDEFINE($left_4)
   UNDEFINE($left_5)
   UNDEFINE($right_1)
   UNDEFINE($right_2)
   UNDEFINE($right_3)
   UNDEFINE($right_4)
   UNDEFINE($right_5)
   UNDEFINE($up_1)
   UNDEFINE($up_2)
   UNDEFINE($up_3)
   UNDEFINE($up_4)
   UNDEFINE($up_5)
   UNDEFINE($down_1)
   UNDEFINE($down_2)
   UNDEFINE($down_3)
   UNDEFINE($down_4)
   UNDEFINE($down_5)
   int(($y2_char-$y1_char+1)/2)
   
   //лево
   FOR($temp=$x1_char,(pxl($temp,$y2_char)!$char_color)&($temp<$x2_char))
      inc($left_1)
   END_CYC
   $left_1 = ROUND($left_1/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_1 > 9)
      $left_1 = 9
   END_IF
   FOR($temp=$x1_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp<$x2_char))
      inc($left_2)
   END_CYC
   $left_2 = ROUND($left_2/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_2 > 9)
      $left_2 = 9
   END_IF
   FOR($temp=$x1_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/2,0))!$char_color)&($temp<$x2_char))
      inc($left_3)
   END_CYC
   $left_3 = ROUND($left_3/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_3 > 9)
      $left_3 = 9
   END_IF
   FOR($temp=$x1_char,(pxl($temp,$y1_char+ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp<$x2_char))
      inc($left_4)
   END_CYC
   $left_4 = ROUND($left_4/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_4 > 9)
      $left_4 = 9
   END_IF
   FOR($temp=$x1_char,(pxl($temp,$y1_char)!$char_color)&($temp<$x2_char))
      inc($left_5)
   END_CYC
   $left_5 = ROUND($left_5/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_5 > 9)
      $left_5 = 9
   END_IF
   
   //право
   FOR($temp=$x2_char,(pxl($temp,$y2_char)!$char_color)&($temp>$x1_char),-1)
      inc($right_1)
   END_CYC
   $right_1 = $right_1 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_1 = ROUND($right_1/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_1 > 9)
      $right_1 = 9
   END_IF
   FOR($temp=$x2_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp>$x1_char),-1)
      inc($right_2)
   END_CYC
   $right_2 = $right_2 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_2 = ROUND($right_2/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_2 > 9)
      $right_2 = 9
   END_IF
   FOR($temp=$x2_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/2,0))!$char_color)&($temp>$x1_char),-1)
      inc($right_3)
   END_CYC
   $right_3 = $right_3 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_3 = ROUND($right_3/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_3 > 9)
      $right_3 = 9
   END_IF
   FOR($temp=$x2_char,(pxl($temp,$y1_char+ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp>$x1_char),-1)
      inc($right_4)
   END_CYC
   $right_4 = $right_4 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_4 = ROUND($right_4/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_4 > 9)
      $right_4 = 9
   END_IF
   FOR($temp=$x2_char,(pxl($temp,$y1_char)!$char_color)&($temp>$x1_char),-1)
      inc($right_5)
   END_CYC
   $right_5 = $right_5 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_5 = ROUND($right_5/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_5 > 9)
      $right_5 = 9
   END_IF
   
   //верх
   FOR($temp=$y1_char,(pxl($x1_char,$temp)!$char_color)&($temp<$y2_char))
      inc($up_1)
   END_CYC
   $up_1 = ROUND($up_1/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_1 > 9)
      $up_1 = 9
   END_IF
   FOR($temp=$y1_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp<$y2_char))
      inc($up_2)
   END_CYC
   $up_2 = ROUND($up_2/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_2 > 9)
      $up_2 = 9
   END_IF
   FOR($temp=$y1_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/2,0),$temp)!$char_color)&($temp<$y2_char))
      inc($up_3)
   END_CYC
   $up_3 = ROUND($up_3/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_3 > 9)
      $up_3 = 9
   END_IF
   FOR($temp=$y1_char,(pxl($x2_char-ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp<$y2_char))
      inc($up_4)
   END_CYC
   $up_4 = ROUND($up_4/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_4 > 9)
      $up_4 = 9
   END_IF
   FOR($temp=$y1_char,(pxl($x2_char,$temp)!$char_color)&($temp<$y2_char))
      inc($up_5)
   END_CYC
   $up_5 = ROUND($up_5/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_5 > 9)
      $up_5 = 9
   END_IF
   
   //низ
   FOR($temp=$y2_char,(pxl($x1_char,$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_1)
   END_CYC
   $down_1 = ROUND($down_1/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_1 > 9)
      $down_1 = 9
   END_IF
   FOR($temp=$y2_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_2)
   END_CYC
   $down_2 = ROUND($down_2/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_2 > 9)
      $down_2 = 9
   END_IF
   FOR($temp=$y2_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/2,0),$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_3)
   END_CYC
   $down_3 = ROUND($down_3/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_3 > 9)
      $down_3 = 9
   END_IF
   FOR($temp=$y2_char,(pxl($x2_char-ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_4)
   END_CYC
   $down_4 = ROUND($down_4/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_4 > 9)
      $down_4 = 9
   END_IF
   FOR($temp=$y2_char,(pxl($x2_char,$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_5)
   END_CYC
   $down_5 = ROUND($down_5/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_5 > 9)
      $down_5 = 9
   END_IF
   
   
   //   print($left_1," ",$left_2," ",$left_3," ",$left_4," ",$left_5)
   //   print($right_1," ",$right_2," ",$right_3," ",$right_4," ",$right_5)
   //   print($up_1," ",$up_2," ",$up_3," ",$up_4," ",$up_5)
   //   print($down_1," ",$down_2," ",$down_3," ",$down_4," ",$down_5)
   
   $shape_str=STRCONCAT($left_1,$left_2,$left_3,$left_4,$left_5,$right_1,$right_2,$right_3,$right_4,$right_5,$up_1,$up_2,$up_3,$up_4,$up_5,$down_1,$down_2,$down_3,$down_4,$down_5,"~")
   
   //print($shape_str)
   
END_SUB

////////////////////////////////////////////////////////////////////////////////
////////////////распознавание и обучение////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

SUB(reader,$shape,$n_char,$file_name_to_raspoznav)
   
   //   print("===>подпрогр reader")
   FOR($n_str=1,$n_str<TFCOUNT($file_name_to_raspoznav)+1)
      IF(STRPOS (TFREAD ($file_name_to_raspoznav,$n_str), $shape) > 0)
         $t_char = STRCUT(TFREAD ($file_name_to_raspoznav,$n_str), 1, STRPOS(TFREAD($file_name_to_raspoznav,$n_str),":~")-1)
         //         print("символ: ", $t_char)
         strfilter($t_char, "*", 0 )
         $all_str = STRCONCAT ($all_str,$t_char)
         $n_str=TFCOUNT($file_name_to_raspoznav)+1
         $check=0
      else
         $check=1
      END_IF
   END_CYC
   
   IF($check=1)
      move(int(($x2_char_arr[$n_char]-$x1_char_arr[$n_char])/2)+$x1_char_arr[$n_char],$y2_char_arr[$n_char])
      $char_write = INPUTBOX(STRCONCAT("введи цифру под номером ",$n_char+1), "", 120)
      IF($char_write = "")
         if ($rezhim_obuchenia=1)
            print("cancel - полный останов")
            halt
         else
            print("cancel - цифру не распознали и не знаем, НО продолжаем")
            $uspeh_raspoznav=0
            $all_str = STRCONCAT (99,$all_str)
         end_if
      END_IF
      $all_str = STRCONCAT ($all_str,$char_write)
      $check=0    //////////////////
     
      FOR($n_str=1,$n_str<TFCOUNT($file_name_to_raspoznav)+1)
         IF(STRPOS (TFREAD ($file_name_to_raspoznav,$n_str), STRCONCAT($char_write,":~")) =1)
            TFWRITE ($file_name_to_raspoznav,STRCONCAT(TFREAD($file_name_to_raspoznav,$n_str),$shape))
            TFDELETE ($file_name_to_raspoznav,$n_str)
            $n_str=TFCOUNT($file_name_to_raspoznav)+1
            $check=0
         else
            $check=1
         END_IF
      END_CYC
      IF($check=1)
         TFWRITE ($file_name_to_raspoznav,STRCONCAT($char_write,":~",$shape))
      END_IF
   END_IF
   
END_SUB

/////////////////////////////////////////////////////////////////////////////////
//==============================================================================
// головная подпрограмма для распознавания                                ///////
/////////////////////////////////////////////////////////////////////////////////
IF(TFCOUNT("data_gorizont.ini") = 0)
   TFWRITE ("data_gorizont.ini"," ")
END_IF
IF(TFCOUNT("data_number_voisk.ini") = 0)
   TFWRITE ("data_number_voisk.ini"," ")
END_IF

UNDEFINE ($all_str)
$all_str = ""
UNDEFINE ($uspeh_raspoznav)
$uspeh_raspoznav = 1  // если $uspeh_raspoznav=0 то был сбой в распознавании

sub(raspoznav, $rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2,$file_name_to_raspoznav_vhod)
   
   UNDEFINE ($all_str)
   $all_str = ""
   UNDEFINE ($uspeh_raspoznav)
   $uspeh_raspoznav = 1  // если $uspeh_raspoznav=0 то был сбой в распознавании
   
   //   GETSCREEN()
   //   COLORMODE(6)
   //       SCREENSHOT(["my_analiz-Тестовый__6_до_"])
   
   //обязательная обработка изображения до двух цветов
   GETSCREEN($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2)
   COLORMODE(7, $rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2)
   
   //   print("координаты к распозн: ", $rasp_x1, " ", $rasp_y1, " ", $rasp_x2, " ", $rasp_y2)
   SCREENSHOTEX($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2, ["my_analiz_уровень_шахты_ИЛИ_цифры_- до обработки"])
   
   
   PXLREPLACE ($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2, 8355839, 8355711)
   PXLREPLACE ($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2, 8388607, 8355711)
   PXLREPLACE ($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2, 8388479, 8355711)
   PXLREPLACE ($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2, 11632561, 8355711)

   PXLREPLACE(234,80,234,100, -1, 8355711)      //это вручную для количества войск
   PXLREPLACE(200,100,234,100, -1, 8355711)
   PXLREPLACE(200,80,234,100, 16353673, 15724527)  //  синий
   PXLREPLACE(200,80,234,100, 14778337, 8355711)  //    розовый


   
   SCREENSHOTEX($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2, ["my_analiz_уровень_шахты_ИЛИ_цифры_- в рамках распознавания"])
   
 
   lines($rasp_x1,$rasp_y1,$rasp_x2,$rasp_y2)
   //   print("подпрогр Lines закончили, начинаем цикл")
   if ($uspeh_raspoznav=1)
      FOR($line=0,$line<arrsize($x1_line_arr))        // цикл можно убрать, т.к. все в одну строчку
         pos_size($x1_line_arr[$line],$y1_line_arr[$line],$x2_line_arr[$line],$y2_line_arr[$line])
         
         FOR($char=0,$char<arrsize($x1_char_arr))
            shape($x1_char_arr[$char],$y1_char_arr[$char],$x2_char_arr[$char],$y2_char_arr[$char])
            reader($shape_str,$char, $file_name_to_raspoznav_vhod)
         END_CYC
      END_CYC
   else
      $all_str = 0
   end_if
   
   if ($uspeh_raspoznav=0)
      $all_str = 0
   end_if
   
   //   print("итог распознавания в подпрогр= ", $all_str)
end_sub


////////////////////////////////////////////////////////////////////////////////
//        ОСНОВНАЯ ПРОГРАММА                                               /////
////////////////////////////////////////////////////////////////////////////////

print("--------------")
print("Начинаем фармить на поверхности")

//   параметры для распознавания
$char_color = 16777215   // цвет символов
$back_color = 8355711  //  цвет фона
$accur = 5       //точность  (1 - макс точность; рекомендуется =5)
$h_str = 7     //минимальная высота строки
         
 
....



потести.
Сейчас только обратил внимание, что в процитированном коде условие строки 9 должно выполняться всегда, т.к. идентично строке 2 ? У меня это соответственно строки 75 и 72
Title: Re: Анализ текста в окне
Post by: dramster on September 08, 2017, 10:38:56 PM
 примерно понял природу появления ошибки. тут дело в том, что в первую очередь сканируются строки (для определения количества  строк и их координат). $h_str  отсеивает строки, где они меньше той самой высоты. но, если в строке например пару символов и точка (из одного пиксела) и эта точка в одной линии по горизонту с остальными символами, то эта точка определится за символ. а так как высота ее 1 пиксель, то $y2_char-$y1_char = 0, и INT(($y2_char-$y1_char+1)/2) = 0.

простой способ решения - это проверка высоты каждого символа, и если она высотой в один пиксель, то можно прибавить единицу к $y2_char
Code: (clickermann) [Select]
FOR($i_char=0,$i_char<arrsize($x1_char_arr))
   SCANPXL ($pix_temp,$x1_char_arr[$i_char],$y1_line,$x2_char_arr[$i_char],$y2_line,$char_color)
   
   IF($pix_temp[arrsize($pix_temp)-1] - $pix_temp[1] = 0)
      arrpush($y1_char_arr,$pix_temp[1])
      arrpush($y2_char_arr,$pix_temp[arrsize($pix_temp)-1]+1)
   ELSE
      arrpush($y1_char_arr,$pix_temp[1])
      arrpush($y2_char_arr,$pix_temp[arrsize($pix_temp)-1])
   END_IF
         
   UNDEFINE ($pix_temp)
END_CYC
но в этом случае, точка также будет засчитана за символ, а это нам скорее всего не нужно. поэтому второй вариант - это проверка высоты символа непосредственно перед вызовам shape и reader. то есть
Code: (clickermann) [Select]
FOR($char=0,$char<arrsize($x1_char_arr))
     
   IF($y2_char_arr[$char]-$y1_char_arr[$char] > 0)
      shape($x1_char_arr[$char],$y1_char_arr[$char],$x2_char_arr[$char],$y2_char_arr[$char])
      reader($shape_str,$char, $file_name_to_raspoznav_vhod)
   END_IF
   
END_CYC



проверь, если не в этом дело, то будем думать дальше.

и 190 строка, убери ее int(($y2_char-$y1_char+1)/2), хз откуда она взялась  :D.


Title: Re: Анализ текста в окне
Post by: gsukhado on September 09, 2017, 06:43:52 PM
Тогда может быть вообще было бы правильней сравнивать с $h_str  ? Чтобы любые символы ниже минимальной высоты строки не учитывались?

Code: (clickermann) [Select]
FOR($char=0,$char<arrsize($x1_char_arr))
 
   IF($y2_char_arr[$char]-$y1_char_arr[$char] > ($h_str-1))
      shape($x1_char_arr[$char],$y1_char_arr[$char],$x2_char_arr[$char],$y2_char_arr[$char])
      reader($shape_str,$char, $file_name_to_raspoznav_vhod)
   END_IF
 
END_CYC
Title: Re: Анализ текста в окне
Post by: dramster on December 25, 2017, 07:40:13 AM
кликерманн разгадал капчу у себя же на оффсайте в гостевой книге !!! :D 

немного посидел, поковырял, оказалось не так уж и сложно  :D

https://youtu.be/xLf3Xsr8srM

я думаю код не стоит выкладывать, если кому нужно помочь с чем то похожим, будем рады посодействовать.
Title: Re: Анализ текста в окне
Post by: doomka on April 01, 2018, 03:37:04 AM
Всем доброй ночи! Имею два окна с числовыми данными в разных координатах. Скрипт выполняет один снимок в заданный промежуток времени и распознает по координатам окон ряд чисел. Есть ли возможность как то оптимизировать структуру скрипта, sub-ы уместить в один, возможно как то упростить... За основу взял скрипт распознания у Oraven за что ему большое спасибо! :D
Code: (Clickermann) [Select]
SUB(An1, $let, $pict)
   SCANPICTURE($ARR_SCAN, $x1t,$y1t, $x2t,$y2t, $pict, -1, 100)
   FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
      ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
      SWITCH($Let)
      CASE(".") // решение проблемы точки
         ARRPUSH($ARR_OUT, "..")
      DEFAULT
         ARRPUSH($ARR_OUT, $Let)
      END_SWITCH
   END_CYC
   UNDEFINE($ARR_SCAN)
END_SUB

SUB(An2, $let, $pict)
   SCANPICTURE($ARR_SCAN, $x1o,$y1o, $x2o,$y2o, $pict, -1, 100)
   FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
      ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
      SWITCH($Let)
      CASE(".") // решение проблемы точки
         ARRPUSH($ARR_OUT, "..")
      DEFAULT
         ARRPUSH($ARR_OUT, $Let)
      END_SWITCH
   END_CYC
   UNDEFINE($ARR_SCAN)
END_SUB

//--------
$x1t = 837 // координаты распознания для An1
$y1t = 324
$x2t = 870
$y2t = 342
//--------
$x1o = 543 // координаты распознания для An2
$y1o = 332
$x2o = 600
$y2o = 349
//--------
GETSCREEN (526, 174, 874, 527) // координаты основного снимка
COLORMODE(8)

An1("0","Pic\digit_0.bmp")
An1("1","Pic\digit_1.bmp")
An1("2","Pic\digit_2.bmp")
//...
$siz = ARRSIZE($ARR_OUT)
$srtcheck = 0
$srt = 0
FOR($a=$siz-2,($a>0)&($srt=0),-2)
   FOR($b=0,$b<$a,2)
      IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
         $srtcheck = 1
         $tmp = $ARR_OUT[$b]
         $tmp2 = $ARR_OUT[$b+1]
         $ARR_OUT[$b] = $ARR_OUT[$b+2]
         $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
         $ARR_OUT[$b+2] = $tmp
         $ARR_OUT[$b+3] = $tmp2
      END_IF
   END_CYC
   IF($srtcheck = 0)
      $srt = 1
   END_IF
END_CYC

$str = ""
FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
   IF(STRLEN($str) > 0)
      $str = STRREPLACE(STRCONCAT($str, $ARR_OUT[$a+1]), "..", ".")
   ELSE
      $str = STRREPLACE($ARR_OUT[$a+1], "..", ".")
   END_IF
END_CYC
UNDEFINE($ARR_OUT)

An2("0","Pic2\digit_0_1.bmp")
An2("1","Pic2\digit_1_1.bmp")
An2("2","Pic2\digit_2_1.bmp")
//...
$siz = ARRSIZE($ARR_OUT)
$srt2check = 0
$srt2 = 0

FOR($a=$siz-2,($a>0)&($srt2=0),-2)
   FOR($b=0,$b<$a,2)
      IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
         $srt2check = 1
         $tmp = $ARR_OUT[$b]
         $tmp2 = $ARR_OUT[$b+1]
         $ARR_OUT[$b] = $ARR_OUT[$b+2]
         $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
         $ARR_OUT[$b+2] = $tmp
         $ARR_OUT[$b+3] = $tmp2
      END_IF
   END_CYC
   IF($srt2check = 0)
      $srt2 = 1
   END_IF
END_CYC

$str2 = ""
FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
   IF(STRLEN($str2) > 0)
      $str2 = STRREPLACE(STRCONCAT($str2, $ARR_OUT[$a+1]), "..", ".")
   ELSE
      $str2 = STRREPLACE($ARR_OUT[$a+1], "..", ".")
   END_IF
END_CYC
UNDEFINE($ARR_OUT)
//--------------------------------------------------------------

Print ($str, $str2)

//waitms (250)
Halt
 
Title: Re: Анализ текста в окне
Post by: Oraven on April 01, 2018, 07:27:59 AM
Всем доброй ночи! Имею два окна с числовыми данными в разных координатах. Скрипт выполняет один снимок в заданный промежуток времени и распознает по координатам окон ряд чисел. Есть ли возможность как то оптимизировать структуру скрипта, sub-ы уместить в один, возможно как то упростить...

Почему зона снимка не соответствует зонам поиска?

Оптимизированный вариант
Code: (clickermann) [Select]
SUB(Search, $let, $pict, $x1,$y1, $x2,$y2)
   SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, $pict, -1, 100)
   FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
      ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
      SWITCH($Let)
      CASE(".") // решение проблемы точки
         ARRPUSH($ARR_OUT, "..")
      DEFAULT
         ARRPUSH($ARR_OUT, $Let)
      END_SWITCH
   END_CYC
   UNDEFINE($ARR_SCAN)
END_SUB

SUB(Recognize)
   $siz = ARRSIZE($ARR_OUT)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-2,($a>0)&($srt=0),-2)
      FOR($b=0,$b<$a,2)
         IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
            $srtcheck = 1
            $tmp = $ARR_OUT[$b]
            $tmp2 = $ARR_OUT[$b+1]
            $ARR_OUT[$b] = $ARR_OUT[$b+2]
            $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
            $ARR_OUT[$b+2] = $tmp
            $ARR_OUT[$b+3] = $tmp2
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   
   $str = ""
   FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
      IF(STRLEN($str) > 0)
         $str = STRREPLACE(STRCONCAT($str, $ARR_OUT[$a+1]), "..", ".")
      ELSE
         $str = STRREPLACE($ARR_OUT[$a+1], "..", ".")
      END_IF
   END_CYC
   UNDEFINE($ARR_OUT)
END_SUB

//=============================================

GETSCREEN
COLORMODE(8)

Search("0","Pic\digit_0.bmp",837,324, 870,342)
Search("1","Pic\digit_1.bmp",837,324, 870,342)
Search("2","Pic\digit_2.bmp",837,324, 870,342)
Recognize()
$str1 = $str

Search("0","Pic2\digit_0_1.bmp",543,332, 600,349)
Search("1","Pic2\digit_1_1.bmp",543,332, 600,349)
Search("2","Pic2\digit_2_1.bmp",543,332, 600,349)
Recognize()
$str2 = $str

Print ($str1, " ", $str2)

//waitms (250)
Halt
Title: Re: Анализ текста в окне
Post by: doomka on April 01, 2018, 01:45:25 PM
Спасибо большое Oraven. Зона снимка делалась с запасом для первого окна с числовыми данными, так как оно перемещается по Y. Соответственно для получения координат этого окна, скрипту для начала приходится искать привязку по пикселю. Примерно так:

Code: (Clickermann) [Select]
GETSCREEN (526, 174, 874, 527) // Область снимка с окнами
  IF_PIXEL_IN (527, 175, 527, 520, 16777215) // Поиск привязки к первому окну
   $x1a = $_return1 + 42   // Получаем координаты первого окна
   $y1a = $_return2 - 10
   $x2a = $_return1 + 80
   $y2a = $_return2 + 10
  END_IF
COLORMODE(8)
 
Search("0","Pic\digit_0.bmp",$x1a,$y1a, $x2a,$y2a)
Search("1","Pic\digit_1.bmp",$x1a,$y1a, $x2a,$y2a)
Search("2","Pic\digit_2.bmp",$x1a,$y1a, $x2a,$y2a)
Recognize()
$str1 = $str

Search("0","Pic2\digit_0_1.bmp",837,324,870,342)
Search("1","Pic2\digit_1_1.bmp",837,324,870,342)
Search("2","Pic2\digit_2_1.bmp",837,324,870,342)
Recognize()
$str2 = $str
 
Print ($str1, " ", $str2)
 
//waitms (250)
Halt
Title: Re: Анализ текста в окне
Post by: Oraven on April 01, 2018, 04:13:35 PM
Спасибо большое Oraven. Зона снимка делалась с запасом для первого окна с числовыми данными, так как оно перемещается по Y. Соответственно для получения координат этого окна, скрипту для начала приходится искать привязку по пикселю.

Ограничивать зону снимка имеет смысл только в том случаи если этот снимок делается с минимальными задержками. Это уменьшит нагрузку на процессор, особенно на высоком разрешении экрана.
В твоем случаи это лишние заморочки, пиши просто GETSCREEN.
Title: Re: Анализ текста в окне
Post by: doomka on July 22, 2018, 11:36:11 PM
Вечер добрый! Oraven при переходе на  новую версию кликера 4.13 ваш скрипт перестал распознавать нули, все остальные цифры без проблем, а нули ни как. Запускаю 4.12 все ок.
Взгляните если не сложно.
Title: Re: Анализ текста в окне
Post by: Oraven on July 23, 2018, 08:12:21 AM
Все прекрасно распознает. Только вот условие при сравнении точки с нулем выдает равенство.
Добавил расчет хеш суммы строки, теперь работает верно.

Code: (clickermann) [Select]
SUB(Search, $let, $pict, $x1,$y1, $x2,$y2)
   SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, $pict, -1, 100)
   FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
      ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
      IF(STRMD5(".") = STRMD5($Let))
         ARRPUSH($ARR_OUT, "..")
      ELSE
         ARRPUSH($ARR_OUT, $Let)
      END_IF
   END_CYC
   UNDEFINE($ARR_SCAN)
END_SUB
Title: Re: Анализ текста в окне
Post by: Burninhell on December 04, 2018, 12:03:42 PM
Ребят, привет всем. Спасибо за скрипт, поковырялся в нем и вроде все заработало, но с оговоркой.

Числа без повторных знаков (123 или 45631) распознает точно. А вот если есть повторы (11223344 или 33333) то ответ программы не корректный. Как правило одна или несколько повторяющихся цифр обрезаются. 11223344 превращается в 1234, а 222222 в 222.

Code: (clickermann) [Select]
#name "Распознавание чисел"
// Author: Vint
// Version: 1.5 (28.05.2015)
// Скрипт для Clickermann v4.11 002

// подключение number_read
// #include "Распознавание чисел 1.5.cms"





//========================
SUB(sort_arr)  // сортируем $data по возрастанию X
   $data_size = ARRSIZE($data)
   FOR($out=0, $out < $data_size, 2)
      $min = $data[$out]
      $ind = $out
     
      FOR($in=($out+2), $in < $data_size, 2)
         IF($data[$in] < $min)
            $min = $data[$in]
            $ind = $in
         END_IF
      END_CYC
      LOGWRITE("минимум: ", $min, "  ", $ind, " - ", $out)
      $X =  $data[$ind]
      $Y =  $data[$ind+1]
     
      $data[$ind] = $data[$out]
      $data[$ind+1] = $data[$out+1]
      $data[$out] = $X
      $data[$out+1] = $Y
     
      LOGWRITE($X, " / ", $Y)
      WAITMS(20)
   END_CYC
END_SUB
//========================
//========================
SUB(number_read, $f_x1,$f_y1,$f_x2,$f_y2, $pref, $c_mode)
// $f_x1, $f_y1 область ЛевоВерх
// $f_x2, $f_y2 область ПравоНиз
// $pref = "textures\digit_" префикс имён файлов с цифрами (для разных шрифтов)
// $c_mode - режим COLORMODE
   
// Результат возвращается в $res если не найдено $res=-1
   
   
   $res = -1 // очищаем ответ
   UNDEFINE($data) // главный массив данных
   UNDEFINE($a_scan) // временный массив для SCANPICTURE
   $SHIFT_X = 15 // смещение (кол-во игнор пикселов вокруг найденного)
   $SHIFT_Y = 15
   
   GETSCREEN
   IF($c_mode > 0)
      COLORMODE($c_mode, $f_x1,$f_y1,$f_x2,$f_y2)
   END_IF
   FOR ($i=0, $i < 11)
      SWITCH($i)
      CASE(0)
         $pr = 95
      CASE(1)
         $pr = 99
      CASE(2)
         $pr = 95
      CASE(3)
         $pr = 93
      CASE(4)
         $pr = 95
      CASE(5)
         $pr = 95
      CASE(6)
         $pr = 95
      CASE(7)
         $pr = 95
      CASE(8)
         $pr = 94
      CASE(9)
         $pr = 95
      DEFAULT
         $pr = 100
      END_SWITCH
     
      SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"), -1, $pr)
     
      // заносим 'X,цифра' в $num с учётом мёртвых зон
      $a_scansize = ARRSIZE($a_scan)
      IF($log0 = 1)
         LOGWRITE ("Ищем картинку ", $i, "  найдено ", $a_scansize/2)
      END_IF
     
      FOR($j=0, $j < $a_scansize, 2)
         $X = $a_scan[$j]
         $Y = $a_scan[$j+1]
         
         // проверяем мёртвые зоны
         $dead_zone = 0
         $dead_size = ARRSIZE($dead)
         FOR($m=0, $m < $dead_size, 2)
            $X_old = $dead[$m]
            $Y_old = $dead[$m+1]
            IF($log0 = 1)
               LOGWRITE ("$X/$X_old = ", $X, " / ", $X_old)
               LOGWRITE ("$X/$Y = ", $X, " / ", $Y, "   ABS ", ABS($X - $X_old))
            END_IF
            IF((($Y - $Y_old) < $SHIFT_Y+1) & (ABS($X - $X_old) < $SHIFT_X+1))
               $dead_zone = 1
               $m = $dead_size + 5
            END_IF
         END_CYC
         
         IF($log0 = 1)
            LOGWRITE ("$dead_zone = ", $dead_zone)
            LOGWRITE ("$dead_size = ", $dead_size)
         END_IF
         IF($dead_zone = 0)
            ARRPUSH($dead, $X)
            ARRPUSH($dead, $Y)
            ARRPUSH($data, $X)
            ARRPUSH($data, $i)
            IF($log0 = 1)
               LOGWRITE ("добавляем ", $i, " $X/$Y = ", $X, " / ", $Y)
            END_IF
         END_IF
      END_CYC
      IF($log0 = 1)
         LOGWRITE ("после добавления ", $i, " всего ", ARRSIZE($data)/2)
         LOGWRITE (" ")
      END_IF
      UNDEFINE($dead)
      UNDEFINE($a_scan)
   END_CYC
   
   $data_size = ARRSIZE($data)
   IF($data_size > 0)
      sort_arr()
      IF($log0 = 1)
         LOGWRITE ("цифр после сортировки ", ARRSIZE($data)/2)
      END_IF
     
      FOR($i=1, $i < $data_size, 2)
         IF($res = -1)
            $res = STRCONCAT("", $data[$i])   // если первыё символ
         ELSE
            IF($data[$i] < 10)
               $res = STRCONCAT($res, $data[$i]) // последующие символы цифры
            ELSE
               $res = STRCONCAT($res, ".") // последующие символы  зпт
            END_IF
         END_IF
      END_CYC
      //$res = ROUND($res, -8)
   ELSE
      LOGWRITE ("число не найдено")
   END_IF
END_SUB

//==============================================================================3


$log = 1
$log0 = 1
number_read(715,623,811,637,"textures\ro_",0)
LOGWRITE ("Найдено число:  ",$res)
HALT


Во вложении текстуры (архив) и пара готовых файлов с примером. Помогите, пожалуйста, разобраться в чем дело.


UDP:
Вот я баран. Надо было всего то размер мертвых зон убрать.
               $dead_zone = 0
               $m = $dead_size + 0

Title: Re: Анализ текста в окне
Post by: Vint on December 04, 2018, 12:41:30 PM
UDP:
Вот я баран. Надо было всего то размер мертвых зон убрать.
               $dead_zone = 0
               $m = $dead_size + 0
Да, только не там.
Нужно всего лишь уменьшить до 3 или до 0 (если поиск без процентов) в 53 строке
Code: (clickermann) [Select]
$SHIFT_X = 15
Там размер зоны задаётся. А то вырывать с мясом не очень.
Title: Re: Анализ текста в окне
Post by: Burninhell on December 04, 2018, 02:27:23 PM
Спасибо, сделаю, как Вы посоветовали. С разбором картинок разобрался.
Осталось избавиться в остальном клике от "кликов по координатам", нужно что бы гетскрин находил нужную область, где бы она не появлялась в пределах активного окна.
Title: Re: Анализ текста в окне
Post by: Vov4ik on July 02, 2019, 02:38:09 AM
Доброго времени суток. Я только недавно начал пользоваться кликером, написал не большой скрипт, но он очень уж примитивный и не всегда работает как надо!( Хотел попросить совета, как возможно лучше реализовать мою задумку.
Задача скрипта, поиск числа в определенном столбце(столбец может менять расположение), но над ним всегда есть текст, думаю к нему привяжусь и буду так задавать область поиска. Все это дело в браузере работает.
В этом столбце есть числа, нужно что бы скрипт понимал, когда там появится число более 40(Числа рандомные, обычно с 1-2 знаками после запятой, но не превышают 120) как только появится число более 40 выполнял команду.
Большой проблемой для меня кажется именно поиск числа. Не знаю, как вообще лучше реализовать.
Title: Re: Анализ текста в окне
Post by: Vov4ik on July 02, 2019, 02:42:34 AM
Уже думал о самом примитивном, что бы кликер выделял первое число из столбца, копировал его и проверял больше 40 или нет. Забыл упомянуть, число всегда первое в столбце.
Title: Re: Анализ текста в окне
Post by: Атеист on July 02, 2019, 10:32:30 PM
... написал не большой скрипт, но он очень уж примитивный и не всегда работает как надо!( Хотел попросить совета, как возможно лучше реализовать мою задумку.

Реализовать лучше, чем как?

Все это дело в браузере работает.

Адрес веб-страницы секретный?

Большой проблемой для меня кажется именно поиск числа. Не знаю, как вообще лучше реализовать.

А как выглядят эти числа? Маленькие, чёрненькие такие, или большие красные?
Title: Re: Анализ текста в окне
Post by: ALex222333 on October 12, 2020, 09:02:48 PM
Как картинки правильно нарезать??? Через paint не получается, посоветуйте чем можно сделать
Title: Re: Анализ текста в окне
Post by: Иллидан on August 23, 2021, 04:46:11 PM
Как картинки правильно нарезать??? Через paint не получается, посоветуйте чем можно сделать
я через paint.net сё режу, удобная имба+сам определяет разрядность картинки при сохранении, шо определяет выходной вес файла, если галку оставить)

тересна, а нереально ли до сих пор, сделать универсальное распознавание символов, по их скелету толщиной в 1 пиксель, по какимнить точкам как карандашом на бумаге типа лассо, где любое искажение не будет мешать распознаванию скелета символа и определения его к цыфре, ато и разные шрифты будут тогда не помехой скану, скелет то у всех символов один и тот же по итогу в 1 пиксель?)
Title: Re: Анализ текста в окне
Post by: Hito on March 24, 2022, 09:28:49 AM
Я тут вопрос с серьезной капчей решал и мне такая идея в голову пришла, что я аж обалдел. А нафига мы решали - каким образом отправлять картинку в какой-нибудь месенджер...? Устанавливаешь тот же яндекс-диск на комп и мутишь одну общую (с ним) папку на компе. Все капчи, какие выскакивают, сохраняешь кликером в эту папку и в чат пусть кликер пишет, что мол - капча появилась. На телефон свой ставишь яндекс-диск и фходишь в нем в акк, через который с ним работает кликер. У тебя на телефоне - тилинь-тилинь - "капча появилась". Ты открываешь папку яндекс-диска и смотришь капчу и ответ посылаешь кликеру через чат.
Title: Re: Анализ текста в окне
Post by: dramster on March 24, 2022, 07:05:17 PM
А ты попробуй, у меня такая идея была... возможно даже не у меня, на форуме ктото возможно писал. Я точно помню, что пытался реализовать. И точно помню, что в чем то был затык. Если не ошибаюсь, что-то с параметром пути к этой папке не работало. Но возможно я и не с общей папкой работал, а с сетевым диском... не помню точно. Но дело было.

Если затык тот что я описал, то все равно можно же через проводник, кнопашками. Попробуй.
Title: Re: Анализ текста в окне
Post by: Hito on March 24, 2022, 08:27:13 PM
А ты попробуй, у меня такая идея была... возможно даже не у меня, на форуме ктото возможно писал. Я точно помню, что пытался реализовать. И точно помню, что в чем то был затык. Если не ошибаюсь, что-то с параметром пути к этой папке не работало. Но возможно я и не с общей папкой работал, а с сетевым диском... не помню точно. Но дело было.

Если затык тот что я описал, то все равно можно же через проводник, кнопашками. Попробуй.

У меня даже из виртуалки все получилось )) Без каких-либо затыков )) Скрин на телефоне через 3-5 сек ))
Title: Re: Анализ текста в окне
Post by: dramster on March 24, 2022, 11:00:59 PM
Круто. А ты именно через через общую папку с установкой ядиска? Потому-что я тогда скорее всего на сетевой диск мутил, который привязывал к ядиску. А к сетевому диску как таковой путь почему-то не работал. Вернее работал, но файл перенаправлялся куда-то на локальный диск, в какую-то непонятную директорию. Я и кинул, не сильно и нужно было.
Title: Re: Анализ текста в окне
Post by: Hito on March 24, 2022, 11:45:17 PM
Круто. А ты именно через через общую папку с установкой ядиска? Потому-что я тогда скорее всего на сетевой диск мутил, который привязывал к ядиску. А к сетевому диску как таковой путь почему-то не работал. Вернее работал, но файл перенаправлялся куда-то на локальный диск, в какую-то непонятную директорию. Я и кинул, не сильно и нужно было.
Из виртуалки вот так путь к папке выглядит - C:\Users\Hito\YandexDisk\bmp Это папка такая - "bmp", уже на яндекс-диске.
Скрипт у меня в эту папку скидывает вот так:
Code: (clickermann) [Select]
SCREENSHOTFIX($x1cap,$y1cap, $x2cap,$y2cap, STRCONCAT("C:\Users\Hito\YandexDisk\bmp\",$log_name,"   ",$count,".bmp"), 0)
Title: Re: Анализ текста в окне
Post by: dramster on March 24, 2022, 11:49:10 PM
Ну понятно, но нужно еще приложение ядиск ставить? Я просто даже и не знал что оно есть, вернее не заострял на этом внимания.
Title: Re: Анализ текста в окне
Post by: Hito on March 25, 2022, 07:54:15 AM
Ну понятно, но нужно еще приложение ядиск ставить? Я просто даже и не знал что оно есть, вернее не заострял на этом внимания.
Без этого никак. И на комп ставить, и на телефон. И чтоб работало с одним и тем же акком.
Title: Re: Анализ текста в окне
Post by: Hito on March 25, 2022, 08:02:46 AM
И точно помню, что в чем то был затык.

Я вспомнил один затык. Если постоянно периодически сохронять файлы, то на другом конце они не прогружаются, пока не закончится сохранение. Но у меня, например, в скрипте стоит проверка на существование файла с хешем капчи. И если нет такого файла, то сохроняет. И капчи норм приходят на мобильник.
Title: Re: Анализ текста в окне
Post by: dramster on March 25, 2022, 12:49:26 PM
Решил попробовать с общей папкой для сетевого диска с яндексом. Сетевой диск создается в пять кликов, и не нужны никакие приложения (если для капчи, то на телефоне конечно нужно). И только потом вспомнил, что такое "общий доступ" для папок в винде, а ты наверно все это мутишь из виртуальной машины, там "общая папка", я подумал про папку с общим доступом для локальной сети  ;D . Да и пофиг, раз решил проверить, проверяю... и, для папок из сетевого диска вообще в свойствах нет такой опции, как "общий доступ"  :-\ .

А вот и тот затык, что не дал кликеру сохранить ничего на диск. Как видно, путь верный, а у кликера ошибка  :-\
(https://i.imgur.com/jxEYtMN.png)
Title: Re: Анализ текста в окне
Post by: dramster on March 25, 2022, 01:36:11 PM
Хех, все оказалось проще  :D. Копируем наш кликерман на яндекс диск (сетевой на пк), и прямо оттуда запускаем, все работает, картинки там же.
А нужно мне тогда это была как раз для удаленного наблюдения за работой скрипта, логи там, и скрины посмотреть ну и остальное, можно управлять как нибудь.
Title: Re: Анализ текста в окне
Post by: Vint on March 25, 2022, 02:33:56 PM
А вот и тот затык, что не дал кликеру сохранить ничего на диск. Как видно, путь верный, а у кликера ошибка  :-\

Всё работает и с сетевым и с виртуальным диском для папки
Z:  - сетевой
Y: - виртуальный для папки, созданный с помощью subst Y: D:\YandexDisk

(https://i.ibb.co/2yrNh8q/2022-03-25-14-30-06.png) (https://ibb.co/xDbHLmh)

Проверял на версиях 4.13.14x32 и 4.14.003bx32, да и раньше проблем никогда не было, часто использовал виртуальные диски
Title: Re: Анализ текста в окне
Post by: dramster on March 25, 2022, 03:31:57 PM
Так а с сетевым с подключенным яндекс диском? У тебя это из лакальной сети.
https://zen.yandex.ru/media/sd1117/podkliuchaem-iandeks-disk-kak-setevoi-nakopitel-v-provodnike-widows-kratkaia-instrukciia-v-kartinkah-5fb1188b70f5da1bdace9e94

Не знаю обязательно ли создавать пароль для приложения диска, раньше этого не требовалось, хватало ввести почту и пароль от нее.
Title: Re: Анализ текста в окне
Post by: Vint on March 25, 2022, 04:35:34 PM
Так а с сетевым с подключенным яндекс диском? У тебя это из лакальной сети.

А, ты по Webdav. С ним я очень давно баловался. Сейчас у меня везде через приложение, так удобней. И по Webdav ограничение на передаваемые файлы в 250 Мб, что ни о чём для меня.

Но подключил, попробовал, всё сработало.

Code: (clickermann) [Select]
GETSCREEN
SCREENSHOTFIX(200,200, 400,400, "Y:\screen.bmp", 0)
HALT
(https://i.ibb.co/xJf3L4c/2022-03-25-16-36-09.png) (https://ibb.co/9sVGgMf)
Title: Re: Анализ текста в окне
Post by: dramster on March 25, 2022, 08:13:04 PM
Но подключил, попробовал, всё сработало.

:-\ значит у меня косяк в винде какой-то, да и фиг с ним. Я даже и не помню когда это мне надо было, про приложение даже и мысли не было тогда. Попробовал, не работает, немного повтыкал и бросил.
Title: Re: Анализ текста в окне
Post by: Hito on March 25, 2022, 11:25:30 PM
Решил попробовать с общей папкой для сетевого диска с яндексом. Сетевой диск создается в пять кликов, и не нужны никакие приложения (если для капчи, то на телефоне конечно нужно). И только потом вспомнил, что такое "общий доступ" для папок в винде, а ты наверно все это мутишь из виртуальной машины, там "общая папка", я подумал про папку с общим доступом для локальной сети  ;D . Да и пофиг, раз решил проверить, проверяю... и, для папок из сетевого диска вообще в свойствах нет такой опции, как "общий доступ"  :-\ .

А вот и тот затык, что не дал кликеру сохранить ничего на диск. Как видно, путь верный, а у кликера ошибка  :-\
(https://i.imgur.com/jxEYtMN.png)

У тебя какой-то путь странный... Что за - яндекс диск (Т:)?

(https://sun9-82.userapi.com/impf/uAMypBeHTv9vjkl1LGsw0JFsDKW9I0c1wi4nhg/nEdqKLN4Fvg.jpg?size=399x209&quality=95&sign=fd85989de2ebb3b746de20573ee23cd8&type=album)
Title: Re: Анализ текста в окне
Post by: doushy on May 07, 2022, 03:55:35 AM
очень много времени прошло, но надеюсь ещё остались кто поможет.

у меня только такой вариант работает. И проблема именно в том, что когда у меня чисто например 30543, то он показывает 3. если 29000, покажет 29, а на числа 23456 - всё нормально, то есть на 0, он не работает, вернее он умножает на 0 и порядок  пропускается получается...
Code: (clickermann) [Select]
#name "Распознавание чисел"
// Author: Vint
// Version: 1.1 (30.01.2013)
// Результат возвращается в $res если не найдено $res=-1
// Только целые числа. Максимум 10 разрядов. Расположение цифр равномерное.
// Вариант скрипта с последовательным перебором разрядов
// Хотел обойтись без текстовых файлов, только переменные
 
 
//====== переменные которые задаются 1 раз если всего один шрифт ====
//если в скрипте будет искаться несколько наборов шрифтов, то задавать каждый раз при вызове
$sdvig=10 // сдвиг, чуть меньше чем ширина 1 цифры с отступом
$pref="textures\digitt_" // префикс имён файлов с цифрами
 
 
//====== переменные которые задаются при вызове поиска ====
//если место поиска всего одно, задавать только один раз
$field_x1=497 // поле под число, координата X1
$field_y1=1008 // поле под число, координата y1
$field_x2=615 // поле под число, координата X2
$field_y2=1035 // поле под число, координата y2


//====== внутренние переменные  ====
$razr_max=0 // максимальная разрядность числа
$xmin=5000
$res=-1 // очищаем результат
$i=0                // очищаем результат
 
 

 
//================== начало ====================================================
FOR ($obhod, $obhod<10) // очищаем результат
   GOSUB(sdvig_razryada)
END_CYC
 
GETSCREEN($field_x1,$field_y1,$field_x2,$field_y2)

COLORMODE(7)

SCREENSHOT

FOR ($i, $i<10) // ищем самую левую цифру
   IF_PICTURE_IN ($field_x1,$field_y1,$field_x2,$field_y2, STRCONCAT($pref,$i,".bmp"),-1,80)
//LOGWRITE (STRCONCAT($pref,$i,".bmp"))
      IF($_return1<$xmin)
         $xmin=$_return1
         INC($razr_max)
         $res1=$i
         IF($res1=10) // учитываем что 10-я картинка это 0
            $res1=0
           
           
         END_IF
      END_IF
   END_IF
END_CYC
IF($xmin=5000)
   LOGWRITE ("число не найдено")
   GOTO(endfindnumber)
END_IF
 
$field_x1=$xmin+$sdvig
$perebor=1
WHILE($perebor>0)
   $razr_temp=$razr_max
   FOR ($i,$i<11)
      IF_PICTURE_IN ($field_x1,$field_y1,$field_x1+INT($sdvig*1.3),$field_y2, STRCONCAT($pref,$i,".bmp"),-1,90)
         $field_x1=$_return1+$sdvig
         IF($i<11)
            INC($razr_max)
            GOSUB(sdvig_razryada)
            IF($res1=10) // учитываем что 10-я картинка это 0
               $res1=1
            END_IF
           
         END_IF
         IF($i=11) // проверка если нашли маркер конца ...11.bmp, то конец
            $perebor=0
         END_IF
         $i=11              // выходим из цикла
      END_IF
   END_CYC
   IF(($razr_temp=$razr_max) | ($razr_max=10)) // проверка если не нашли или уже 10 разрядов, то конец
      $perebor=0
   END_IF
END_CYC
 
// подсчитываем
$res=$res1+$res2*10+$res3*100+$res4*1000+$res5*10000+$res6*100000+$res7*1000000+$res8*10000000+$res9*100000000+$res10*1000000000
LOGWRITE ("res1:  ",$res1)
LOGWRITE ("res2:  ",$res2)
LOGWRITE ("res3:  ",$res3)
LOGWRITE ("res4:  ",$res4)
LOGWRITE ("res5:  ",$res5)
LOGWRITE ("res6:  ",$res6)
LOGWRITE ("res7:  ",$res7)
LOGWRITE ("res8:  ",$res8)
LOGWRITE ("res9:  ",$res9)
LOGWRITE ("res10:  ",$res10)


LOGWRITE (STRCONCAT($res1,$res2,$res3,$res4,$res5,$res6,$res7,$res8,$res9,$res10,))



endfindnumber:

LOGWRITE ("Найдено число:  ",$res)
HINTPOPUP("Найдено число:  ",$res)
HALT
 
 
//==============================================================================
SUB(sdvig_razryada)
   $res10=$res9
   $res9=$res8
   $res8=$res7
   $res7=$res6
   $res6=$res5
   $res5=$res4
   $res4=$res3
   $res3=$res2
   $res2=$res1
   $res1=$i
END_SUB
//==============================================================================
Title: Re: Кто сомневается, что Доктор Vint поможет - будет у Hito лечиться огурцом!
Post by: Иван_Васильевич on May 07, 2022, 07:16:02 AM

 Испанский Стыд!
 Зачем плодить сущности и мучать старинные версии скрипта?
 Для вас, уважаемый автор новые версии выложил давным-давно, а вы // Version: 1.1 (30.01.2013)
 вместо Распознавание чисел 1.5.cms, с маниакальным упорством юзаете. :o
Title: Re: Анализ текста в окне
Post by: doushy on May 07, 2022, 12:30:17 PM

 Испанский Стыд!
 Зачем плодить сущности и мучать старинные версии скрипта?
 Для вас, уважаемый автор новые версии выложил давным-давно, а вы // Version: 1.1 (30.01.2013)
 вместо Распознавание чисел 1.5.cms, с маниакальным упорством юзаете. :o

я бы с радостью, но другие версии у меня не работают, я не понимаю почему...
у меня вообще не ищет
Title: Re: Анализ текста в окне
Post by: Иван_Васильевич on May 07, 2022, 03:23:05 PM

 Испанский Стыд!
 Зачем плодить сущности и мучать старинные версии скрипта?
 Для вас, уважаемый автор новые версии выложил давным-давно, а вы // Version: 1.1 (30.01.2013)
 вместо Распознавание чисел 1.5.cms, с маниакальным упорством юзаете. :o

я бы с радостью, но другие версии у меня не работают, я не понимаю почему...
у меня вообще не ищет
настройки скрипта, удобны и понятны во всех версиях, проверьте правильность и полноту их заполнения своими данными.
 в вашем случае, я бы на вот это обратил внимание
$sdvig=10                  // сдвиг, чуть меньше чем ширина 1 цифры с отступом
$pref="textures\digitt_"               // префикс имён файлов с цифрами
 если не находит картинки, но не ругается на их отсутствие, то сдвиг подбирайте исходя из размеров шрифта.
 можете образцы картинок выложить и скриншот для проверки их находимости.
 вероятно ноль в вашем случае находится там где его нет.
 IF_PICTURE_IN ($field_x1,$field_y1,$field_x2,$field_y2, STRCONCAT($pref,$i,".bmp"),-1,80)
  % совпадения, всего для одной цифры это очень низкое значение.
 и переходите на последнюю версию, её большинство пользователей успешно использует, да и описание  в теме перечитайте,.
 Можно картинки цифр  повторно сохранить, увеличить оба варианта и поискать в них разницу, чтоб процент совпадения увеличить.  Или с эмулятора  ваши картинки будут или перекодируете в процессе сохранения. 8)
 нужно смотреть. :o
Title: Re: Анализ текста в окне
Post by: doushy on May 07, 2022, 03:33:51 PM
Я сейчас на новой версии пытаюсь, но у меня вообще не ищется...хотя на старой версии всё работает.
0.8 мне хватает. я сразу под игру пишу.
и опять же повторюсь, работает на старой версии, соответственно картинки рабочие, 0.8 - рабочий