使用 Tesseract 进行 OCR 匹配模板感兴趣区域 (ROI)



这是我第一次尝试使用Python。我通常使用.NET,但为了识别文档中的形状,我转向了Python和OpenCV进行图像处理。

我正在使用OpenCV TemplateMatch(cv2.matchTemplate(来发现我的文档中的感兴趣区域(ROI(。

这很好用。模板匹配ROI并放置矩形,以标识匹配项。

我的图像中的ROI包含我还需要OCR和提取的文本。 我正在尝试用 Tesseract 来做到这一点,但根据我的结果,我认为我走错了。

我的流程是这样的:

  • 运行 cv2.matchTemplate
  • 循环遍历匹配的投资回报率
  • 将矩形信息添加到图像
  • 将矩形信息传递给 Tesseract
  • 将从镶嵌返回的文本添加到图像
  • 编写最终图像

在下图中,您可以看到匹配的区域(很好(,但您可以看到 ROI 中的文本与 tesseract(ROI 右下角(中的文本不匹配。

请有人看一下并建议我哪里出错了?

import cv2
import numpy as np
import pytesseract
import imutils
img_rgb = cv2.imread('images/pd2.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('images/matchMe.png', 0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.45
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
roi = img_rgb[pt, (pt[0] + w, pt[1] + h)]
config = "-l eng --oem 1 --psm 7"
text = pytesseract.image_to_string(roi, config=config)
print(text)
cv2.putText(img_rgb, text, (pt[0] + w, pt[1] + h),
cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 3)
cv2.imwrite('images/results.png', img_rgb)

您的代码中有两个问题: 1. 您在 OCR 之前修改了图像(绘图矩形(。 2. 投资回报率构建不当。

img_rgb = cv2.imread('tess.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('matchMe.png', 0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.45
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
roi = img_rgb[pt[1]:pt[1] + h, pt[0]: pt[0] + w]
config = "-l eng --oem 1 --psm 7"
text = pytesseract.image_to_string(roi, config=config)
print(text)
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
cv2.putText(img_rgb, text, (pt[0] + w, pt[1] + h),
cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 3)
cv2.imwrite('results.png', img_rgb)

您可能仍然需要提供经过适当过滤的图像才能进行任何有意义的识别。希望这有帮助。

最新更新