有效地使用不同尺寸的模板匹配

时间:2018-04-09 19:59:00

标签: python numpy opencv computer-vision scale

是否有更有效的方法将模板匹配与不同大小的图像一起使用? 这是我目前的剧本:

import cv2
import numpy as np

img_bgr = cv2.imread('./full.jpg')
img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)

template = cv2.imread('./template.jpg', 0)

w, h = template.shape[::-1]

res = cv2.matchTemplate(img_gray, template, 
cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold)

for pt in zip(*loc[::-1]):
  cv2.rectangle(img_bgr, pt, (pt[0]+w, pt[1]+h), (0,255,255), 2)

cv2.imshow('detected', img_bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()

这是我的模板: Template

我有这些图像,第一个有效,第二个没有,因为尺寸:

Works!

Fails

首先想到的是,由于模板大小与图像相比,我认为它失败了

所以我尝试使用本教程:Multi Scale Matching

但这似乎真的很慢而且笨重,特别是因为当我开始工作时我打算在视频中使用它。有没有更好的方法来处理这个

另外,最后我还想查看图片的右上角,我知道这是一个完全不同的问题,但如果你有任何想法,因为我们正在谈论缩放:)

3 个答案:

答案 0 :(得分:0)

对于不同大小,请使用多尺度模板匹配

答案 1 :(得分:0)

最简单的方法是使用特征匹配而不是模板匹配。特征匹配正是针对此类应用程序的。它还可以检测图像是否旋转..等

锁定这个 https://docs.opencv.org/master/dc/dc3/tutorial_py_matcher.html

答案 2 :(得分:0)

你要找的东西没那么简单。需要的是 multi-scale template matching,但正如您提到的,它会很慢,尤其是当图像分辨率很高时。

对于这种情况,最好和最简单的解决方案是训练一个卷积神经网络,一个小的。利用迁移学习并在您的数据上训练 SSD mobilenet,您将拥有一个可以很好地为您执行此检测的网络,相信我,它会非常快。对象检测将在此处为您提供最快、更好、更准确的解决方案。

这是一篇解释如何训练视频中的对象检测的文章的 link