Author Topic: Анализ текста в окне  (Read 108026 times)

0 Members and 1 Guest are viewing this topic.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Анализ текста в окне
« Reply #135 on: December 25, 2017, 07:40:13 AM »
кликерманн разгадал капчу у себя же на оффсайте в гостевой книге !!! :D 

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

https://youtu.be/xLf3Xsr8srM

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

doomka

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Анализ текста в окне
« Reply #136 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
 

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Анализ текста в окне
« Reply #137 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

doomka

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Анализ текста в окне
« Reply #138 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

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Анализ текста в окне
« Reply #139 on: April 01, 2018, 04:13:35 PM »
Спасибо большое Oraven. Зона снимка делалась с запасом для первого окна с числовыми данными, так как оно перемещается по Y. Соответственно для получения координат этого окна, скрипту для начала приходится искать привязку по пикселю.

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

doomka

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Анализ текста в окне
« Reply #140 on: July 22, 2018, 11:36:11 PM »
Вечер добрый! Oraven при переходе на  новую версию кликера 4.13 ваш скрипт перестал распознавать нули, все остальные цифры без проблем, а нули ни как. Запускаю 4.12 все ок.
Взгляните если не сложно.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Анализ текста в окне
« Reply #141 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

Burninhell

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Re: Анализ текста в окне
« Reply #142 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

« Last Edit: December 04, 2018, 12:19:52 PM by Burninhell »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Анализ текста в окне
« Reply #143 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
Там размер зоны задаётся. А то вырывать с мясом не очень.


Burninhell

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Re: Анализ текста в окне
« Reply #144 on: December 04, 2018, 02:27:23 PM »
Спасибо, сделаю, как Вы посоветовали. С разбором картинок разобрался.
Осталось избавиться в остальном клике от "кликов по координатам", нужно что бы гетскрин находил нужную область, где бы она не появлялась в пределах активного окна.

Vov4ik

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Re: Анализ текста в окне
« Reply #145 on: July 02, 2019, 02:38:09 AM »
Доброго времени суток. Я только недавно начал пользоваться кликером, написал не большой скрипт, но он очень уж примитивный и не всегда работает как надо!( Хотел попросить совета, как возможно лучше реализовать мою задумку.
Задача скрипта, поиск числа в определенном столбце(столбец может менять расположение), но над ним всегда есть текст, думаю к нему привяжусь и буду так задавать область поиска. Все это дело в браузере работает.
В этом столбце есть числа, нужно что бы скрипт понимал, когда там появится число более 40(Числа рандомные, обычно с 1-2 знаками после запятой, но не превышают 120) как только появится число более 40 выполнял команду.
Большой проблемой для меня кажется именно поиск числа. Не знаю, как вообще лучше реализовать.

Vov4ik

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Re: Анализ текста в окне
« Reply #146 on: July 02, 2019, 02:42:34 AM »
Уже думал о самом примитивном, что бы кликер выделял первое число из столбца, копировал его и проверял больше 40 или нет. Забыл упомянуть, число всегда первое в столбце.

Атеист

  • Guest
Re: Анализ текста в окне
« Reply #147 on: July 02, 2019, 10:32:30 PM »
... написал не большой скрипт, но он очень уж примитивный и не всегда работает как надо!( Хотел попросить совета, как возможно лучше реализовать мою задумку.

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

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

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

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

А как выглядят эти числа? Маленькие, чёрненькие такие, или большие красные?

ALex222333

  • Зашел в гости
  • *
  • Posts: 1
    • View Profile
Re: Анализ текста в окне
« Reply #148 on: October 12, 2020, 09:02:48 PM »
Как картинки правильно нарезать??? Через paint не получается, посоветуйте чем можно сделать

Иллидан

  • Освоившийся
  • **
  • Posts: 40
  • Дзен-Мастер
    • View Profile
Re: Анализ текста в окне
« Reply #149 on: August 23, 2021, 04:46:11 PM »
Как картинки правильно нарезать??? Через paint не получается, посоветуйте чем можно сделать
я через paint.net сё режу, удобная имба+сам определяет разрядность картинки при сохранении, шо определяет выходной вес файла, если галку оставить)

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