【问题标题】:Using Template Matching on different sizes efficiently有效地在不同尺寸上使用模板匹配
【发布时间】:2018-09-19 07:31:14
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果你知道大概的位置,你真的应该把视频修剪到那个区域。此外,您可能可以不进行匹配而侥幸逃脱,例如通过查看该区域中总像素强度的峰值(可能通过帧中的总像素强度进行归一化,具体取决于背景/照明是否变化很大)。
  • 这很酷。我实际上让它工作,至少在我的电脑上。我刚刚为该图标裁剪了以前的图像,然后寻找它。我知道它仍然不适用于较小的图像,但现在是一个开始

标签: python numpy opencv computer-vision scale


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您要寻找的并不是那么简单。需要multi-scale template matching,但正如你所说,它会很慢,尤其是在图像分辨率相当高的时候。

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

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

      【讨论】:

        【解决方案4】:

        使用基于 AI 的算法而不是 OpenCV 怎么样? Mask R-CNN、YOLO、TensorFlow Object Detection API 等。 上面的算法可能已经够老了……

        【讨论】:

          猜你喜欢
          • 2020-02-19
          • 2021-07-23
          • 2012-09-11
          • 2014-12-14
          • 2022-09-27
          • 1970-01-01
          • 1970-01-01
          • 2016-07-27
          • 2022-07-08
          相关资源
          最近更新 更多