【发布时间】: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 个图像进行比较。这次我想改进一下。
我有几个想法来提高这个速度:
- 使用 OCR -> 不可靠,无法识别每个字符
- 特征检测未检测到所有字符,如大“L”没有特征。
- 使用查找轮廓将图像划分为 ROI,然后提取这些轮廓的宽度和高度,然后仅比较适合提取宽度和高度大小的模板。这将大大减少屏幕比较并提高速度,但查找轮廓会导致轮廓将字符分成 3 个或更多部分,从而导致不正确的高度和宽度。
因此,我仍在寻找一种 100% 可靠但速度更快的查找角色位置的好方法。 (我更喜欢想法 3,但我对每个提案都持开放态度)
【问题讨论】:
标签: opencv ocr image-recognition template-matching