Нечеткое совпадение шаблонов? - программирование
Подтвердить что ты не робот

Нечеткое совпадение шаблонов?

Я пытаюсь обернуть вокруг себя основы CV. Бит, который изначально заинтересовал меня, - это сопоставление шаблонов (это было упомянуто в разговоре Pycon, не связанного с CV), поэтому я решил, что начну там.

Я начал с этого изображения:

Scene from SMB3

Из чего я хочу обнаружить Марио. Поэтому я вырезал его:

The Plumber

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

def match_template(img, template):
    s = time.time()
    img_size = cv.GetSize(img)
    template_size = cv.GetSize(template)

    img_result = cv.CreateImage((img_size[0] - template_size[0] + 1, 
                            img_size[1] - template_size[1] + 1), cv.IPL_DEPTH_32F, 1)
    cv.Zero(img_result)

    cv.MatchTemplate(img, template, img_result, cv.CV_TM_CCORR_NORMED)
    min_val, max_val, min_loc, max_loc = cv.MinMaxLoc(img_result)
    # inspect.getargspec(cv.MinMaxLoc)
    print min_val
    print max_val 
    print min_loc 
    print max_loc
    cv.Rectangle(img, max_loc, (max_loc[0] + template.width, max_loc[1] + template.height), cv.Scalar(120.), 2)
    print time.time() - s
    cv.NamedWindow("Result")
    cv.ShowImage("Result", img)
    cv.WaitKey(0)
    cv.DestroyAllWindows()

До сих пор так хорошо, но потом я понял, что это невероятно хрупко. Он только найдет Марио с этим конкретным фоном, и будет отображаться конкретный анимационный кадр.

Итак, мне любопытно, учитывая, что у Марио всегда будут те же атрибуты Mario-ish (размер, цвета), есть техника, с которой я мог бы найти его независимо от того, стоит ли его currect frame стоять или один из различные спрайты цикла цикла? Вид вроде нечеткого соответствия, который вы можете использовать для строк, но для изображений.

Может быть, так как он единственная красная вещь, есть способ просто отслеживать красные пиксели?

Вся другая проблема заключается в удалении фона из шаблона. Может быть, это поможет функции MatchTemplate найти Марио, хотя он точно не соответствует tempate? На данный момент я не совсем уверен, как это сработает (я вижу, что в MatchTemplate есть параметр маски, но мне нужно будет продолжить исследование)

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

Обновление:

Попытки сопоставления других Marios


Уходя от предложения mmgp о том, что он должен быть работоспособен для соответствия другим вещам, я провел пару тестов.

Я использовал это как шаблон для соответствия:

Super mario

И затем взял пару снимков экрана, чтобы проверить соответствие.

Во-первых, я успешно нашел Марио и получил максимальное значение 1.

enter image description here

Однако попытка найти прыжок Марио приводит к полному пропуску.

Misfire

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

Обратите внимание, что максимальное значение для этого параметра было 0.728053808212.

Затем я попробовал сцену без марио, чтобы посмотреть, что произойдет.

enter image description here

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

Действительно странно! Я не знаю реальных деталей базового алгоритма, но я бы предположил, что с точки зрения стандартного отклонения ящики в сцене, которые, по крайней мере, соответствуют красному шаблону Марио, будут ближе к среднему расстоянию, чем синий платформе, не так ли? Таким образом, это лишнее сбивает с толку, что это даже не в общей области, где я ожидал бы этого.

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

Почему сцена с похожим Марио имеет столько же, что и сцена без марио?

4b9b3361

Ответ 1

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

Например, вот результаты, которые я получаю, используя сопоставление шаблонов (красные прямоугольники) - все они используют шаблон http://i.stack. imgur.com/EYs9B.png, даже последний:

enter image description hereenter image description hereenter image description hereenter image description here

Для этого я начал с рассмотрения только красного канала как шаблона, так и входного изображения. Из этого мы легко вычислим внутренний морфологический градиент и только тогда выполним сопоставление. Чтобы не получить прямоугольник, когда Марио нет, необходимо установить минимальный порог для соответствия. Вот шаблон и одно из изображений после этих двух преобразований:

enter image description hereenter image description here

И вот несколько примеров кода для этого:

import sys
import cv2
import numpy

img = cv2.imread(sys.argv[1])

img2 = img[:,:,2]
img2 = img2 - cv2.erode(img2, None)
template = cv2.imread(sys.argv[2])[:,:,2]
template = template - cv2.erode(template, None)

ccnorm = cv2.matchTemplate(img2, template, cv2.TM_CCORR_NORMED)
print ccnorm.max()
loc = numpy.where(ccnorm == ccnorm.max())
threshold = 0.4
th, tw = template.shape[:2]
for pt in zip(*loc[::-1]):
    if ccnorm[pt[::-1]] < threshold:
        continue
    cv2.rectangle(img, pt, (pt[0] + tw, pt[1] + th),
            (0, 0, 255), 2)

cv2.imwrite(sys.argv[2], img)

Я ожидаю, что он потерпит неудачу в более разнообразных ситуациях, но есть несколько простых корректировок.

Ответ 2

Совпадение шаблонов не всегда дает хорошие результаты. вы должны изучить соответствие ключевых точек.

Шаг1: Найти ключевые точки

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

Вы можете использовать SIFT, SURF, ORB в зависимости от ваши предпочтения.

[EDIT]:

Это то, что я получил с помощью этого метода с SIFT и сопоставлением knann на основе flann. Я не делал часть рамки.

enter image description here

Поскольку ваш шаблон очень мал, SIFT и SURF не дают много ключевых точек. Но чтобы получить хорошее количество точек, вы можете попробовать детектор Harris Corner. Я применил угол Харриса по изображению, и у меня были неплохие очки на Марио.

enter image description here

Шаг 2: сопоставить ключевые точки

Если вы использовали SIFT или SURF, у вас были бы дескрипторы как изображения, так и шаблона. Сопоставьте эти ключевые точки с помощью KNN или другого эффективного алгоритма соответствия. Если вы используете OpenCV, я бы посоветовал вам заглянуть в фланебозависимый помощник. После сопоставления ключевых точек вы хотите отфильтровать неправильные совпадения. Вы можете сделать это с помощью ближайших соседей K и в зависимости от расстояния до ближайшего матча вы можете дополнительно отфильтровать ключевые точки. Вы можете дополнительно фильтровать свои совпадения с помощью ошибки "вперед-назад".

Оценка ошибки вперед-назад:

  • Сопоставить ключевые точки шаблона с ключевыми точками изображения. Это даст вам набор совпадений.
  • Сопоставьте ключевые точки изображения с ключевыми точками шаблона. Это даст вам еще один набор совпадений.
  • Общий набор обоих этих параметров будет отфильтровывать неправильные совпадения.

enter image description here

[EDIT]: Если вы используете детектор Harris Corner, вы получите только очки, а не ключевые точки. Вы можете либо преобразовать их в ключевые точки, либо написать свой собственный математический метод грубой силы. Это не так сложно.

Шаг 3: Оценка

После фильтрации ключевых точек у вас будет кластер ключевых точек рядом с вашим объектом (в данном случае Марио) и несколькими разбросанными ключевыми точками. Чтобы устранить эти разбросанные ключевые точки, вы можете использовать кластеризацию. Кластеризация DBSCAN поможет вам получить хороший кластер точек.

step4: Оценка ограничительной шкалы

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

Надеюсь, это поможет.

[EDIT]

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

enter image description here