机器学习生成CRM表单 - 3.文字识别并关联元素
接上文,已经识别出页面元素,接下来需要识别出文字,并与元素关联
元素的文字识别
使用 tesseract
的效果好很多,所以采用 tesseract
。
tesseract测试: https://github.com/yuxizhe/OCR/blob/master/tesseract.ipynb
如果用tesseract对整个图片进行文字识别的话,返回的是要么是全部的字符串,要么是每个字和每个字的坐标,很难与元素关联起来。
尝试了多种方式未果,后来决定采用对每个元素的图片进行单独识别,这样可以很方便的把文字与元素建立关联关系。
元素内文字的识别比较方便,直接调用识别即可。
表单元素前面的文字也是需要识别的,这里采用简单的方案,大概取元素 前300px 生成一个图片,对这个图片进行文字识别,结果就是表单元素的介绍文字。
把方法编写成function如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 识别元素内及元素前的文字
def element_ocr(cropped, img, x, y, w, h):
# 识别矩形中的文字
inner_text = pytesseract.image_to_string(cropped, lang='chi_sim')
print('元素内文字: '+ inner_text)
# 识别矩形前的文字 往前300
textAreaBefore = img[y:y+h,max(0,x-300):x]
cv2_imshow(textAreaBefore)
# 识别前序文字
before_text = pytesseract.image_to_string(textAreaBefore, lang='chi_sim')
print('元素前区域文字: '+before_text)
return inner_text,before_text
结果打印如下1
2
3
4
5
6
7组件0: Input : before:*Bundle id:
组件1: Button : before:* 更新信息:
组件2: Input :请输入版本号 (例如: 11.31) before:* 版本号:
组件3: Input :ioS before:* 平台:
组件4: Input :雪球 before:* APP名:
组件5: Button :出 点击上传 ipa 文件 before:* 上传ipa 文件:
组件6: Input :Public before:* 包类型:
将文字显示在图片上
cv2 的 putText
方法不支持直接显示中文,会出现问号乱码
参考这篇文章
1 | # 中文字体显示 |
把展示识别结果的函数修改为
1 | # 在图片上显示结果 |
结果如下