lliypuk87 0 Жалоба Опубликовано November 27, 2014 Добрый день! Совсем недавно познакомился ComputerVision и openCV. Поэтому прошу делать скидку на мою неразумность в этих вопросах. Задача следующая, получая скриншот экрана, икать на нем некий паттерн(логотип например). Для этого использую matchtemplate Столкнулся с следующей проблемой: Если я подготовлю паттерн с картинки разрешения которой например 700х443, то все проходи гладко(паттерн был вырезан именно с картинки имеющей разрешение 700х443). Как только изображение получается другого разрешение(зависит от разрешения экрана), например получилось 700х445, то ничего не находит. Я пишу на c#, используя wrapper opencvsharp. Перед matchtemplate, перевожу картику и паттерн в GrayScale. Опыт показал, что результаты заметно лучше. Метод CV_TM_SQDIFF_NORMED Что-то читал, но к сожалению плохо понял про пирамиды изображений. Думаю вроде как, нужно сделать пирамиду паттернов, разных размеров, например с минимального до максимального, изменяя размер на 1px. Потом циклом пробовать сделать matchtemplate по всей пирамиде, но не уверен, что мои размышления верны. Подскажите, можно ли решить мою задачу с помощью пирамиды(желательно с примером, на любом языке) или любой другой вариант нахождения картинки с наличием моего паттерна. Если выдал не всю необходимую информацию или что-то не понятно, пишите, буду рад расписать все согласно ваших уточнений. Очень нужна ваша помощь, за ранее спасибо! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 27, 2014 Для начала, нужно отмасштабировать входную картинку, так чтобы размер шаблона не менялся. Если объект все время одного масштаба, то этого должно хватить. ЗЫ: изменение разрешения на 1-2 пикселя не должно срывать детект. ЗЫЗЫ: приведите, если можно, изображение где находит, шаблон, и изображение где уже не находит. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано November 28, 2014 если речь о logo detection , искать через кросскореляцию используя темплейт не очень хороший метод, т.к. придется делать много темплейтов с разным размером или иметь несколько скейлов картинки, нет инвариантности к повороту. есть методы на SIFT, есть методы основанные на машинном обучении рамочного детектора, но они тоже не быстрые если не используется каскад. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lliypuk87 0 Жалоба Опубликовано November 28, 2014 Всем спасибо за ответы. Распишу задачу более подробно. Есть игра, когда заканчивается партия, выводится экран, на котором написано, что вы проиграли или выиграли и разное оформление этого экрана. Программа запущенная в фоне делает скриншот, каждую секунды. Необходимо с помощью openCV или любой другой библиотеки понять, что на скриншоте, игра, экран поражения или экран победы. В качестве паттерна вырезал саму надпись "поражение", но по хорошему это должен быть любой другой элемент, который присутствует только на скриншоте поражения. Для начала, нужно отмасштабировать входную картинку, так чтобы размер шаблона не менялся. Если объект все время одного масштаба, то этого должно хватить. При изменение рарешения картинка видео изменяется, может стать вытянутая или элементы станут меньше. Все это наверно решаемо. Вытянутость можно разрешить путем нормализации разрешения, а уменьшение элементов - постепенным масштабирование картинки. Но мне кажется, это изобретение велосипеда и с помощью Computer Vision можно решить эту проблему иначе. Приведу примеры картинок: Паттерн по которому ищу. Скриншот №1. С него вырезан паттерн, все проходит на ура. Скриншот №2. Картинка стала слегка вытянута, ничего не находит Скриншот №3. Увеличенное разрешение привело к уменьшению элементов. Паттерн не находит. Не сомневаюсь, что возможно способ решения моей задачи выбран не верно. Надеюсь на вашу помощь в выборе правильного Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lliypuk87 0 Жалоба Опубликовано November 28, 2014 если речь о logo detection , искать через кросскореляцию используя темплейт не очень хороший метод, т.к. придется делать много темплейтов с разным размером или иметь несколько скейлов картинки, нет инвариантности к повороту. Я уже понял, что способ решения моей задачи выбран не верно. есть методы на SIFT, есть методы основанные на машинном обучении рамочного детектора, но они тоже не быстрые если не используется каскад. Попробую погуглить-почитать информацию, если есть возможность дать еще дельный совет, буду очень рад. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lliypuk87 0 Жалоба Опубликовано November 28, 2014 Можно конечно обучить openCV каскаду Хаара, что бы находил поражение на скриншоте. Потом обучить что-бы находил победу. Но это же забивание гвоздей с помощью микроскопа ... или нет? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано November 28, 2014 Ну с картинок и надо было начинать. Тут всё проще, используйте просто попиксельную разность, даже темплейт матчинг не нужен. И вообще странно что изменениее ширины картинки на 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 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 28, 2014 В новой версии OpenCV появились еще дескрипторы AKAZE: Пример использования наличествует и называется (TUTORIAL) AKAZE_match. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lliypuk87 0 Жалоба Опубликовано November 29, 2014 В общем проблему с изменением разрешения картинки решил через понижение чувствительности фильтра и использую несколько паттернов для поиска, в целом результаты удовлетворительны. Очень заинтересовал AKAZE_match, но что-то не могу ничего кроме исходников нагуглить, а хотелось ты увидеть TUTORIAL, поделитесь ссылкой? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lliypuk87 0 Жалоба Опубликовано November 29, 2014 Тут всё проще, используйте просто попиксельную разность, даже темплейт матчинг не нужен. Интересная мысль, но боюсь ложных срабатываний. Картинка бывает светлее или темнее + герой по середине может быть разный(на примере представлено две вариации). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lliypuk87 0 Жалоба Опубликовано November 29, 2014 Нашел туториал по AKAZE http://docs.opencv.org/trunk/doc/tutorials/features2d/akaze_matching/akaze_matching.html Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 29, 2014 Пример есть в новой версии исходников OpenCV: Я нашел у себя на диске по адресу: opencv\samples\cpp\tutorial_code\features2D\ Вот также ссылка на GitHub: https://github.com/Itseez/opencv/tree/master/samples/cpp/tutorial_code/features2D Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lliypuk87 0 Жалоба Опубликовано December 1, 2014 К сожалению не удается попробовать дескрипторы 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) Позже отпишусь по поводу конечных результатов Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано December 1, 2014 SURF - это ускоренная и менее точная версия SIFT. Есть и очень быстрый вариант SURF, но с пониженной точностью к поворотам - до 15 градусов. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lliypuk87 0 Жалоба Опубликовано December 1, 2014 Есть ложные срабатывания, оцениваю через HomographyMatrix MinMax значения, определив для себя опытным путем необходимые значения, но переодически все-таки бывают ложные срабатывания, что говорит, о том что способ оценки выбран не верно. Если посмотреть на обрисованные точки, то на ошибочных видно, что точек мало. Как оценивать результат поиска по SURF? Пример оценки по HomographyMatrix MinMax значениям. Пример №1. Правильно определенный скрин, много точек. 2. Правильно определенный скрин, точек меньше(другой паттерн) 3. Не верно определенный скрин, видно, что точек мало(4) Прошу извинить меня за мою не верную терминологию. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано December 1, 2014 Ну так и оценивай! 1. По числу точек. 2. По степени их "компактности". То есть если точки находятся не в некоторой небольшой окрестности, а по всему изображению, то соответствие найдено неправильно. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lliypuk87 0 Жалоба Опубликовано December 1, 2014 О как) А можете привести пример на C++ как это делается? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано December 1, 2014 Думаю этого хватит: http://docs.opencv.org/doc/tutorials/features2d/table_of_content_features2d/table_of_content_features2d.html Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
lliypuk87 0 Жалоба Опубликовано December 1, 2014 Буду пробовать, спасибо всем за ответы. Отпишусь по результатам Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано December 4, 2014 Я думал вы текст ищете победа\поражение Определять можно по кол-ву пар точек и еще вот про проверку матрицы гомографии http://stackoverflow.com/questions/14954220/how-to-check-if-obtained-homography-matrix-is-good/ Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах