Перейти к содержимому
Compvision.ru
lliypuk87

Поиск паттерна с помощью matchtemplate на картинке с разным разрешенимием

Recommended Posts

Добрый день! Совсем недавно познакомился ComputerVision и openCV. Поэтому прошу делать скидку на мою неразумность в этих вопросах. 

 

Задача следующая, получая скриншот экрана, икать на нем некий паттерн(логотип например). Для этого использую matchtemplate

 

Столкнулся с следующей проблемой:

Если я подготовлю паттерн с картинки разрешения которой например 700х443, то все проходи гладко(паттерн был вырезан именно с картинки имеющей разрешение 700х443). 

 

Как только изображение получается другого разрешение(зависит от разрешения экрана), например получилось 700х445, то ничего не находит.

 

Я пишу на c#, используя wrapper opencvsharp.

 

Перед matchtemplate, перевожу картику и паттерн в GrayScale. Опыт показал, что результаты заметно лучше. Метод CV_TM_SQDIFF_NORMED

 

Что-то читал, но к сожалению плохо понял про пирамиды изображений. Думаю вроде как, нужно сделать пирамиду паттернов, разных размеров, например с минимального до максимального, изменяя размер на 1px. Потом циклом пробовать сделать matchtemplate по всей пирамиде, но не уверен, что мои размышления верны.

 

 

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

 

Если выдал не всю необходимую информацию или что-то не понятно, пишите, буду рад расписать все согласно ваших уточнений.

 

Очень нужна ваша помощь, за ранее спасибо! 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для начала, нужно отмасштабировать входную картинку, так чтобы размер шаблона не менялся. Если объект все время одного масштаба, то этого должно хватить.

 

ЗЫ: изменение разрешения на 1-2 пикселя не должно срывать детект.

 

ЗЫЗЫ: приведите, если можно, изображение где находит, шаблон, и изображение где уже не находит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

если речь  о  logo detection , искать через кросскореляцию используя темплейт не очень хороший метод, т.к. придется делать много темплейтов с разным размером или иметь несколько скейлов картинки, нет инвариантности к повороту.

 

есть методы на SIFT, есть методы основанные на машинном обучении рамочного детектора, но они тоже не быстрые если не используется каскад.

 

formula1.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем спасибо за ответы.

 

Распишу задачу более подробно. Есть игра, когда заканчивается партия, выводится экран, на котором написано, что вы проиграли или выиграли и разное оформление этого экрана. Программа запущенная в фоне делает скриншот, каждую секунды. Необходимо с помощью openCV или любой другой библиотеки понять, что на скриншоте, игра, экран поражения или экран победы. 

 

В качестве паттерна вырезал саму надпись "поражение", но по хорошему это должен быть любой другой элемент, который присутствует только на скриншоте поражения. 

 

 

 

Для начала, нужно отмасштабировать входную картинку, так чтобы размер шаблона не менялся. Если объект все время одного масштаба, то этого должно хватить.

 

При изменение рарешения картинка видео изменяется, может стать вытянутая или элементы станут меньше. Все это наверно решаемо. Вытянутость можно разрешить путем нормализации разрешения, а уменьшение элементов - постепенным масштабирование картинки. Но мне кажется, это изобретение велосипеда и с помощью Computer Vision можно решить эту проблему иначе.

 

Приведу примеры картинок:

Паттерн по которому ищу. 

a2313a426f2a.jpg

 

Скриншот №1. С него вырезан паттерн, все проходит на ура.

c9dfee2a558a.jpg

 

Скриншот №2. Картинка стала слегка вытянута, ничего не находит

e41523cf6b20.jpg

 

Скриншот №3. Увеличенное разрешение привело к уменьшению элементов. Паттерн не находит. 

062717e453c6.jpg

 

 

Не сомневаюсь, что возможно способ решения моей задачи выбран не верно. Надеюсь на вашу помощь в выборе правильного

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

если речь  о  logo detection , искать через кросскореляцию используя темплейт не очень хороший метод, т.к. придется делать много темплейтов с разным размером или иметь несколько скейлов картинки, нет инвариантности к повороту.

 

Я уже понял, что способ решения моей задачи выбран не верно.

 

 

 

есть методы на SIFT, есть методы основанные на машинном обучении рамочного детектора, но они тоже не быстрые если не используется каскад.

 

Попробую погуглить-почитать информацию, если есть возможность дать еще дельный совет, буду очень рад.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно конечно обучить openCV каскаду Хаара, что бы находил поражение на скриншоте. Потом обучить что-бы находил победу. Но это же забивание гвоздей с помощью микроскопа ... или нет? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну с картинок и надо было начинать.

 

Тут всё проще, используйте просто попиксельную разность, даже темплейт матчинг не нужен.

 

И вообще странно что изменениее ширины картинки на 2 пикселя всё так координально меняет, там же выдается величина пика, просто она должна быть меньше.

 

Я так понял что всё не работает только из-за разного разрешения и разного размера окна?

google-> c# get resolution of screen

И по идее можно получить хэндл на окно и потом посмотреть у него размеры

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499%28v=vs.85%29.aspx

http://stackoverflow.com/questions/637819/find-window-height-width

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В новой версии OpenCV появились еще дескрипторы AKAZE:

 

 

Пример использования наличествует и называется (TUTORIAL) AKAZE_match.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Тут всё проще, используйте просто попиксельную разность, даже темплейт матчинг не нужен.

 

Интересная мысль, но боюсь ложных срабатываний. Картинка бывает светлее или темнее + герой по середине может быть разный(на примере представлено две вариации). 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пример есть в новой версии исходников OpenCV:

Я нашел у себя на диске по адресу: opencv\samples\cpp\tutorial_code\features2D\

 

Вот также ссылка на GitHub: https://github.com/Itseez/opencv/tree/master/samples/cpp/tutorial_code/features2D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

К сожалению не удается попробовать дескрипторы AKAZE, потому как пишу я на C# используя wrapper(теперь уже EmguCV http://www.emgu.com/wiki/index.php/Main_Page, в отличие от opencvsharp, у EmguCV отличное описание), но пока самая старшая версия 2.9 и насколько понимаю OpenCV там также 2.9, по крайней мере ничего не нашел в wiki EmguCV по поводу дескрипторы AKAZE.

 

Попробовал для своих целей использовать SURF feature detector, по предварительным тестам - все просто супер! Все определяет точно, даже если разрешение экрана стало супер широкое или наоборот узкое и картинка сильно искажена. 

 

вот ссылка на мануал SURF feature detector в EmguCV(http://www.emgu.com/wiki/index.php/SURF_feature_detector_in_CSharp)

 

Позже отпишусь по поводу конечных результатов

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

SURF - это ускоренная и менее точная версия SIFT. Есть и очень быстрый вариант SURF, но с пониженной точностью к поворотам - до 15 градусов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть ложные срабатывания, оцениваю через HomographyMatrix MinMax значения, определив для себя опытным путем необходимые значения, но переодически все-таки бывают ложные срабатывания, что говорит, о том что способ оценки выбран не верно. Если посмотреть на обрисованные точки, то на ошибочных видно, что точек мало. Как оценивать результат поиска по SURF? 

 

Пример оценки по HomographyMatrix MinMax значениям. 

 

Пример №1. Правильно определенный скрин, много точек.

fc189b601abe.jpg

 

2. Правильно определенный скрин, точек меньше(другой паттерн)

0c7f2498fc8b.jpg

 

3. Не верно определенный скрин, видно, что точек мало(4)

98c7095836e1.jpg

 

Прошу извинить меня за мою не верную терминологию. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну так и оценивай!

1. По числу точек.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я думал вы текст ищете победа\поражение

 

Определять можно по кол-ву пар точек и еще вот про проверку матрицы гомографии

http://stackoverflow.com/questions/14954220/how-to-check-if-obtained-homography-matrix-is-good/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×