Что нового

Проблема поиска n количества изображений при помощи ImageSearch

auxiliary

Новичок
Сообщения
2
Репутация
0
Доброго времени суток, уважаемые форумчане.

Пишу бота для одной онлайн-игры. В процессе написания столкнулся со следующей проблемой: необходимо найти все изображения данного типа и старательно их обкликать. из-за специфики игры пришлось выбрать использование ImageSearch в качестве инструмента по поиску картинок. И тут я уперся в тупик, поскольку ImageSearch находит только одно изображение.

Что необходимо: при помощи ImageSearch найти все изображения данного типа и внести данные о них в массив.

Что не получается: найти более одного изображения (ImageSearch находит стабильно одно).

Пришедшие в голову варианты решения: разбиение зоны поиска на квадраты, последовательная их обработка. Повторное разбиение зоны на квадраты со смещением для того, чтобы проверить места стыков квадратов в первой итерации.

Вопрос: как еще можно решить данную проблему?
 

mousekey

вот он какой, серверный олень
Сообщения
8
Репутация
5
Я тоже столкнулся с такой траблой, думаю вот как эту всю фигню делить на зоны. Если изображения выставлены по одинаковой высоте-ширине, то тут особых проблем нет - находим перое и от его начальных координат начинаем искать справа второе, как находим второе - переносим координаты поиска, как дошли до конца ряда - переходим на 2й ряд и все повторяем.

А вот если изображения раскиданы в случайном порядке - надо думать над размером этой зоны. Имхо если делить их на равне части - всегда найдется изображение, которое окажется на границе зон и при первом и при втором проходе. Либо найдутся изображения, которые оба будут целиком в зоне при обоих проходах, и найдется только одно из них :smile:
Тут над как-то ширить просканенные границы от текущего найденного изображения. Как - я пока точно не представляю.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Теоретически, исходя из специфики работы библиотеки, при нахождении нужного изображения, следующее нужное изображение может появиться не раньше чем x,y левого верхнего угла предыдущего изображения + его ширина по x. Это позволяет вам сделать нормальный продолжающийся поиск как например в PixelSearchEx, остается только грамотно задать саму исходную картинку для поиска.
 

Whited

Знающий
Сообщения
79
Репутация
10
auxiliary [?]
Вопрос: как еще можно решить данную проблему?

Я утвердительно решил не использовать ImageSearch и написал функцию, которая использует PixelSearch и немного похожа на PixelSearchEx, но своя специфика. ImageSearch может давать сбои, и не разберешься что к чему. советую отказаться от неё, и использовать что то своё, там и зоны сможешь сделать и что хочешь.
 
Автор
A

auxiliary

Новичок
Сообщения
2
Репутация
0
Всем спасибо за ответы.

Почитал, подумал, решил действовать методом исключения - после нахождения первого изображения его местонахождения (площадь изображения) исключается из зоны поиска. Реализовывать буду при помощи ImageSearchArea.

Сейчас думаю над верным алгоритмом поиска =)
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Я в ботах не особо разбираюсь, но, стало интересно, используется ли разложение картинки (снимка экрана) на текстовую строку для нахождения одинаковых изображений?
Есть ли смысл в обработке изображений текстовыми функциями?

Допустим, есть основная картинка и маленькая, координаты которой относительно большой нужно найти (см вложение).
Пример:
Код:
#include <GDIPlus.au3>
#include <Array.au3>

_GDIPlus_Startup()
$hBitmap = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\1.png')
$Width = _GDIPlus_ImageGetWidth($hBitmap)
$Height = _GDIPlus_ImageGetHeight($hBitmap)
$tMap = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $Width, $Height, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
$bData1 = DllStructGetData(DllStructCreate('byte[' & ($Width * $Height * 4) & ']', DllStructGetData($tMap, 'Scan0')), 1)
_GDIPlus_BitmapUnlockBits($hBitmap, $tMap)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
$bData1 = StringTrimLeft($bData1, 2)

$countstring=StringMid($bData1,1,$Width * 8)
;ConsoleWrite($countstring & @CR)

_GDIPlus_Startup()
$hBitmap = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\3.png')
$Width = _GDIPlus_ImageGetWidth($hBitmap)
$Height = _GDIPlus_ImageGetHeight($hBitmap)
$tMap = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $Width, $Height, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
$bData2 = DllStructGetData(DllStructCreate('byte[' & ($Width * $Height * 4) & ']', DllStructGetData($tMap, 'Scan0')), 1)
_GDIPlus_BitmapUnlockBits($hBitmap, $tMap)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_Shutdown()
$bData2 = StringTrimLeft($bData2, 2)
;ConsoleWrite($bData & @CR)

For $i = 1 To 100
	$sTring1 = StringInStr($bData2, $countstring , 0, $i) - 1 ; поиск по верхней строке 
	If $sTring1 > 0 Then
		$y = Floor($sTring1 / ($Width * 8))
		$x = ($sTring1 - $y * 8 * $Width) / 8
		ConsoleWrite($x & ' ' & $y & @CR)
	Else
		ExitLoop
	EndIf
Next


Естественно, все упирается в правильный выбор подстроки из пикселей для поиска...
 
Верх