Что нового

Алгоритм поиска картинки с допустимым отклонением

ArtistTo

Новичок
Сообщения
42
Репутация
2
Существует библиотека ImageSearch.dll, она находит картинку на экране с допустимым цветовым несовпадением, максимальное несовпадение 255, находит очень быстро за какие-то доли секунды... Вопрос: что за алгоритм использует эта библиотека?!

Если реализовать алгоритм поиска изображения, еще и с допустимым несовпадением всем пикселей +-, то такой алгоритм будет выполняться несколько часов или даже дней... Как библиотека находит так быстро?
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Я как-то писал библиотеку.
Код:
ImageSearch(hSource,    ; Исходная картинка.
          hFind,        ; Картинка которую будем искать.
          SearchCount,  ; Сколько совпадений нужно найти.
          deviation)    ; Совпадение пикселей в процентах.
Время поиска зависит от размеров картинок. Поиск картинки 100х100 пикселей на экране, занимал максимум несколько секунд.
 

Yura

Знающий
Сообщения
36
Репутация
7
Если вам интересно, то исходник ImageSearch написан на с++ и лежит в интернете в свободном доступе (если не можете найти- я вам могу его сбросить в личку), посмотрите сами алгоритм. Мне это не надо пока что, я не смотрел.
Алгоритм поиска картинки я делал в AutoIt. Обычным попиксельным перебором: программа ищет на скриншоте экрана пиксель (слева направо, сверху вниз), который с допустимым отклонением по цвету совпадает с цветом пикселя верхнего левого угла искомой картинки; нашла -> проверяет следующий пиксель и т.д.- при полном совпадении выдает результат - картинка найдена; совпадения нету -> ищет следующий пиксель, который по цвету совпадает с пикселем левого верхнего угла картинки. Первый пиксель искал с помощью библиотеки FastFind (а это очень нерационально, потому что она каждый раз проверяет все пиксели на экране, те что проверила при прошлой проходке- проверяет опять). Из картинки, которую надо найти, перед поиском вытаскивал в массив цвета пикселей. Для поиска с отклонением по цвету надо сравнивать отдельно каждую компоненту цвета. Вместе со скриншотом поиск на экране занимал у меня максимум 0,3с при таком нерациональном алгоритме. Если весь алгоритм реализовать на с++ или другом компилируемом яп, то скорость поиска поднимется на порядок - и будет+- как у ImageSearch. Это от меньше милисекунды до нескольких десятков милисекунд. Если при таком алгоритме поиска вы будете искать картинку черного прямоугольника с 1 белым пикселем в правом нижнем углу этой картинки на экране, где все пиксели тоже черные, а искомая картинка в правом нижнем углу экрана - ну то вы будете сам себе злобный буратино и заставите программу проверить кучу раз все пиксели)))) может тогда и секунда набежит)) И, конечно, можно сделать поиск получше, чем просто перебор всего подряд.
 
Верх