Ребят, привет всем. Спасибо за скрипт, поковырялся в нем и вроде все заработало, но с оговоркой.
Числа без повторных знаков (123 или 45631) распознает точно. А вот если есть повторы (11223344 или 33333) то ответ программы не корректный. Как правило одна или несколько повторяющихся цифр обрезаются. 11223344 превращается в 1234, а 222222 в 222.
#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