【问题标题】:Improve template matching with many templates for one Image/ find characters on image改进与一个图像的多个模板的模板匹配/在图像上查找字符
【发布时间】:2021-04-24 19:35:17
【问题描述】:

想法: 我有一张截图,想在这张图片上找到所有字符和数字及其位置。最简单的方法是使用opencv匹配模板并将我作为“.png”的所有字符(大约800个)与屏幕截图进行比较。

myTemplatesPath = "C:/MyPath/Templates/"
allTemplateFiles = [os.path.join(root, name) for root, dirs, files in os.walk(myTemplatesPath) for name in files]
Templates_all = [cv2.imread(f, cv2.IMREAD_GRAYSCALE) for f in allTemplateFiles]   
imgrey = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY)
for template in Templates_all:       
   results = cv2.matchTemplate(imgrey, template, cv2.TM_CCOEFF_NORMED)
   results = np.where(results > 0.99)

图片:

具有不同字体大小的模板(只是一些示例):

, ,

这可以 100% 正常工作。我唯一的问题是速度。找到图像中的所有位置大约需要 6 秒,因为它必须将 800 个模板与这 1 个图像进行比较。这次我想改进一下。

我有几个想法来提高这个速度:

  1. 使用 OCR -> 不可靠,无法识别每个字符
  2. 特征检测未检测到所有字符,如大“L”没有特征。
  3. 使用查找轮廓将图像划分为 ROI,然后提取这些轮廓的宽度和高度,然后仅比较适合提取宽度和高度大小的模板。这将大大减少屏幕比较并提高速度,但查找轮廓会导致轮廓将字符分成 3 个或更多部分,从而导致不正确的高度和宽度。

因此,我仍在寻找一种 100% 可靠但速度更快的查找角色位置的好方法。 (我更喜欢想法 3,但我对每个提案都持开放态度)

【问题讨论】:

    标签: opencv ocr image-recognition template-matching


    【解决方案1】:

    我偶然发现了这个问题,我发现没有答案,所以我会尝试回答。希望它对您或某人有用。

    我过去遇到过类似的问题,我使用了选项 3。我遇到了您描述的问题,即检测到多个字母为一个,我通过首先检查区域的大小是否在可接受的范围内来解决这个问题(我所有的字母/数字的大小相似),如果不是,我将再次尝试使用cv2.connectedComponents 分隔字母。如果没有两个字母相互“接触”,这应该可以工作。

    但是,这需要进行大量微调才能使其 100% 适合我的用例。不过,我的问题不仅在于性能,还在于即使使用所有字母的 png 也无法识别某些字母。既然你提到你已经可以识别字母,也许你可以先识别单词,然后运行你的代码。我认为您可以使用膨胀(形态学操作)轻松检测单词,然后为每个检测到的单词运行代码。这应该将时间减少到可接受的范围。如果所有的图片都和你提供的一样,也许你可以分成9个子区域运行你的代码。

    我不得不使用的其他可能有用的优化是:

    • 如果单词数量有限,请在检测到单词后尝试缓存这些单词,然后只检测单词。
    • 另一个简单的方法是将图像和模板的大小除以原始大小的 1/2 甚至 1/10。这将大大减少时间,并且在大多数情况下,缩小后的图像中有足够的信息,不会影响模板匹配的准确性。
    • 如果您可以将图像和模板设为二进制(0 或 1),那么您可以进行一些很好的优化来检测模板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 2014-01-06
      • 2014-12-18
      • 2022-08-13
      相关资源
      最近更新 更多