1 (изменено: OwnCorporation, 2013-08-03 17:53:27)

Тема: AHK: Генератор 4 чисел.

Есть такая задача.
Нужно найти 4 значное число в окне.
Я подумал и придумал самый примитивный способ "обычный перебор".
Сделал фото 10 цифр от 0-9
И задал координаторы поиска: по 1 цифре; по 2 цифре; по 3 цифре; и 4 цифре.
В конце все цифры складываются в одно.
И я получаю ответ. Все просто и все работает!

Теперь задача в другом.
Этот код находит 1 цифру в диапазоне 250млс- 900млс.
При нахождении 4 цифр диапазон ожидания возрастает от 1сек до 4 сек.

Мне нужно максимально ускорить работу скрипта.
Чтобы до 1 секунды.


setbachline, -1

loop {
    WinGetPos,,, W, H, A
    ImageSearch, xD, yD, 499, 430, 551, 456, C:\image\NZT_Start\scan_X\dollar2.png
    if !ErrorLevel
        {
break
        }
    if ErrorLevel
    break
}

; !!! находка кординатов 1 цифры
S1_x1:=xd+5, S1_x2:=S1_x1+15
; !!! находка кординатов 2 цифры
S2_x1:=S1_x2-5, S2_x2:=S1_x2+10
; !!! находка кординатов 3 цифры
s3_x1:=S2_x2-4, s3_x2:=S2_x2+12
; !!! находка кординатов 4 цифры
s4_x1:=S3_x2-5, s4_x2:=S3_x2+8
; !!! находка кординатов по вертикале
S1_y1:=yd-4, 
S1_y2:=S1_y1+20

s_num1:= ;
s_num2:= ;
s_num3:= ;
s_num4:= ;

num:=1 ; 1 включить/ 0 - выключить
Generation:
WinActivate, Ahk_class #########
if num = 1
scan_x1 := S1_x1, scan_x2 := S1_x2
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n2
if num = 2
scan_x1 := S2_x1, scan_x2 := S2_x2
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n3
if num = 3
scan_x1 := s3_x1, scan_x2 := s3_x2
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n4
if num = 4
scan_x1 := s4_x1, scan_x2 := s4_x2

scan_y1 := S1_y1
    scan_y2 := S1_y2
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0
loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\0.png
    if !ErrorLevel
        {
stack_n = 0
goto, boomnumber
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\00.png
    if !ErrorLevel
        {
stack_n = 0
goto, boomnumber
        }
    if ErrorLevel
    break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\1.png
    if !ErrorLevel
        {
stack_n = 1
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\11.png
    if !ErrorLevel
        {
            s_num4 := 0
stack_n = 1
goto, boomnumber
        }
    if ErrorLevel
    break
}

;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2
loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\2.png
    if !ErrorLevel
        {
stack_n = 2
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\22.png
    if !ErrorLevel
        {
stack_n = 2
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\22.png
    if !ErrorLevel
        {
            s_num4 := 0
stack_n = 2
goto, boomnumber
        }
    if ErrorLevel
    break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3
loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\3.png
    if !ErrorLevel
        {
stack_n = 3
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\33.png
    if !ErrorLevel
        {
            s_num4 := 0
stack_n = 3
goto, boomnumber
        }
    if ErrorLevel
    break
}

;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4
loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\4.png
    if !ErrorLevel
        {
stack_n = 4
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\44.png
    if !ErrorLevel
        {
stack_n = 4
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\44.png
    if !ErrorLevel
        {
            s_num4 := 0
stack_n = 4
goto, boomnumber
        }
    if ErrorLevel
    break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5
loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\5.png
    if !ErrorLevel
        {
stack_n = 5
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\55.png
    if !ErrorLevel
        {
stack_n = 5
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\55.png
    if !ErrorLevel
        {
            s_num4 := 0
stack_n = 5
goto, boomnumber
        }
    if ErrorLevel
    break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6
loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\6.png
    if !ErrorLevel
        {
stack_n = 6
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\66.png
    if !ErrorLevel
        {
stack_n = 6
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\66.png
    if !ErrorLevel
        {
            s_num4 := 0
stack_n = 6
goto, boomnumber
        }
    if ErrorLevel
    break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 7
loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\7.png
    if !ErrorLevel
        {
stack_n = 7
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\77.png
    if !ErrorLevel
        {
stack_n = 7
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\77.png
    if !ErrorLevel
        {
            s_num4 := 0
stack_n = 7
goto, boomnumber
        }
    if ErrorLevel
    break
}

;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 8
loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\8.png
    if !ErrorLevel
        {
stack_n = 8
goto, boomnumber
        }
    if ErrorLevel
    break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 9
loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\9.png
    if !ErrorLevel
        {
stack_n = 9
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\99.png
    if !ErrorLevel
        {
stack_n = 9
break
        }
    if ErrorLevel
    break
}

loop {
    WinGetPos,,, W, H, A
    ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\99.png
    if !ErrorLevel
        {
            s_num4 := 0
stack_n = 9
goto, boomnumber
        }
    if ErrorLevel
    break
}

boomnumber:
if num = 1
{
s_num1 := stack_n, num := 2
goto, generation
}
if num = 2
{
s_num2 := stack_n, num :=3
goto, generation
}
if num = 3
{
s_num3 := stack_n, num :=4
goto, generation
}

number = %s_num1%%s_num2%%s_num3%%s_num4%

Чтобы не думали что просто жду ответа.
С горем пополам разбираю этот сканер. Он не мой ... Нашел.

#persistent ; Делает скрипт постоянно выполняющимся
#NoEnv ; Отменяет проверку для пустых переменных
menu, tray, NoStandard
menu, tray, add,Add Scale,MenuHandler
menu, tray, add,Dec Scale,MenuHandler
menu, tray, add,Exit,MenuHandler 

SetBatchLines -1
CoordMode, Mouse, Screen
CoordMode, Tooltip, Screen
CoordMode, Pixel, Screen

Data:="#803+;|,.."
;~ Data:="#"

Length:=StrLen(Data)
nScale:=1

 
Gui,+Resize
Gui, font,s5,Terminal
;~ Gui, font,s5, Consolas 
Gui, Add, Edit, x0 y0 w600 h400 -wrap +HScroll +VScroll vResultText



MsgBox,Ctrl+LButton to start

^LButton::

MouseGetPos, scan_x_start, scan_y_start
currentXpos=%scan_x_start%
currentYpos=%scan_y_start%
ToolTip,``, scan_x_start, scan_y_start
WinGet,TipId,ID,ahk_class tooltips_class32
WinSet, Transparent, 100, ahk_id %TipId%

loop
{
    MouseGetPos, scan_x, scan_y
    scan_x-=currentXpos
    scan_y-=currentYpos
    
    WinMove,ahk_id %TipId%, , , , %scan_x%, %scan_y%
    GetKeyState, state, LButton,P
;~     ToolTip,%scan_x% * %scan_y%,,2
    TrayTip,Size,%scan_x% * %scan_y%
    if state=u
    {
        ToolTip
        TrayTip
        break
    }
}


CoordMode, Pixel, Screen
CoordMode, Mouse, Screen
MouseGetPos, scan_x_end, scan_y_end

scan_current_y=%scan_y_start%
scan_current_x=%scan_x_start%
scan_current_line:=""
Loop
{
    scan_current_x++
    if scan_current_x > %scan_x_end%
    {
        scan_current_line =%scan_current_line%`r`n
        scan_current_y:=scan_current_y+nScale
        if scan_current_y > %scan_y_end%
        {            
            break
        }
        Else           
        {
            scan_current_x = %scan_x_start%
            Proce:=Ceil(scan_current_y/scan_y_end*100)
            TrayTip, ,???? %Proce% `%, , 1
            continue
        }
        
    }
    PixelGetColor, ColorV, %scan_current_x%, %scan_current_y%
    
    b := ColorV >> 16 
    g := (ColorV >> 8) & 0xFF 
    r := ColorV & 0xFF
    

    YB:=Ceil((0.3*r)+(0.6*g)+(0.1*b))
    dot:=Ceil(YB/255*Length)
    StringMid,dot,Data,dot,1
    
    ColorV:="#" . r . g . b
;~     scan_current_line =%scan_current_line%`[color=%ColorV%`]%dot%`[`/color`]
    scan_current_line =%scan_current_line%%dot%

}

TrayTip, ,????, , 1
sleep, 1000
TrayTip

GuiControl,,ResultText,%scan_current_line% 
Gui, Show,,Reg2Text 
return

GuiClose:
GuiControl,,ResultText,,
Gui,Hide

GuiSize:
If (ErrorLevel<>1) And (A_GuiWidth<>0)
{
    GuiControl,Move,ResultText,x0 y0 w%A_GuiWidth% h%A_GuiHeight%
}
Return

MenuHandler:
If (A_ThisMenuItemPos=1)
{
    nScale+=0.2
    TrayTip,,YScale:%nScale%
    Sleep 3000
    TrayTip,,
}
Else If (A_ThisMenuItemPos=2)
{
    nScale-=0.2
    TrayTip,,YScale:%nScale%
    Sleep 3000
    TrayTip,,
}
Else
{
    ExitApp
}    
Return
P.s:
if !ErrorLevel
Say, Level UP!

2 (изменено: OwnCorporation, 2013-08-03 18:22:58)

Re: AHK: Генератор 4 чисел.

В теории есть идея. Реализовать опыта нет.
1. PixelGetColor  - Сделать 10 точек по таким-то координатам.
2. Эти 10 точек он будет сравнивать с тем что имеет.
По принципу:
если 1 точка такого цвета, 2 точка такого цвета, 3 точка такого цвета, 4 точка такого цвета, 5 точка такого цвета, 6 точка такого цвета, 7 точка такого цвета, 8 точка такого цвета, 9 точка такого цвета, 10точка такого цвета,
то это цифра = (к примеру 8)

По мойму это будет короче, без фото. А раз "без фото" то должно быть быстрее в 2 раза полюбому.

P.s:
if !ErrorLevel
Say, Level UP!

3

Re: AHK: Генератор 4 чисел.

Изменил первый код:
сделал различие поиска "1" цифры и "2" "3" "4" цифры.
Находит полное число за 800 - 1500мс
Хотелось бы быстрее.

P.s:
if !ErrorLevel
Say, Level UP!

4 (изменено: Irbis, 2013-08-03 19:48:55)

Re: AHK: Генератор 4 чисел.

Время нахождения соответствия пропорционально размеру X*Y вырезанного изображения. Для ускорения лучше использовать минимально возможный кусок картинки, при котором не будет ложных срабатываний, то есть например "8" не будет приниматься за "3" и т.д. Можно поэкспериментировать со спрайтами шириной в 1-2 пикселя и высотой в цифру, и наоборот.

Если используешь Win7, проверь скорость с отключенным Aero.

Upd: Можешь пояснить смысл конструкции из поста #1 ?
      Видимо, в ней есть некий тайный смысл, мне не доступный.

loop {
    ...
    if !ErrorLevel
        {
break
        }
    if ErrorLevel
    break
}
...

5

Re: AHK: Генератор 4 чисел.

Irbis
Спасибо большое!
1. Можно по конкретней ? я так понимаю скорость будет что-то подобное 100мс
2. Убрал Aero - скорость стала 500-800
3. На скорую руку делал, убрал. Спасибо!
Сейчас все до делаю, и буду копать по первому вопросу.

P.s:
if !ErrorLevel
Say, Level UP!

6 (изменено: serzh82saratov, 2014-06-11 18:21:57)

Re: AHK: Генератор 4 чисел.

Заинтересовала задача. Попробовал сократить \ упростить код:

Вариант с областью под всё число (мне нравится больше):

 
#SingleInstance Force 
SetBatchLines -1 
SetWorkingDir %A_ScriptDir% 

Gui, Font, s99, Verdana
Gui, Add, Text, cGreen Border x0 y0, 3469
Gui, Show, x1 y1
Return

1:: 
 ; Эти координаты задают всю область поиска 
 ; т.е. после нахождения dollar2.png 
xStart := 0, yStart := 0, xEnd := 450, yEnd := 250
CountDigit := 4 ; Максимальная длинна искомого числа. -1 любая длинна.
START := A_TickCount, CountFound := 0, NumFound := Res := ""

Loop 10 
{
    NumSearch := A_Index-1, xStartPos := xStart
    Loop 
    {
        ImageSearch, xFound, , xStartPos, yStart, xEnd, yEnd, % NumSearch ".png" 
        If ErrorLevel 
            Break
        NumFound .= xFound ">" NumSearch "|", xStartPos := xFound+1, CountFound++
    }  Until CountFound = CountDigit 
} Until CountFound = CountDigit

NumFound := SubStr( NumFound, 1, -1)
Sort, NumFound, N D| 
Loop, parse, NumFound, |
    Res .= SubStr( A_LoopField, 0)
MsgBox,, % A_TickCount - START "ms", % Res 
Return

GuiClose:
    ExitApp  

 
Вариант с областью под каждую цифру (как у ТС):


#SingleInstance Force 
SetBatchLines -1 
SetWorkingDir %A_ScriptDir%

Gui, Font, s99, Verdana
Gui, Add, Text, cGreen Border x0 y0, 9876
Gui, Show, x1 y1
Return
     
2::
 ; Эти координаты задаются после нахождения dollar2.png 
xStart1 := 0, yStart1 := 0, xEnd1 := 150, yEnd1 := 250
xStart2 := 100, yStart2 := 0, xEnd2 := 250, yEnd2 := 250
xStart3 := 200, yStart3 := 0, xEnd3 := 350, yEnd3 := 250
xStart4 := 300, yStart4 := 0, xEnd4 := 450, yEnd4 := 250
START := A_TickCount, Res := ""
CountDigit := 4 ; Количество областей поиска.

Loop %CountDigit% 
{
    I := A_Index
    Loop 10 
    { 
        ImageSearch, , , xStart%I%, yStart%I%, xEnd%I%, yEnd%I%, % A_Index-1 ".png" 
        If ErrorLevel 
            Continue
        Res .= A_Index-1
        Break 
    }  
} 
    
MsgBox,, % A_TickCount - START "ms", % Res 
Return    
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7 (изменено: OwnCorporation, 2013-08-21 01:19:33)

Re: AHK: Генератор 4 чисел.

serzh82saratov
Не появлялся на форуме потому что,
решил перейти на C# и узнать больше про нейронные сети.
Чтобы осуществить чтение чисел. - (не вышло)
С# Очень трудный язык и выучить его за 2 недели просто не смог. Выучу чуть позже.

Сейчас поем и испробую все! Спс.

Еще забыл добавить, прыгну с парашютом в честь своего день рожденья.
Встречусь со своей девушкой. Съезжу на море в Крым. и Заберу человека с Ялты.

P.s:
if !ErrorLevel
Say, Level UP!

8 (изменено: OwnCorporation, 2013-08-21 02:21:20)

Re: AHK: Генератор 4 чисел.

serzh82saratov
О боги! Максимум 15-30мл(Размер одного числа 7х11(максимум))
Огромное спасибо!)
Испробовал 3 вариант скрипта который в архиве(почему то не получилось)
Попробовал 1 вариант скрипта(работает)
Но есть ошибка, почему то иногда перепрыгивает на другое число, если оно меньше.

К примеру число "6814" - (те числа которые я просматриваю они чучуть размыты(по другому никак!))
1. Оно видит 6(откладывает число 6)
Вот здесь происходит прыжок.
2. Видит число 1(откладывает число 1)
3. Видит число 4(откладывает число 4)
В итоге получается "614" пропускает одну цифру.
А вообще Результат супер.
Можешь пожалуйста объяснить красные строки ?:

NumFound .= xFound NumSearch "|" - Это непонятно!
xStart := xFound+1 ; xStart идет присвоение xFound+1 зачем ?
CountFound++ ; А здесь все ясно))

Sort, NumFound, N D| ; Происходит сортирование не понятно...
Loop, parse, NumFound, | ; происходит какой-то цикл
Res .= SubStr( A_LoopField, 0)
MsgBox,, % A_TickCount - START, % Res - здесь все ясно.

P.s:
if !ErrorLevel
Say, Level UP!

9

Re: AHK: Генератор 4 чисел.

Проблема решена!
Не находило число "8")
Безумно благодарен, я все нарадоваться не могу))

P.s:
if !ErrorLevel
Say, Level UP!

10

Re: AHK: Генератор 4 чисел.

NumFound .= xFound NumSearch "|" - Это непонятно!

Записывается Х координата найденного числа и само число в конце. В конце - чтобы не влиять на дальнейшую сортировку

xStart := xFound+1 ; xStart идет присвоение xFound+1 зачем ?

В xStart запись Х координаты +1. След. поиск этого же числа начнётся с позиции в которой это число было найдено перед этим + 1 пиксель. Тут можно прибавить больше для улучшения скорости, точно зная минимальную ширину картинки.

Sort, NumFound, N D| ; Происходит сортирование не понятно...

Сортируем подстроки по Х координатам, N - как цифры, D| через разделитель "|", чтобы они были слева на право. То есть суть алгоритма. Находя число, мы узнаем его координату в области, но незнаем какое оно по порядку в строке. Сортировка раставляет цифры на свои места.

Loop, parse, NumFound, | ; происходит какой-то цикл
    Res .= SubStr( A_LoopField, 0)

Вырезает последний символ в отсортированных подстроках

NumFound .= xFound NumSearch "|"

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

+ Для наглядности, проведи такую отладку:

Loop 10 {
    NumSearch := A_Index-1, xStartPos := xStart
    Loop {
        ImageSearch, xFound, , xStartPos, yStart, xEnd, yEnd, % NumSearch ".png"
        If ErrorLevel 
            Break
        NumFound .= xFound ">" NumSearch "|", xStartPos := xFound+1, CountFound++ 
        }  Until CountFound = CountDigit
    } Until CountFound = CountDigit
MsgBox % NumFound ; Результат всего цикла, переменная NumFound
Sort, NumFound, N D|  
MsgBox % NumFound ; Сортированная по координатам переменная NumFound
Loop, parse, NumFound, |
    MsgBox % Res .= SubStr( A_LoopField, 0) ; Смотри цикл
    
MsgBox,, % A_TickCount - START "ms", % Res  
Return

-----

Испробовал 3 вариант скрипта который в архиве(почему то не получилось)

Так и написано

serzh82saratov пишет:

В аттаче архив с картинками. Но у меня 125% шрифт, потому может неработать у других с моими картинками.

Там не 3, а 1 вариант в черновом виде.

Попробовал 1 вариант скрипта(работает)

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11 (изменено: OwnCorporation, 2013-08-21 14:24:56)

Re: AHK: Генератор 4 чисел.

serzh82saratov
Отладку провел и пронаблюдал.
То есть получается оно находит все числа по кординатам.(запоминает кординаты и число которое нашло в Num found)
Сортирует по кординатам от малых к большему.
Потом убирает кординаты и готово целое число.
Правильно ?

Так и написано
serzh82saratov пишет:
В аттаче архив с картинками. Но у меня 125% шрифт, потому может не работать у других с моими картинками.

Серьезно, думаешь я читать не умею ? Я делаю полную тишину чтобы вчитаться в каждое твое слово. И понять как ты додумался до этого и как ты это сделал!
Картинки я изменил в первую очередь.

1 вариант:

#SingleInstance Force 
SetBatchLines -1 
q::
ImageSearch, xStart, yStart, 499, 426, 542, 450, % A_ScriptDir "\newscan\newdollar2.png"

; форум

xEnd := 900, yEnd := 450
CountDigit := 4 ; Длинна искомого числа. -1 любая длинна.
START := A_TickCount, CountFound := 0, NumFound := Res := ""

Loop 10 {
    NumSearch := A_Index-1, xStartPos := xStart
    Loop {
        ImageSearch, xFound, , xStartPos, yStart, xEnd, yEnd, % A_ScriptDir "\newscan\" NumSearch ".png"
        If ErrorLevel 
            Break
        NumFound .= xFound ">" NumSearch "|", xStartPos := xFound+3, CountFound++
        }  Until CountFound = CountDigit 
    } Until CountFound = CountDigit
   

Sort, NumFound, N D|


Loop, parse, NumFound, |
    Res .= SubStr( A_LoopField, 0) 

MsgBox,, % A_TickCount - START, % Res 

Return

esc::ExitApp

Работает отлично !

Вариант 3:

#SingleInstance Force 
    ; Определяет, разрешено ли скрипту запускаться снова, если он уже выполняется.
SetBatchLines -1 

1::

ImageSearch, xStart, yStart, 499, 426, 542, 450, % A_ScriptDir "\newscan\newdollar2.png"

; форум

xEnd := 900, yEnd := 450

START := A_TickCount, CountFound := 0, NumFound := Res := ""
; 
Loop {
    NumSearch := A_Index-1, xFound := ErrorLevel := 0
    Loop {
        ImageSearch, xFound, , xStart, yStart, xEnd, yEnd, % A_ScriptDir "\newscan\" NumSearch ".png"
        If ErrorLevel
            Break
        NumFound .= xFound NumSearch "|", xStart := xFound+1, CountFound++
    }
    If (CountFound = 4 || NumSearch = 9)
        Break
    }
    
Sort, NumFound, N D|

Loop, parse, NumFound, |
    Res .= SubStr( A_LoopField, 0) 

MsgBox,, % A_TickCount - START, % Res 
return

esc::ExitApp

Работает средне!
Перепрыгивает на следующие числа.
Как здесь

К примеру число "6814" - (те числа которые я просматриваю они чучуть размыты(по другому никак!))
1. Оно видит 6(откладывает число 6)
Вот здесь происходит прыжок.
2. Видит число 1(откладывает число 1)
3. Видит число 4(откладывает число 4)
В итоге получается "614" пропускает одну цифру.

Но в этот раз я знаю что с картинками все в порядке.

(как у ТС):

Кто такой ТС ?

P.s:
if !ErrorLevel
Say, Level UP!

12

Re: AHK: Генератор 4 чисел.

Вот он. (и даже не благодари )

13 (изменено: serzh82saratov, 2013-09-23 12:44:46)

Re: AHK: Генератор 4 чисел.

То есть получается оно находит все числа по кординатам.(запоминает кординаты и число которое нашло в Num found)
Сортирует по кординатам от малых к большему.
Потом убирает кординаты и готово целое число.
Правильно ?

Да, всё очень просто.

Вариант 3:...Работает средне!
Перепрыгивает на следующие числа.

serzh82saratov пишет:

Там не 3, а 1 вариант в черновом виде.

Забей на него, в архиве первый вариант, видимо недопиленный.

(как у ТС):

У тебя твой алгоритм выделяет области под каждую цифру, мой 2 вариант работает также, попробуй и его.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui