我正试图围绕简历的基础知识。最初让我感兴趣的是模板匹配(在与 CV 无关的 Pycon 演讲中提到过),所以我想我会从那里开始。
我从这张图片开始:
我想从中检测到马里奥。所以我把他删掉了:
我了解在图像周围滑动模板以查看最佳匹配的概念,并且按照教程,我可以使用以下代码找到 mario:
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()
到目前为止一切顺利,但后来我意识到这是非常脆弱的。它只会找到具有特定背景并显示特定动画帧的马里奥。
所以我很好奇,鉴于马里奥将始终具有相同的马里奥属性,(大小,颜色)是否有一种技术可以让我找到他,无论他的当前框架是静止不动,还是各种跑步中的一种循环精灵?有点像模糊匹配,你可以在字符串上做,但对于图像。
也许既然他是唯一的红色东西,有一种方法可以简单地跟踪红色像素?
另一个问题是从模板中删除背景。也许这会帮助 MatchTemplate 函数找到马里奥,即使他与模板不完全匹配?截至目前,我不完全确定它是如何工作的(我看到 MatchTemplate 中有一个掩码参数,但我必须进一步调查)
我的主要问题是模板匹配是否是检测几乎相同但变化的图像的方法(比如他走路时),还是我应该研究另一种技术?
更新:
尝试匹配其他马里奥
根据 mmgp 的建议,它应该可以匹配其他东西,我进行了一些测试。
我用这个作为模板来匹配:
然后拍了几张屏幕截图来测试匹配。
首先,我成功找到了马里奥,并获得了最大值 1。
然而,试图找到跳跃的马里奥会导致完全失火。
现在,模板中的 mario 和场景中的 mario 面向相反的方向,并且是不同的动画帧,但我认为它们仍然比图像中的其他任何东西都匹配得多——如果只是为了单独的颜色。但它将平台定位为与模板最接近的匹配项。
请注意,这个最大值是0.728053808212
.
接下来我尝试了一个没有马里奥的场景,看看会发生什么。
但奇怪的是,我得到了作为跳跃马里奥图像的确切结果——直到相似度值:0.728053808212
. 马里奥出现在照片中与他不在照片中一样准确。
真的很奇怪!我不知道底层算法的实际细节,但我想,从标准偏差的角度来看,场景中至少与模板马里奥西装中的红色相匹配的盒子会比蓝色更接近平均距离平台,对吧?因此,它甚至不在我期望的一般区域中,这更加令人困惑。
我猜这是我的用户错误,或者只是一个误解。
为什么一个有类似马里奥的场景会和没有马里奥的场景有同样多的匹配?