Lin*_*ink 5 python opencv tesseract
这是一个非常棘手的问题。
我正在使用以下代码来检测手写图像中的文本。我不希望它识别字符,在这种情况下,它只会在他找到的每个字符/单词周围创建一个边框。
这是代码:
import cv2
import tesserocr as tr
from PIL import Image
import numpy as np
img = cv2.imread('1.png')
idx = 0
# since tesserocr accepts PIL images, converting opencv image to pil
pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# initialize api
api = tr.PyTessBaseAPI()
alphabet_min = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
alphabet_max = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
try:
api.SetImage(pil_img)
boxes = api.GetComponentImages(tr.RIL.SYMBOL, True)
text = api.GetUTF8Text()
print(text)
for (im, box, _, _) in boxes:
x, y, w, h = box['x'], box['y'], box['w'], box['h']
#print(box)
#if w < 200:
#cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=1)
for letter in text:
if letter in alphabet_min:
cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=-1)
idx += 1
finally:
api.End()
cv2.imshow('2', img)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)
如果您仔细看,您会看到一个print(text)。这将打印他在图像中找到的文本。但是,由于这是手工制作的文本,因此几乎无法恢复:
Ca) a1 1. s 5305 Fm“. 4 54 0235 166 ?rm 4 §24630455
Run Code Online (Sandbox Code Playgroud)
但是,即使此输出也可以在某种程度上帮助我。
在代码的上方,我做了一个函数:
for letter in text:
if letter in alphabet_min:
cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=-1)
Run Code Online (Sandbox Code Playgroud)
这应该将print(text)输出中的每个字符都包含在内,并将其alphabet_min与代码中的列表进行比较。但这不起作用。我不知道为什么?
这样做的目的是:如果在其中找到一个字母,print(text)并且该字母等于alphabet_min列表中的一个,则使用图像中cv2.rectangle的对应字母(使用)将其覆盖在图像中。
有什么建议吗?
源图像是这样的:
编辑
在此条件下打印(True),显示6 True。这意味着它找到了字母。唯一的问题是不为它们创建边界框。
解决了...
所以,这是新代码:
import cv2
import tesserocr as tr
from PIL import Image
import numpy as np
img = cv2.imread('1.png')
idx = 0
# since tesserocr accepts PIL images, converting opencv image to pil
pil_img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# initialize api
api = tr.PyTessBaseAPI()
alphabet_min = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
alphabet_max = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
t = 0
try:
api.SetImage(pil_img)
boxes = api.GetComponentImages(tr.RIL.SYMBOL, True)
text = api.GetUTF8Text()
for (im, box, _, _) in boxes:
x, y, w, h = box['x'], box['y'], box['w'], box['h']
cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=1)
print(text[t])
for letter in alphabet_min:
if text[t] in letter:
cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=-1)
t += 1
cv2.imshow('2', img)
cv2.waitKey(0)
idx += 1
finally:
api.End()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1725 次 |
| 最近记录: |