Задаешь область поиска, цвет фона и получаешь текст этой области.AGClient ;D
AGClient ;DКак вариант... Только производительность нужна хотя бы 10 китайцекартинок в секунду. ;D :'(
Среднее арифметическое ты сейчас и там можешь посчитать, что мешает?
Поиск текста обсуждался в теме поиск текста в браузере. Да, хорошо бы делать это быстро и просто.
Только сдается мне что тебе это не подойдет. Потому что в большинстве таких игр текст на экране это не текст, а картинка с надписью. Нет, внутри программы это чаще именно текст, но тебе это не поможет. Попробуй выделить свою надпись и скопировать. Не выделится.
А кликкер совсем не "фаинридер".
фон там для всех кнопок одинаковЗадаешь область поиска, цвет фона и получаешь текст этой области.AGClient ;D
я знаю,что прошу:)) среднее арифметическое нужно,чтобы определять координаты кнопки(они довольно часто разные) а кнопка именно в форме ссылки ,а не картинки. была бы картинка - я бы тему не создавалскажи что тебе мешает посчитать среднее арифметическое? Сложение и деление пока работают.
я знаю,что прошу:)) среднее арифметическое нужно,чтобы определять координаты кнопки(они довольно часто разные) а кнопка именно в форме ссылки ,а не картинки. была бы картинка - я бы тему не создавалскажи что тебе мешает посчитать среднее арифметическое? Сложение и деление пока работают.
Ты бы показал свои кнопки, что гадать.
Если ссылка, то должна находиться по CTRL+F (+F3).
Если не находится, то алис... для кликера это картинка. Может и можно как то, он все молчат.
Там смотря как цифры в браузере представлены.ифпикчеин тут не подойдет. придется делать более 6 тысяч картинок
Иногда помогает простой даблклик по корам в районе цифры и команда туклип.
Потом анализ переменных.
Но бывает и так, что к цифре даблкликом не подобраться.
В таких случаях обычно выходил из положения командой ифпикчеин.
что это то? finereader прикрутить?
в кликере, по крайней мере последних версий, достаточно функционала чтоб найти что угодно где угодно. надо просто раскинуть мозгами.
для браузера решение вообще на поверхности лежит - Ctrl + F
ифпикчеин тут не подойдет. придется делать более 6 тысяч картинокЗачем 6000?
т.е. для распознавания нужно будет загонять все это дело(картинку с цифрами) на сайт для расшифровки?ифпикчеин тут не подойдет. придется делать более 6 тысяч картинокЗачем 6000?
Если капча, то есть антикапча.
Если обычная цифра, то их разнообразие ограничивается всего 10 картинками.
Анализировал в флашигре (файерфокс) через ифпикчеин цифры размером шрифта примерно 8 размера.
п.с.
Делал давно. В новых версиях ещё не пробовал.
. для распознавания нужно будет загонять все это дело(картинку с цифрами) на сайт для расшифровки?Да. Как-то так.
5432
32
5432
32
И как нибудь определять конец числа в первом случае и начало в обоих (решено). Или маркер или изображение границы кнопки...
Видимо, Резнов, антикапчу вообще не рассматривает?!
Если я правильно понял, то задача состоит в анализе игровых данных, в форме печатного текста или чисел.
Резнов, если хочешь научить скрипт распознавать именно текст, то следует вести попиксельную визуальную проверку.
#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
//==============================================================================
#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]$res = ROUND($res, -13)
$res = ROUND($res, -8)
$res =INT($res)
[/spoiler]#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]Винт,круто,очень круто. В кликере я почти что полный нупь,так что можно нубский вопрос: текст можно этим кодом найти?Текст... Нет. Ты прямо меня в ступор ввел этим вопросом.
угу, я вот придумал… на свою головуну по аналогии раздуйте данный скрипт до распознавания текста только длина текста будет сильно ограничена и количество букв тут не 10 будет =)
"сигнализация" на случай грабежа твоего города в браузерке (flash).
хочется, чтобы она орала ник грабителя, а он только в картинке есть
ну это так, лирическое отступление :)
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, в игре. Не помогло.
Спасибо большое за ответ!
1) Начал искать параметры COLORMODE+%
Нашел 2 поста с этим и то там используется COLORMODE($colorm, $stcoord_X,$stcoord_Y,$encoord_X,$encoord_Y) параметр + координаты, а где %?
2) COLORMODE надо было вставлять после getscreen так?
3) Как отключить сглаживание шрифта в Flash player? Отключил в системе Win 7, в драйвере nvidia, в игре. Не помогло.
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
#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
почти получилось :)Я же говорю, у меня нет в примерах цифр 9 и 2. Не внес их в CASE
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
всё отлично заработалоЗайди на эту тему --> http://crapware.aidf.org/forum/index.php?topic=2483.0
вынес для себя $shift_x, $shift_y и $c_ignore в параметры подпрограммы
а какой в этом смысл, ну распознает кликер цифру и остановится? Собирай образцы цифр и вставляй их в имеющийся на форуме скрипт распознавания чисел. уже научили распознавать и давно, заодно и поиск по форуму освоишь.
поросят ловят в хлеву, волков в лесу, а образцы цифр ловят в скрины с мониторов и вырезают в паинте до нужного размера, как сало на ломтики. ;DCode: (clickermann) [Select]#name "Скрин экрана"
GETSCREEN
screenshot("цифры на разделку_")
HINTPOPUP("цифру...", "я поймал")
BEEP(800,200)
HALT
О! Сало на ломтики резать, я умею.
А цифры.....
Ну, ладно.
Утро вечера, нет ночи, мудренее.
Спасибо за участие и советы.А сделать скрин в нужном формате поможет этот простой скрипт! 8)
// Получение скриншота с цветокоррекцией (фильтр 6)
GETSCREEN
COLORMODE(6)
SCREENSHOTEX(500,500, 550,550, "Image_", 0) // вырежет в координате 500,500, 550,550
HALT
я п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)
mы шуmuшь? уберu ф5, u все будеm нормально! нашел же проблему..
я показал как можно нарезаmь бысmро u не вручную, дальше дело за малым собраmь все в одно чuсло
KEYPRESS(#F5)mы шуmuшь? уберu ф5, u все будеm нормально! нашел же проблему..
я показал как можно нарезаmь бысmро u не вручную, дальше дело за малым собраmь все в одно чuсло
Не! Не шучу!
Я кроме русского,белорусского и церковно-славянского, других языков не знаю.
Я так понимаю ф5-это " TFWRITE($cmd, "chcp 1251>nul") "
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
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
поправочка, лишние скобки в условии.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
что подразумевается под термином нарезка?
#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
#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
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
// требуемая версия 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
#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
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 знака.вот тебе еще вариант, взял отсюда 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
дальше уже понятно что предпоследняя цифра "1" это точка, с помощью функций работы со строками заменишь уже сам. или если тебе не важно что после точки, то пропишешь границы твоего числа до точки, 2 знака.
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
если же тебе это всеравно покажется сложным, предоставь на форуме картинки всех цифр, можно в разнобой, я обучу и дам тебе нужные файлы.
#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
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"
"1251"="c_1251.nls"
"1252"="c_1251.nls"
На счет кодировки, нужно в реестре поправить значения
Нужно приравнять кодировки 1250 и 1252 к 1251Code: [Select][HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"
"1251"="c_1251.nls"
"1252"="c_1251.nls"
И перезагрузить комп.
помогите плз, скрипт распознования работает отлично,но как заставить его работать в цикле?А зачем тут понимать? После завершения твоего цикла, просто прописываешь удаление сначала массивов, потом наращиваемых переменных, если не поможет вообще всех переменных, дело-то простое и много ума не надо.
при последующем запросе распознования не определяет цифры,а добавляет в строку старые значения
что то нужно обнулить,а вот что не могу понять
скрипт dramsterа имею ввиду
А зачем тут понимать? После завершения твоего цикла, просто прописываешь удаление сначала массивов, потом наращиваемых переменных, если не поможет вообще всех переменных, дело-то простое и много ума не надо.
А зачем тут понимать? После завершения твоего цикла, просто прописываешь удаление сначала массивов, потом наращиваемых переменных, если не поможет вообще всех переменных, дело-то простое и много ума не надо.
если не трудно можно пример как обнулить массив?
UNDEFINE($arr)
Code: (clickermann) [Select]UNDEFINE($arr)
Твоя неугомонная энергия несёт тебя по верхушкам тем, унося в сказочную даль.ну а мы кругозор расширяем, норм )
Ребят, подскажите пожалуйста следующее...анализ цифр это слишком примитивно, воспользуйтесь выложенным на форуме скриптом " распознавание чисел"... и после этого поток сознания не оформленный в понятные предложения.
нужно чтобы в определенной области экрана делал анализ цифр, он же ресурс(деньги)....и после этого листал дальше по кликом или когда нашел определенные действие, типа клика)) ...что я мог задать поиск цифр, более чем искомые
Ребят, подскажите пожалуйста следующее...я понял по "он же ресурс(деньги)" включительно.
.......вроде просто же...в определенном месте экрана(наверное по координатам), есть цифры, и к ним нужно применить следующие.....понять кликеру, величина числа и после нажать на нужное место), короче чтоб обновляла базы и искала нужное количество ресурсов, не точно а от заданной величины...да и ле есть шаблоны..
(https://pp.userapi.com/c837135/v837135525/2e25b/yMPhESdI94c.jpg)Народ когда уже научитесь отличать, что такое цифра, а что такое число? Если не все предложения в рублях тогда сравнивать стоит суммы с пересчётом в одну валюту с учётом указанного курса.
помогите сделать скрипт
сравнить 2 цифры
если 1 не равно 2 то кликать в определенной точке
Помогите - это конечно конечно вопиющее требование, вроде "спасите", но хотелось бы понять чем вас не устраивает скрипт по распознаванию чисел который написал уважаемый Vint?
Вы хотите Проводить такую цветокорекцию картинок, чтоб изображение сводилось к одинаковому и близкому в процентах или требуется ещё более свежее решение? Просто нормальным скриптам своё предложение проще запоминать, чем узнавать по картинке. Здесь конечно есть мушкетёры которые"...пишут скрипты ради того, чтобы ПИСАТЬ", но может достаточно просто потыкать носом в уже написаннное? Тем более что если вы не умеете включать чужие скрипты в состав своих, то и написанные по вашему сценарию скрипт будет проблематично использовать на практике.
//основная часть
#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
//далее алгоритм собственно атаки
Смещения пробовал ставить от $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% не найдёт.С ноутбука, так что размер в bluestack какой есть...
А шрифт никак нельзя увеличить? Выставить более высокое разрешение в игре или подобрать размер окна чтоб размер был ближе к не сглаженным эталонам.
Если нельзя, то я сочувствую. Или выбрать другой способ или тщательно настраивать каждую цифру подбором образца и процента. Потом ещё исключить взаимное влияние.
А шрифт никак нельзя увеличить? Выставить более высокое разрешение в игре или подобрать размер окна чтоб размер был ближе к не сглаженным эталонам.там палка о 2-х концах. Надо чтобы больше шахт влазило, но при этом картинки будут - хрен разберешь. Можно приблизить, иметь хорошие картинки и отлично определять текст, но при этом на экран будет влезать всего пара шахт (если повезёт) нужного уровня. Постоянный фарм пары шахт - прямая дорга в баню. По хорошему, надо приблизить и помимо поиска картинок задать алгоритм слайда карты в пределах синей границы. Ну или хотя бы в большом приближении жестко задать количество свайпов типа: вправо, вправо, вниз, влево, влево, вверх)
Если нельзя, то я сочувствую. Или выбрать другой способ или тщательно настраивать каждую цифру подбором образца и процента. Потом ещё исключить взаимное влияние.
там палка о 2-х концах. Надо чтобы больше шахт влазило, но при этом картинки будут - хрен разберешь. Можно приблизить, иметь хорошие картинки и отлично определять текст, но при этом на экран будет влезать всего пара шахт (если повезёт) нужного уровня. Постоянный фарм пары шахт - прямая дорга в баню. По хорошему, надо приблизить и помимо поиска картинок задать алгоритм слайда карты в пределах синей границы. Ну или хотя бы в большом приближении жестко задать количество свайпов типа: вправо, вправо, вниз, влево, влево, вверх)Да, все верно - "обход" свайпами внутри синей границы - это следующий шаг в восстановлении студенческих навыков программирования ))
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)
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)
...
Общий вопрос по алгоритму Распознавание чисел 1.5.cms (http://crapware.aidf.org/forum/index.php?topic=88.msg1571#msg1571 )предлагаю продолжить здесь:
Для случаев, когда конкретные написания цифр могут достаточно сильно отклоняться от "шаблона", можно ли использовать не конкретные образцы, а их массивы? Например, сделать подпапки "texures\number0\", "texures\number1\", "texures\number2\"... в которые накидывать разные написания одной и той же цифры. А алгоритм бы проверял на совпадение каждому из вариантов цифры в соответствующей подпапке.
А совсем идеально - чтобы если совпадений не найдено (установив высокую точность, например от 95), но скриншот данного кусочка экрана сразу складировался в отдельной папке - из которой потом вручную можно было бы нарезать цифры и добавить в нужную подпапку...
Есть мастера, которые могли бы так доделать алгоритм распознавания? Или тогда комп каждое распознавание будет по полчаса делать?
IF($dead_zone = 0)
ARRPUSH($dead, $X)
ARRPUSH($dead, $Y)
ARRPUSH($data, $X)
ARRPUSH($data, $i)
А для начинающего подробней можно, как это все запрограммировать?Извините, если не в тему :( . Программка Portable ABBYY Screenshot Reader, весит всего 25м. Можно заставить кликер "таскать" руку для выделения зоны распознавания, результат (в зависимости от настроек) попадает в буфер обмена. Очень неплохо распознает текст, даже не горизонтальный (см. примеры в прицепе)! А вот если бы научиться передавать ей параметры зоны распознавания вместо графического выделения!!! Может кто "подломит"? ;)
Попробовал, да весело распознает ;)
только если так приспособить:
переключаемся на окно с текстом
KEYPRESS R
выделяем область
KEYPRESS ENTER
распознанный текст в буфере
Стоит подумать о другом методе. Например поделить на зоны цифр и считать в области сумму чистого цвета 10310011Имеется в виду что-то типа такого алгоритма? https://habrahabr.ru/post/101446/
Может там граница более чёткая.
А вторая... не понял, чем она отличается от нашего обычного сравнения с шаблоном?У меня проблема в том, что цифры между собой сильно разные, не получается отловить просто по шаблону. За счет поворота BlueStacks горизонтально на экране ноутбука, получилось увеличить размер цифр до примерно 6 на 13.
Какой смысл открывать архив от неизвестного человека? А если у вас на компе вирус и вы об этом не подозреваете?1.По безопасности:
Зачем архивировать скрины, если эта программа работает с несжатыми форматами изображений?
Усреднение. Ну попробуй.
У Драмстера кажись в одном из вариантов есть сравнение с усреднённым образцом. Почти то же самое, но наоборот.
#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
насколько я понял, это ты про это http://crapware.aidf.org/forum/index.php?topic=2336.30
не слишком рабочая штука, насколько я помню, судя по тестам которые в том сообщении. сразу после написания - забыл про этот вариант, и далее делал упор на форму символов как вот тут http://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743
при распознавании всегда пользовался именно этом вариантом. с тех пор скрипт кардинально изменился.
dramster, спасибо, буду разбираться!
Пока на вскидку два вопроса:
а)Не увидел обращения к подпрограмме kontrast (строка 332). Она нужна?
б)Строки 393-396 по сути можно вынести в самое начало основной части программы?
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, короче некоторые числа сильно обрезаются.
тут тоже косяк с цифрами которые наезжают друг на друга, я без понятия как можно отделять программно.с твоим вариантом сразу в голову пришла идея разделять такие цифры по цветам (я надеюсь там количество цветов ограничено). но есть затык с цифрами одинакового цвета находящиеся рядом, как в твоей последней капче 8 и 7 . хотя таких случае наверно не много, можно и пропустить. нужно пробовать. надеюсь идею понял - с начала ищешь красные цифры - распознаешь, потом зеленые - распознаешь, и тд.
но он использовал 4 координат по вертикали, а я пять взял.бери обновленный вариант отсюда http://crapware.aidf.org/forum/index.php?topic=88.msg23101#msg23101 . там у меня с каждой из четырех сторон по пять точек. в этоге выходит строка типа 01110311112042200240~ . плюс возможность выставления точности $accur, где при его значении =1 , строка будет иметь цифры от 0 до 9. а при увеличении этого значения - будут только нолики и единички. помогает в при случаях, когда какието цифры похожи друг на друга, типа 1 и 7, или 8 и 0 . если цифры обычные и не искривлены, то смело можно присваивать этой переменно 6-7, быстрее обучится.
единичка страдает, бывает отрезается наполовину.тут тебе в помощь контраст. http://crapware.aidf.org/forum/index.php?topic=2399.0 . там какраз таки есть пример с таким случаем.
я так понял, что отделить цифры от фона у тебя получилось. насчет "точки, рядом с которыми менее двух закрашенных пикселей", давно уже хотел написать такой алгоритм, чтобы убирать лишнее, делать "толщину" цифр меньше, вроде не сложно, но както руки не доходят :(.
я так понял, что отделить цифры от фона у тебя получилось. насчет "точки, рядом с которыми менее двух закрашенных пикселей", давно уже хотел написать такой алгоритм, чтобы убирать лишнее, делать "толщину" цифр меньше, вроде не сложно, но както руки не доходят :(.ради интереса, попробуй обработать вот такую капчу (новая капча с фрибитко.ин) своей прогай.
$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
я так понял, что отделить цифры от фона у тебя получилось. насчет "точки, рядом с которыми менее двух закрашенных пикселей", давно уже хотел написать такой алгоритм, чтобы убирать лишнее, делать "толщину" цифр меньше, вроде не сложно, но както руки не доходят :(.ради интереса, попробуй обработать вот такую капчу (новая капча с фрибитко.ин) своей прогай.
(http://i.imgur.com/UfmLLwK.png)
выйдет там оставить только буквы или нет? эта капча давно мне мозг мозолит, никак не возьмусь :D .
всеже набросал сам скриптик по анализу количества соседних пикселей...
//=== Вариант 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
//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
//=== Вариант 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]//=== Вариант 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
вот накалякал под вышеуказанную заготовкуdramster, для ситуации глюкнутой картинки (изначально по ряду причин захват не той области для распознавания), как во вложении - у меня происходит зацикливание строк 43-62. Если я правильно понимаю, то это за счет строки 54 $h_str_temp = 0 и того, что нижний артефакт меньше чем $h_str.
$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 уменьшить, и все проблемы.
За скрипт спасибо, буду тестировать потом отпишусьДокладываю: для однотипных цифр работает просто влет, схватил по паре-тройке разных вариантов написания и уверенно все распознает.
$right_1 = ROUND($right_1 / (INT(($y2_char-$y1_char+1)/2)) / $accur, -1)*10
И им подобных.INT(($y2_char-$y1_char+1)/2)
Записать в переменную и проверять на 0. Тем более это выражение встречается во всех пяти вычислениях $right, от $right_1 до $right_5#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
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. то есть 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
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
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
Всем доброй ночи! Имею два окна с числовыми данными в разных координатах. Скрипт выполняет один снимок в заданный промежуток времени и распознает по координатам окон ряд чисел. Есть ли возможность как то оптимизировать структуру скрипта, sub-ы уместить в один, возможно как то упростить...
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
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. Зона снимка делалась с запасом для первого окна с числовыми данными, так как оно перемещается по Y. Соответственно для получения координат этого окна, скрипту для начала приходится искать привязку по пикселю.
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
#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
$SHIFT_X = 15
... написал не большой скрипт, но он очень уж примитивный и не всегда работает как надо!( Хотел попросить совета, как возможно лучше реализовать мою задумку.
Все это дело в браузере работает.
Большой проблемой для меня кажется именно поиск числа. Не знаю, как вообще лучше реализовать.
Как картинки правильно нарезать??? Через paint не получается, посоветуйте чем можно сделатья через paint.net сё режу, удобная имба+сам определяет разрядность картинки при сохранении, шо определяет выходной вес файла, если галку оставить)
А ты попробуй, у меня такая идея была... возможно даже не у меня, на форуме ктото возможно писал. Я точно помню, что пытался реализовать. И точно помню, что в чем то был затык. Если не ошибаюсь, что-то с параметром пути к этой папке не работало. Но возможно я и не с общей папкой работал, а с сетевым диском... не помню точно. Но дело было.
Если затык тот что я описал, то все равно можно же через проводник, кнопашками. Попробуй.
Круто. А ты именно через через общую папку с установкой ядиска? Потому-что я тогда скорее всего на сетевой диск мутил, который привязывал к ядиску. А к сетевому диску как таковой путь почему-то не работал. Вернее работал, но файл перенаправлялся куда-то на локальный диск, в какую-то непонятную директорию. Я и кинул, не сильно и нужно было.Из виртуалки вот так путь к папке выглядит - C:\Users\Hito\YandexDisk\bmp Это папка такая - "bmp", уже на яндекс-диске.
SCREENSHOTFIX($x1cap,$y1cap, $x2cap,$y2cap, STRCONCAT("C:\Users\Hito\YandexDisk\bmp\",$log_name," ",$count,".bmp"), 0)
Ну понятно, но нужно еще приложение ядиск ставить? Я просто даже и не знал что оно есть, вернее не заострял на этом внимания.Без этого никак. И на комп ставить, и на телефон. И чтоб работало с одним и тем же акком.
И точно помню, что в чем то был затык.
А вот и тот затык, что не дал кликеру сохранить ничего на диск. Как видно, путь верный, а у кликера ошибка :-\
Так а с сетевым с подключенным яндекс диском? У тебя это из лакальной сети.
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)
Но подключил, попробовал, всё сработало.:-\ значит у меня косяк в винде какой-то, да и фиг с ним. Я даже и не помню когда это мне надо было, про приложение даже и мысли не было тогда. Попробовал, не работает, немного повтыкал и бросил.
Решил попробовать с общей папкой для сетевого диска с яндексом. Сетевой диск создается в пять кликов, и не нужны никакие приложения (если для капчи, то на телефоне конечно нужно). И только потом вспомнил, что такое "общий доступ" для папок в винде, а ты наверно все это мутишь из виртуальной машины, там "общая папка", я подумал про папку с общим доступом для локальной сети ;D . Да и пофиг, раз решил проверить, проверяю... и, для папок из сетевого диска вообще в свойствах нет такой опции, как "общий доступ" :-\ .
А вот и тот затык, что не дал кликеру сохранить ничего на диск. Как видно, путь верный, а у кликера ошибка :-\
(https://i.imgur.com/jxEYtMN.png)
#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
//==============================================================================
Испанский Стыд!
Зачем плодить сущности и мучать старинные версии скрипта?
Для вас, уважаемый автор новые версии выложил давным-давно, а вы // Version: 1.1 (30.01.2013)
вместо Распознавание чисел 1.5.cms, с маниакальным упорством юзаете. :o
настройки скрипта, удобны и понятны во всех версиях, проверьте правильность и полноту их заполнения своими данными.
Испанский Стыд!
Зачем плодить сущности и мучать старинные версии скрипта?
Для вас, уважаемый автор новые версии выложил давным-давно, а вы // Version: 1.1 (30.01.2013)
вместо Распознавание чисел 1.5.cms, с маниакальным упорством юзаете. :o
я бы с радостью, но другие версии у меня не работают, я не понимаю почему...
у меня вообще не ищет