我试图识别六边形内的文字“25”。如果文本高于或低于六边形,我的代码可识别文本,但在六边形内部则不能识别。有什么指针吗?此外,我试图获取文本的坐标。 一种选择是将六边形(使用opencv轮廓)提取到另一个图像中,然后使用tesseract。但是,我可以使用更简单的解决方案吗?
以下是用于识别文本是否在形状之外的代码片段(程序将图像文件名称作为arg并打印出它识别的文本。)
from PIL import Image, ImageEnhance, ImageFilter
import sys
import pytesseract
import cv2
load image filename = sys.argv[1]
img = Image.open(filename)
img = img.filter(ImageFilter.SHARPEN)
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(10)
img = img.convert('1')
img.save('temp.jpg')
im = cv2.imread('temp.jpg',cv2.COLOR_RGB2GRAY)
im = cv2.blur(im,(4,4))
_, im = cv2.threshold(im, 200 , 200, cv2.THRESH_BINARY_INV)
#This is just to see what has happened, has no meaning!
cv2.imshow('gray', im)
cv2.waitKey(0)
cv2.destroyAllWindows()
#Actual Text recognition
cv2.imwrite('temp2.jpg', im)
text = pytesseract.image_to_string(Image.open('temp2.jpg'))
print(text)
答案 0 :(得分:0)
数字在图形的中心,玩坐标很容易得到。
例如:
height/2-30
到height/2+30
和width/2-30
到width/2+30
然后应用阈值
有时得不到想要的结果,就需要申请pre-processing
代码:
import cv2
import pytesseract
img = cv2.imread('769b9.jpg')
gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(h, w) = gry.shape[:2]
gry = gry[int(h/2)-30:int(h/2)+30, int(w/2)-30:int(w/2)+30]
thr = cv2.threshold(gry, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
txt = pytesseract.image_to_string(thr)
print(txt)
cv2.imshow("thr", thr)
cv2.waitKey(0)