Opencv 使用一张图像的多个模板改进模板匹配/在图像上查找字符

Opencv 使用一张图像的多个模板改进模板匹配/在图像上查找字符,opencv,ocr,image-recognition,template-matching,Opencv,Ocr,Image Recognition,Template Matching,这个想法: 我有一个截图,想找到所有字符和数字及其在这张图片上的位置。最简单的方法是使用opencv匹配模板并将所有字符(大约800个)作为“.png”与截图进行比较 myTemplatesPath = "C:/MyPath/Templates/" allTemplateFiles = [os.path.join(root, name) for root, dirs, files in os.walk(myTemplatesPath) for name in files] T

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

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个图像进行比较。这次我想提高

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

  • 使用OCR->不可靠,无法识别每个字符
  • 特征检测并没有检测到所有字符,就像大的“L”没有特征一样
  • 通过查找轮廓将图像划分为ROI,然后提取轮廓的宽度和高度,然后比较适合提取的宽度和高度大小的模板。这将大大减少屏幕比较并提高速度,但查找轮廓会导致轮廓将字符分成3个或更多部分,从而导致高度和宽度不正确
  • 因此,我仍然在寻找一种很好的方法来找到角色的位置,这种方法100%可靠,但速度更快。(我更喜欢第三个想法,但我对每个建议都持开放态度)