Я пытаюсь обернуть вокруг себя основы CV. Бит, который изначально заинтересовал меня, - это сопоставление шаблонов (это было упомянуто в разговоре Pycon, не связанного с CV), поэтому я решил, что начну там.
Я начал с этого изображения:
Из чего я хочу обнаружить Марио. Поэтому я вырезал его:
Я понимаю концепцию скольжения шаблона вокруг изображения, чтобы увидеть, как лучше всего подойдет, и после учебника я могу найти марио со следующим кодом:
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 о том, что он должен быть работоспособен для соответствия другим вещам, я провел пару тестов.
Я использовал это как шаблон для соответствия:
И затем взял пару снимков экрана, чтобы проверить соответствие.
Во-первых, я успешно нашел Марио и получил максимальное значение 1.
Однако попытка найти прыжок Марио приводит к полному пропуску.
Теперь предоставлено, марио в шаблоне, и марио в сцене сталкивается с противоположными направлениями, а также является разными кадрами анимации, но я думаю, что они все еще соответствуют намного больше всего на изображении - если только для цветов. Но он нацелен на платформу как наиболее близкое соответствие шаблону.
Обратите внимание, что максимальное значение для этого параметра было 0.728053808212
.
Затем я попробовал сцену без марио, чтобы посмотреть, что произойдет.
Но, как ни странно, я получаю точный результат как изображение с прыгающим марио - вплоть до значения подобия: 0.728053808212
. Марио, находясь на картине, так же точно, как и на картинке.
Действительно странно! Я не знаю реальных деталей базового алгоритма, но я бы предположил, что с точки зрения стандартного отклонения ящики в сцене, которые, по крайней мере, соответствуют красному шаблону Марио, будут ближе к среднему расстоянию, чем синий платформе, не так ли? Таким образом, это лишнее сбивает с толку, что это даже не в общей области, где я ожидал бы этого.
Я предполагаю, что это ошибка пользователя на моем конце или, может быть, просто недоразумение.
Почему сцена с похожим Марио имеет столько же, что и сцена без марио?