Author Topic: По ходу освоения Clickermann'а буду задавать вопросы  (Read 5495 times)

0 Members and 1 Guest are viewing this topic.

StarControl

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Помогите разобраться со скриптом распознавание цифр
http://crapware.aidf.org/forum/index.php?topic=88.msg1571#msg1571
Кликер последняя версия, скрипт версия 1.5

вопрос:  (переменную не знаю, а сам не разберусь)
   1) Как сделать что бы не учитывал у цифр при поиске задний фон. (Это на будущее)
   2) Как задать расстояние между цифрами ( и для отдельной цифры можно это сделать? А то цифра 1 на 1 клетку в ширину меньше, так как из за этого вместо 01 кликер выдает 081)

Использую Колор мод 6

В результате кликер выдает 081.38.47 или 081.836.24 или 081.836.804

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
С задним фоном, в плане универсальности, не получится. Двоеточие начинает находить в некоторых цифрах, отсюда ошибки распознавания.

Вот мой более компактный скрипт основанный на методе сортировки массива.
Скрипт сам определяет количество и имена картинок из папки Letters. Первый символ в имени картинки является символом распознавания. Двоеточия конечно в именах файлов недопустимы, поэтому использовал точку.

Проверено, с образцом из архива все распознает верно.
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

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
У винта там в скрипте много чего накручено.
Например вот здесь задается процент совпадения для каждого числа.
Code: (clickermann) [Select]
   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

То есть оказывается мы ищем картинки с не 100% совпадением!

А вот здесь число 16744447 это число прозрачности. Не понятно только где этот цвет...
Code: (clickermann) [Select]
SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"), 16744447, $pr)

StarControl

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
У винта там в скрипте много чего накручено.
Например вот здесь задается процент совпадения для каждого числа.
Code: (clickermann) [Select]
   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

То есть оказывается мы ищем картинки с не 100% совпадением!

А вот здесь число 16744447 это число прозрачности. Не понятно только где этот цвет...
Code: (clickermann) [Select]
SCANPICTURE($a_scan, $f_x1,$f_y1,$f_x2,$f_y2, STRCONCAT($pref,$i,".bmp"), 16744447, $pr)


1 вот как раз если бы он искал точные значения таких траблов не было бы, не мог бы он спутать точные скобки и цифры, а полу слепой найдет что хочешь. (да ты вроде убил что его можно уневерсально яко бы спользовать, но ... ) P.S. Считаю что всегда надо искать точное значение, исключение если прозрачный фон, тогда шаманить или есть динамическое освещение, решить капчу, в других случаях картинка будет одна и таже.
2 Я как раз глядел эту строку и тоже в замешательство ввели эти цифры (для меня еще многое не понятно, иногда приходится очень долго тупить что бы дочего-то дойти (понять как это работает, даже в банальном примере, так как уровень пещерного человека)
3 Хотел вроде тот скрипт использовать, так как вроде универсальный и этим привлек, но автор к первой версии много описаний сделал, а к 1.5 почти ни чего, я пол дня убил что бы он начал показывать а результат ... 


С задним фоном, в плане универсальности, не получится. Двоеточие начинает находить в некоторых цифрах, отсюда ошибки распознавания.


С задним фоном? Это про прозрачность или расстояние между цифрами? (Так как в цифре 1 на 1 пиксель меньше?). Считаю что прозачный задний фон  должна быть возможность включать такую возможность.
« Last Edit: November 13, 2018, 01:44:35 PM by StarControl »

StarControl

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
...приходится очень долго тупить ..., так как уровень пещерного человека
 я пол дня убил что бы он начал показывать а результат ...
нужно не  тупить убийствами заниматься, а хоть немного, логически думать, когда программируешь.
не с вашим подходом замахиваться на динамическое освещение и капчу.



так как уровень пещерного человека).
P.P.S Круто брать из текста фразу, а не текст целиком.

Я посмотрю как ты не будешь тупить, в вопросе, который ты знаешь на уровне пещерного человека а я буду в этом профи и буду еще тебе с наездами говорить, "А ты чего тупишь это же элементарно ватсан!!!" . Для меня большенство кода пока вообще не понятно. И с такими обьяснениями я его точно не пойму.

Извини если обидил как то, но бесит такой подход.

P.S.  я тоже задний фон закрашиваю обычно в черный, когда можно, так как его просто указать значение 0...
« Last Edit: November 13, 2018, 01:59:01 PM by StarControl »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
"Там" накручено, потому что сделано для сложных случаев. Для этого и процент отдельный из-за сложности поиска.

В примере из этого поста ничего этого не нужно. Здесь всё просто, как дважды два. Сглаживания нет, размеры стабильные, перерендера нет.
Тупой поиск всех 10 цифр и сортировка массива по возрастанию X. Даже двоеточие искать не нужно, у нас стабильно по 2 позиции на поле.
Просто в результат вставить свой разделитель после 2 и 4 цифры.

А число прозрачности... ну не затёр из рабочего скрипта, забыл. 1.5 от 1.4 отличалось только индивидуальными условиями поиска для каждой цифры.
Код старый как говно мамонта  :D.
« Last Edit: November 13, 2018, 02:02:55 PM by Vint »


StarControl

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
"Там" накручено, потому что сделано для сложных случаев. Для этого и процент отдельный из-за сложности поиска.

В примере из этого поста ничего этого не нужно. Здесь всё просто, как дважды два. Сглаживания нет, размеры стабильные, перерендера нет.
Тупой поиск всех 10 цифр в один массив и сортировка массива по возрастанию X. Даже двоеточие искать не нужно, у нас стабильно по 2 позиции на поле.
Просто в результат вставить свой разделитель после 2 и 4 цифры.

А число прозрачности... ну не затёр из рабочего скрипта, забыл. 1.5 от 1.4 отличалось только индивидуальными условиями поиска для каждой цифры.
Код старый как говно мамонта  :D.


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

Мне он и понравился, что там много чего можно крутить и он может быть очень гибким, из-за этого не хочу брать менее компактный, т.к. разобравшись с ним смогу в многих местах его применять (этим нравися он).
« Last Edit: November 13, 2018, 02:03:42 PM by StarControl »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Да вон Oraven написал, проще этот код использовать. Для твоего случая за глаза.

Для других случаев там нельзя снижать процент меньше 100, это не предусмотрено.


StarControl

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile


1.В скрипте надо задавать расстояние между цифр, или он сам определяет?

2. Где задавать, что бы не искал определенный цвет?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
1. $m = $dead_size + 10, здесь число 10. Обычно ставлю половину ширины цифры. Например, нуля. Если единица уже, то не больше ширины единицы. Всё от шрифта зависит и его размеров/размытости.
2. Число 16744447 заменить на -1


StarControl

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
С задним фоном, в плане универсальности, не получится. Двоеточие начинает находить в некоторых цифрах, отсюда ошибки распознавания.

Вот мой более компактный скрипт основанный на методе сортировки массива.
Скрипт сам определяет количество и имена картинок из папки Letters. Первый символ в имени картинки является символом распознавания. Двоеточия конечно в именах файлов недопустимы, поэтому использовал точку.

Проверено, с образцом из архива все распознает верно.
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


Хм... А где крутить колормод? В упор не вижу :-( ...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Хм... А где крутить колормод? В упор не вижу :-( ...

Снимок и возможная цветокоррекция делается непосредственно перед вызовом подпрограммы
Code: (clickermann) [Select]
GETSCREEN
recognize(147,783, 219,809, -1, 100)

StarControl

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
С задним фоном, в плане универсальности, не получится. Двоеточие начинает находить в некоторых цифрах, отсюда ошибки распознавания.

Вот мой более компактный скрипт основанный на методе сортировки массива.
Скрипт сам определяет количество и имена картинок из папки Letters. Первый символ в имени картинки является символом распознавания. Двоеточия конечно в именах файлов недопустимы, поэтому использовал точку.

Проверено, с образцом из архива все распознает верно.
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


Хм... А где крутить колормод? В упор не вижу :-( ...

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

StarControl

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile

Хм... А где крутить колормод? В упор не вижу :-( ...


Снимок и возможная цветокоррекция делается непосредственно перед вызовом подпрограммы
Code: (clickermann) [Select]
GETSCREEN
recognize(147,783, 219,809, -1, 100)



Хм... А где крутить колормод? В упор не вижу :-( ...


Спасибо понял, я думал что колор мод уже встроин в программу (скрипт)...

Оперативно отвечаешь, как и твои скрипты минимальны и быстры ).
« Last Edit: November 13, 2018, 04:01:45 PM by StarControl »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
И у меня невольно получилась сортировка выбором
https://habr.com/post/422085/
А у Андрея пузырьком
https://habr.com/post/414653/