Автор Тема: Анализ текста в окне  (Прочитано 37159 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3307
  • Котэ
    • Просмотр профиля
Re: Анализ текста в окне
« Ответ #150 : Апрель 01, 2018, 07:27:59 am »
Всем доброй ночи! Имею два окна с числовыми данными в разных координатах. Скрипт выполняет один снимок в заданный промежуток времени и распознает по координатам окон ряд чисел. Есть ли возможность как то оптимизировать структуру скрипта, sub-ы уместить в один, возможно как то упростить...

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

Оптимизированный вариант
Код: Clickermann
  1. SUB(Search, $let, $pict, $x1,$y1, $x2,$y2)
  2.   SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, $pict, -1, 100)
  3.   FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
  4.      ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
  5.      SWITCH($Let)
  6.      CASE(".") // решение проблемы точки
  7.         ARRPUSH($ARR_OUT, "..")
  8.      DEFAULT
  9.         ARRPUSH($ARR_OUT, $Let)
  10.      END_SWITCH
  11.   END_CYC
  12.   UNDEFINE($ARR_SCAN)
  13. END_SUB
  14.  
  15. SUB(Recognize)
  16.   $siz = ARRSIZE($ARR_OUT)
  17.   $srtcheck = 0
  18.   $srt = 0
  19.   FOR($a=$siz-2,($a>0)&($srt=0),-2)
  20.      FOR($b=0,$b<$a,2)
  21.         IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
  22.            $srtcheck = 1
  23.            $tmp = $ARR_OUT[$b]
  24.            $tmp2 = $ARR_OUT[$b+1]
  25.            $ARR_OUT[$b] = $ARR_OUT[$b+2]
  26.            $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
  27.            $ARR_OUT[$b+2] = $tmp
  28.            $ARR_OUT[$b+3] = $tmp2
  29.         END_IF
  30.      END_CYC
  31.      IF($srtcheck = 0)
  32.         $srt = 1
  33.      END_IF
  34.   END_CYC
  35.  
  36.   $str = ""
  37.   FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
  38.      IF(STRLEN($str) > 0)
  39.         $str = STRREPLACE(STRCONCAT($str, $ARR_OUT[$a+1]), "..", ".")
  40.      ELSE
  41.         $str = STRREPLACE($ARR_OUT[$a+1], "..", ".")
  42.      END_IF
  43.   END_CYC
  44.   UNDEFINE($ARR_OUT)
  45. END_SUB
  46.  
  47. //=============================================
  48.  
  49. GETSCREEN
  50. COLORMODE(8)
  51.  
  52. Search("0","Pic\digit_0.bmp",837,324, 870,342)
  53. Search("1","Pic\digit_1.bmp",837,324, 870,342)
  54. Search("2","Pic\digit_2.bmp",837,324, 870,342)
  55. Recognize()
  56. $str1 = $str
  57.  
  58. Search("0","Pic2\digit_0_1.bmp",543,332, 600,349)
  59. Search("1","Pic2\digit_1_1.bmp",543,332, 600,349)
  60. Search("2","Pic2\digit_2_1.bmp",543,332, 600,349)
  61. Recognize()
  62. $str2 = $str
  63.  
  64. Print ($str1, " ", $str2)
  65.  
  66. //waitms (250)
  67. Halt

doomka

  • Зашел в гости
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Анализ текста в окне
« Ответ #151 : Апрель 01, 2018, 01:45:25 pm »
Спасибо большое Oraven. Зона снимка делалась с запасом для первого окна с числовыми данными, так как оно перемещается по Y. Соответственно для получения координат этого окна, скрипту для начала приходится искать привязку по пикселю. Примерно так:

Код: Clickermann
  1. GETSCREEN (526, 174, 874, 527) // Область снимка с окнами
  2.  IF_PIXEL_IN (527, 175, 527, 520, 16777215) // Поиск привязки к первому окну
  3.   $x1a = $_return1 + 42   // Получаем координаты первого окна
  4.   $y1a = $_return2 - 10
  5.   $x2a = $_return1 + 80
  6.   $y2a = $_return2 + 10
  7.  END_IF
  8. COLORMODE(8)
  9.  
  10. Search("0","Pic\digit_0.bmp",$x1a,$y1a, $x2a,$y2a)
  11. Search("1","Pic\digit_1.bmp",$x1a,$y1a, $x2a,$y2a)
  12. Search("2","Pic\digit_2.bmp",$x1a,$y1a, $x2a,$y2a)
  13. Recognize()
  14. $str1 = $str
  15.  
  16. Search("0","Pic2\digit_0_1.bmp",837,324,870,342)
  17. Search("1","Pic2\digit_1_1.bmp",837,324,870,342)
  18. Search("2","Pic2\digit_2_1.bmp",837,324,870,342)
  19. Recognize()
  20. $str2 = $str
  21.  
  22. Print ($str1, " ", $str2)
  23.  
  24. //waitms (250)
  25. Halt
  26.  

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3307
  • Котэ
    • Просмотр профиля
Re: Анализ текста в окне
« Ответ #152 : Апрель 01, 2018, 04:13:35 pm »
Спасибо большое Oraven. Зона снимка делалась с запасом для первого окна с числовыми данными, так как оно перемещается по Y. Соответственно для получения координат этого окна, скрипту для начала приходится искать привязку по пикселю.

Ограничивать зону снимка имеет смысл только в том случаи если этот снимок делается с минимальными задержками. Это уменьшит нагрузку на процессор, особенно на высоком разрешении экрана.
В твоем случаи это лишние заморочки, пиши просто GETSCREEN.

doomka

  • Зашел в гости
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Анализ текста в окне
« Ответ #153 : Июль 22, 2018, 11:36:11 pm »
Вечер добрый! Oraven при переходе на  новую версию кликера 4.13 ваш скрипт перестал распознавать нули, все остальные цифры без проблем, а нули ни как. Запускаю 4.12 все ок.
Взгляните если не сложно.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3307
  • Котэ
    • Просмотр профиля
Re: Анализ текста в окне
« Ответ #154 : Июль 23, 2018, 08:12:21 am »
Все прекрасно распознает. Только вот условие при сравнении точки с нулем выдает равенство.
Добавил расчет хеш суммы строки, теперь работает верно.

Код: Clickermann
  1. SUB(Search, $let, $pict, $x1,$y1, $x2,$y2)
  2.   SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, $pict, -1, 100)
  3.   FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
  4.      ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
  5.      IF(STRMD5(".") = STRMD5($Let))
  6.         ARRPUSH($ARR_OUT, "..")
  7.      ELSE
  8.         ARRPUSH($ARR_OUT, $Let)
  9.      END_IF
  10.   END_CYC
  11.   UNDEFINE($ARR_SCAN)
  12. END_SUB

Nata_

  • Зашел в гости
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: Анализ текста в окне
« Ответ #155 : Октябрь 06, 2018, 08:21:00 am »
Ребята привет. Вижу вы обсуждаете тему, по которой мне нужна помощь. Можете помочь с распознавании чисел в игре онлайн? Для того чтобы подать заявку на бой надо прописать любое  число ( 0001 до 9999), которое там каждый раз предлагают ( при каждой новой заявке в бой число меняется) Я полнейшая нубка в скриптах, разве что могу поставить, координаты и задержку, а с распознавание чисел для меня это фантастика ;D Помогите пжлст. :)
« Последнее редактирование: Октябрь 06, 2018, 08:28:50 am от Nata_ »

Burninhell

  • Зашел в гости
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Анализ текста в окне
« Ответ #156 : Декабрь 04, 2018, 12:03:42 pm »
Ребят, привет всем. Спасибо за скрипт, поковырялся в нем и вроде все заработало, но с оговоркой.

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

Код: Clickermann
  1. #name "Распознавание чисел"
  2. // Author: Vint
  3. // Version: 1.5 (28.05.2015)
  4. // Скрипт для Clickermann v4.11 002
  5.  
  6. // подключение number_read
  7. // #include "Распознавание чисел 1.5.cms"
  8.  
  9.  
  10.  
  11.  
  12.  
  13. //========================
  14. SUB(sort_arr)  // сортируем $data по возрастанию X
  15.   $data_size = ARRSIZE($data)
  16.   FOR($out=0, $out < $data_size, 2)
  17.      $min = $data[$out]
  18.      $ind = $out
  19.  
  20.      FOR($in=($out+2), $in < $data_size, 2)
  21.         IF($data[$in] < $min)
  22.            $min = $data[$in]
  23.            $ind = $in
  24.         END_IF
  25.      END_CYC
  26.      LOGWRITE("минимум: ", $min, "  ", $ind, " - ", $out)
  27.      $X =  $data[$ind]
  28.      $Y =  $data[$ind+1]
  29.  
  30.      $data[$ind] = $data[$out]
  31.      $data[$ind+1] = $data[$out+1]
  32.      $data[$out] = $X
  33.      $data[$out+1] = $Y
  34.  
  35.      LOGWRITE($X, " / ", $Y)
  36.      WAITMS(20)
  37.   END_CYC
  38. END_SUB
  39. //========================
  40. //========================
  41. SUB(number_read, $f_x1,$f_y1,$f_x2,$f_y2, $pref, $c_mode)
  42. // $f_x1, $f_y1 область ЛевоВерх
  43. // $f_x2, $f_y2 область ПравоНиз
  44. // $pref = "textures\digit_" префикс имён файлов с цифрами (для разных шрифтов)
  45. // $c_mode - режим COLORMODE
  46.  
  47. // Результат возвращается в $res если не найдено $res=-1
  48.  
  49.  
  50.   $res = -1 // очищаем ответ
  51.   UNDEFINE($data) // главный массив данных
  52.   UNDEFINE($a_scan) // временный массив для SCANPICTURE
  53.   $SHIFT_X = 15 // смещение (кол-во игнор пикселов вокруг найденного)
  54.   $SHIFT_Y = 15
  55.  
  56.   GETSCREEN
  57.   IF($c_mode > 0)
  58.      COLORMODE($c_mode, $f_x1,$f_y1,$f_x2,$f_y2)
  59.   END_IF
  60.   FOR ($i=0, $i < 11)
  61.      SWITCH($i)
  62.      CASE(0)
  63.         $pr = 95
  64.      CASE(1)
  65.         $pr = 99
  66.      CASE(2)
  67.         $pr = 95
  68.      CASE(3)
  69.         $pr = 93
  70.      CASE(4)
  71.         $pr = 95
  72.      CASE(5)
  73.         $pr = 95
  74.      CASE(6)
  75.         $pr = 95
  76.      CASE(7)
  77.         $pr = 95
  78.      CASE(8)
  79.         $pr = 94
  80.      CASE(9)
  81.         $pr = 95
  82.      DEFAULT
  83.         $pr = 100
  84.      END_SWITCH
  85.  
  86.      SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"), -1, $pr)
  87.  
  88.      // заносим 'X,цифра' в $num с учётом мёртвых зон
  89.      $a_scansize = ARRSIZE($a_scan)
  90.      IF($log0 = 1)
  91.         LOGWRITE ("Ищем картинку ", $i, "  найдено ", $a_scansize/2)
  92.      END_IF
  93.  
  94.      FOR($j=0, $j < $a_scansize, 2)
  95.         $X = $a_scan[$j]
  96.         $Y = $a_scan[$j+1]
  97.  
  98.         // проверяем мёртвые зоны
  99.         $dead_zone = 0
  100.         $dead_size = ARRSIZE($dead)
  101.         FOR($m=0, $m < $dead_size, 2)
  102.            $X_old = $dead[$m]
  103.            $Y_old = $dead[$m+1]
  104.            IF($log0 = 1)
  105.               LOGWRITE ("$X/$X_old = ", $X, " / ", $X_old)
  106.               LOGWRITE ("$X/$Y = ", $X, " / ", $Y, "   ABS ", ABS($X - $X_old))
  107.            END_IF
  108.            IF((($Y - $Y_old) < $SHIFT_Y+1) & (ABS($X - $X_old) < $SHIFT_X+1))
  109.               $dead_zone = 1
  110.               $m = $dead_size + 5
  111.            END_IF
  112.         END_CYC
  113.  
  114.         IF($log0 = 1)
  115.            LOGWRITE ("$dead_zone = ", $dead_zone)
  116.            LOGWRITE ("$dead_size = ", $dead_size)
  117.         END_IF
  118.         IF($dead_zone = 0)
  119.            ARRPUSH($dead, $X)
  120.            ARRPUSH($dead, $Y)
  121.            ARRPUSH($data, $X)
  122.            ARRPUSH($data, $i)
  123.            IF($log0 = 1)
  124.               LOGWRITE ("добавляем ", $i, " $X/$Y = ", $X, " / ", $Y)
  125.            END_IF
  126.         END_IF
  127.      END_CYC
  128.      IF($log0 = 1)
  129.         LOGWRITE ("после добавления ", $i, " всего ", ARRSIZE($data)/2)
  130.         LOGWRITE (" ")
  131.      END_IF
  132.      UNDEFINE($dead)
  133.      UNDEFINE($a_scan)
  134.   END_CYC
  135.  
  136.   $data_size = ARRSIZE($data)
  137.   IF($data_size > 0)
  138.      sort_arr()
  139.      IF($log0 = 1)
  140.         LOGWRITE ("цифр после сортировки ", ARRSIZE($data)/2)
  141.      END_IF
  142.  
  143.      FOR($i=1, $i < $data_size, 2)
  144.         IF($res = -1)
  145.            $res = STRCONCAT("", $data[$i])   // если первыё символ
  146.         ELSE
  147.            IF($data[$i] < 10)
  148.               $res = STRCONCAT($res, $data[$i]) // последующие символы цифры
  149.            ELSE
  150.               $res = STRCONCAT($res, ".") // последующие символы  зпт
  151.            END_IF
  152.         END_IF
  153.      END_CYC
  154.      //$res = ROUND($res, -8)
  155.   ELSE
  156.      LOGWRITE ("число не найдено")
  157.   END_IF
  158. END_SUB
  159.  
  160. //==============================================================================3
  161.  
  162.  
  163. $log = 1
  164. $log0 = 1
  165. number_read(715,623,811,637,"textures\ro_",0)
  166. LOGWRITE ("Найдено число:  ",$res)
  167. HALT
  168.  


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


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

« Последнее редактирование: Декабрь 04, 2018, 12:19:52 pm от Burninhell »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3243
  • Лечу куда хочу. cman 4.13.014x32, xp32
    • Просмотр профиля
Re: Анализ текста в окне
« Ответ #157 : Декабрь 04, 2018, 12:41:30 pm »
UDP:
Вот я баран. Надо было всего то размер мертвых зон убрать.
               $dead_zone = 0
               $m = $dead_size + 0
Да, только не там.
Нужно всего лишь уменьшить до 3 или до 0 (если поиск без процентов) в 53 строке
Код: Clickermann
  1. $SHIFT_X = 15

Там размер зоны задаётся. А то вырывать с мясом не очень.


Burninhell

  • Зашел в гости
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Анализ текста в окне
« Ответ #158 : Декабрь 04, 2018, 02:27:23 pm »
Спасибо, сделаю, как Вы посоветовали. С разбором картинок разобрался.
Осталось избавиться в остальном клике от "кликов по координатам", нужно что бы гетскрин находил нужную область, где бы она не появлялась в пределах активного окна.