VadimCoder
@VadimCoder

Как найти одно изображение на другом изображении?

Мне надо, чтобы программа находила конкретный обьект на скриншоте, и возвращала его координаты. Обьект это другое изображение, которое лежит в папке с программой. Программа должна находить обьект, даже если он повернут под углом и другого цвета. Как это реализовать на Python? Готов изпользовать сторонние библиотеки и готовые решения.
!!! ОБЬЕКТОВ БУДЕТ МНОГО !!!

6147215a778a2582220472.png вот это скриншот.
614721756f7ad919391640.png а это программа должна найти.
  • Вопрос задан
  • 1189 просмотров
Решения вопроса 1
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Терминология для гуглинга: "Локализация объекта методами компьтерного зрения".
В качестве инструментария можешь использовать opencv. Для питона это pip пакет python-opencv (импортируется под именем cv2).

Чтобы обойти проблему цвета, переведи входное изображение в оттенки серого, и потом, если оптребуется, добавь пороговое преобразование, чтобы оставить только чёрный и белый.

Подходы существуют разные. Если не требуется дикоре быстродействие, то можно использовать детектор SIFT.
Тогда у тебя будет алгоритм вида:
0. Создаёшь детектор (функция cv2.SIFT.create()) и матчер (можно cv2.BFMatcher(), он тормознутый но простой в использовании).
1. Грузишь образец искомого объекта и преобразуешь изображения (палитра серого, и т.п.)
2. Вызываешь метод детектора .detectAndCompute(), чтобы получить найденные особые точки (углы и т.п.) и их описание.
3. Повторяешь шаги 1,2 для анализируемого изображения (сцены).
4. У матчера вызываешь метод .knnMatch() c n=2. Это даст тебе 2 лучших совпадения между образцом и сценой по каждой особой точке.
5. Можно просто брать лучшее совпадение, а можно отсеять те особые точки, у которых два ближайших совпадения слишком похожи - они отсеялись.
Так или иначе, у тебя должен получиться список пар точек вида "точка на образце - найденная похожая точка на сцене".
6. Используешь функцию cv2.findHomography() или одну из родственных ей, чтобы найти матрицу преобразования. Грубо говоря, она позволит пересчитать позицию пикселя на изображении образца в позицию пикселя на изображении сцены.
Примерно так, если представить это наглядно (чтобы получить такую картинку, нужно еще несколько шагов, но она передаёт идею).
homography_findobj.jpg
7. Дальше ты можешь использовать эту матрицу как хочешь. Например, возьми координаты центра объекта на изображении-образце, и используй её вместе с cv2.perspectiveTransform(), чтобы найти, где на сцене координаты точки центра объекта. Взяв ещё точку (в углу или на краю), сможешь найти ориентацию.

Проблема в том, что этот подход работает ТОЛЬКО если в сцене не более одного похожего объекта.

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

Войдите, чтобы написать ответ

Похожие вопросы