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

问题描述 投票:0回答:4

有没有更有效的方法来使用模板匹配不同尺寸的图像? 这是我当前的脚本:

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()

这是我的模板: 模板

我有这些图像,第一个可以工作,第二个因为尺寸而不能:

有效!

失败

乍一看,我认为它失败是因为模板与图像的大小

所以我尝试使用本教程:多尺度匹配

但这看起来真的很慢而且笨重,特别是因为我打算在它工作时在视频中使用它。有没有更好的办法来处理这个问题

另外,最终我也只想检查图像的右上角,我知道这是一个完全不同的问题,但如果您有任何想法,因为我们正在讨论缩放:)

python numpy opencv computer-vision scale
4个回答
1
投票

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

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


0
投票

针对不同尺寸使用多尺度模板匹配


0
投票

您要寻找的东西并不那么简单。需要的是

multi-scale template matching
,但正如你提到的,它会很慢,尤其是当图像分辨率相当高时。

针对这种情况,最好、最简单的解决方案是训练一个小型的卷积神经网络。利用迁移学习并在您的数据上训练

SSD mobilenet
,您将拥有一个可以很好地为您完成此检测的网络,相信我,它会非常快。物体检测将为您提供最快、更好、更准确的解决方案。

这里有一个链接,其中有一篇文章解释了如何训练视频中的对象检测。


-4
投票

使用基于 AI 的算法代替 OpenCV 怎么样? Mask R-CNN、YOLO、TensorFlow 对象检测 API 等。 上面的算法可能已经足够老了......

© www.soinside.com 2019 - 2024. All rights reserved.