1

Тема: AHK: Поиск из нескольких изображений и "запоминание" данных.

Вопрос, вероятно, банальный, но в поиске не нашел.
Нужно проверить таблицу 12*5 ячеек, и в случае совпадения с одним из изображений (их порядка 30 разных) совершить действие. Так же нужно ассоциировать нахождение с каким-либо параметром (условно в результате должно получится, что при нахождение нужных изображений происходит клик мыши, а в итоге выводится таблица - найдено 4 совпадений X, 5 Y и 3 Z.
Сейчас скрипт на этом этапе


^2::
HolderCellHeightMin := 1272 ;начальная точка по горизонтали
HolderCellHeightMax := HolderCellHeightMin + 52.5 ;конечная точка по горизонтали
CurrencyCell := 0 ;количество нахождений
Loop, 12 ;цикл на 12 ячеек по горизонтали
{    
HolderCellWidthMin  := 588 ;начальная точка по вертикали
HolderCellWidthMax  := HolderCellWidthMin + 52.5 ;конечная точка по вертикали
    
    ImageSearch, FoundX, FoundY, HolderCellHeightMin, HolderCellWidthMin, HolderCellHeightMax, HolderCellWidthMax, *75 chaos.tif ;ищем в ячейке 52*52 картинку, координаты даются при нахождении
    /*  
    if Errorlevel = 0
    {
        CurrencyCell := CurrencyCell + 1 
        MsgBox %CurrencyCell%, %HolderCellHeightMax%   
    } 
    */
    Loop, 5
     {
  ImageSearch, FoundX, FoundY, HolderCellHeightMin, HolderCellWidthMin, HolderCellHeightMax, HolderCellWidthMax, *125 chaos.tif
  if Errorlevel = 0 
      {
      CurrencyCell := CurrencyCell + 1
 ;     MsgBox координаты ячейки по вертикали %HolderCellWidthMin%, %HolderCellWidthMax%
      }
    HolderCellWidthMin := HolderCellWidthMin + 52.5
    HolderCellWidthMax := HolderCellWidthMax + 52.5
    }

    HolderCellHeightMin := HolderCellHeightMin + 52.5 ;начальную точку по горизонтали переводим на следующую ячейку
    HolderCellHeightMax := HolderCellHeightMax + 52.5 ;конечную  точку по горизонтали переводим на следующую ячейку
}
MsgBox координаты ячейки по горизонтали %HolderCellHeightMin%, %HolderCellHeightMax%. Число совпадений %CurrencyCell%.
Return

Вероятно, что все это нужно загнать в функцию с подставлением изображения в качестве переменной (не знаю как), но учитывая, что 1 картинку скрипт обрабатывает порядка секунды, увеличение этого количества до 30 даст соответствующее количество секунд на выполнение. А хотелось бы уложиться в 3-5 секунд.

Кроме того, мне совершенно не нравится объемность кода, учитывая, что действия простые и наверяка можно как то сократить.
Заранее спасибо.

2 (изменено: lngvar, 2019-02-08 02:01:52)

Re: AHK: Поиск из нескольких изображений и "запоминание" данных.


loop	
{
img:="img". A_Index . ".tif"
ImageSearch, FoundX, FoundY, HolderCellHeightMin, HolderCellWidthMin, HolderCellHeightMax, HolderCellWidthMax, *125 %img%
}

как то так
делаешь картинки с изменяющейся в названии последней цифры.

Ты уверен что тебе нужна вариация *125 ? Это очень много. Это в десятки раз замедляет поиск.
Подбери методом проб и ошибок минимальное значение. И ты удивишься насколько быстрым окажется поиск.
Я не уверен, но мне кажется, что было бы разумнее искать картинки в bmp или png.

3

Re: AHK: Поиск из нескольких изображений и "запоминание" данных.

lngvar
Спасибо. Этот вопрос в общем то решил. И да, 125 много, оставлял на время теста, хватает 20.
Теперь столкнулся с проблемкой, что вручную резать картинки крайне лень, а придумать скрипт который сам это делает по координатам что то не могу. На форуме вроде натыкался один раз, а сейчас найти не могу(

4 (изменено: lngvar, 2019-02-15 14:36:21)

Re: AHK: Поиск из нескольких изображений и "запоминание" данных.

Я не очень силен в ahk. Потому не претендую что этот способ является оптимальным, но именно так я решил свою задачу по сохранению изображения в файл.
Где-то выдернул этот код, есть масса примеров если поискать.


#include gdip.ahk
.
.
Screenshot(outfile, screen)
{
	pToken := Gdip_Startup()
	pBitmap := Gdip_BitmapFromScreen(screen)
	Gdip_SaveBitmapToFile(pBitmap, outfile, 100)
	Gdip_DisposeImage(pBitmap)
	Gdip_Shutdown(pToken)
}

; Вызов 
str= %xx%|%yy%|50|10    ; xx,yy  - левый верхний угол .   дальше размеры картинки в пикселях для примера.
 Screenshot(name_file ".png", str)     ; тут можно динамически подставлять имя файла или просто задать, что бы был один и тот же.

скачать gdip.ahk -  для работы с графикой он по любому пригодится.