转自|opencv学堂
01
软件版本
代码语言:javascript复制- Python3.6.5
- OpenCV-Python 4.x
- Tesseract-OCR 5.0.0-alpha.20201127
- Win10 64
02
安装与配置
安装Python SDK选择默认安装,同时勾选最下面得红色矩形框内容。
安装opencv-python开发包
代码语言:javascript复制pip install opencv-python
安装Tesseract-OCR Python SDK支持
代码语言:javascript复制pip install pytesseract
下载Tesseract-OCR 5.0.0-alpha.20201127安装包并安装!然后在环境变量中添加
代码语言:javascript复制C:Program FilesTesseract-OCR
03
验证与测试
安装与配置好OpenCV-Python与Tesseract-OCR之后,需要进一步通过代码验证正确性。打开Pycharm IDE,新建一个python项目与python文件,输入以下代码
代码语言:javascript复制import pytesseract as tess
print(tess.get_tesseract_version())
print(tess.get_languages())
运行结果如下:
第一行是版本信息,第二行是支持的语言信息,默认只支持英文。
Tesseract-OCR介绍
开源的OCR识别引擎,高版本识别基于LSTM,其整个处理流程如下:
检测与识别文本函数:
检测:
代码语言:javascript复制def image_to_boxes(
image,
lang=None,
config='',
nice=0,
output_type=Output.STRING,
timeout=0,
)
返回所有识别文字的Box框坐标,每一行为一个BOX信息输出
每行的前五个值分别是,识别的字符、BOX框的左上角与右下角坐标
识别
代码语言:javascript复制def image_to_string(
image,
lang=None,
config='',
nice=0,
output_type=Output.STRING,
timeout=0,
)
输入的图像通道顺序是RGB,OpenCV默认为BGR,返回的是识别结果
必输入的参数是image,其它可选
英文与数字识别
Tesseract-OCR默认支持英文与数字识别,有输入图像如下:
Python代码如下:
代码语言:javascript复制image = cv.imread("D:/cv4j.png")
image_rgb = cv.cvtColor(image, cv.COLOR_BGR2RGB)
text = tess.image_to_string(image_rgb, lang="eng")
content = text.replace("f", "").split("n")
for c in content:
if len(c) > 0:
print(c)
h, w, c = image.shape
boxes = tess.image_to_boxes(image)
for b in boxes.splitlines():
b = b.split(' ')
image = cv.rectangle(image, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2)
cv.imshow('text detect', image)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果如下:
英文识别对无干扰的背景效果非常好!
中文识别
默认情况下Tesseract-OCR不支持中文识别,需要下载中文识别的模型文件,然后放置到安装路径的tessdata目录下:
代码语言:javascript复制C:Program FilesTesseract-OCRtessdata
然后在运行语言检查支持代码,运行结果如下:
其中chi_sim表示中文简体支持,eng表示英文支持!
以下图为例:
识别代码
代码语言:javascript复制image = cv.imread("D:/yanxishe.png")
image_rgb = cv.cvtColor(image, cv.COLOR_BGR2RGB)
text = tess.image_to_string(image_rgb, lang="chi_sim")
print(text)
h, w, c = image.shape
boxes = tess.image_to_boxes(image)
for b in boxes.splitlines():
b = b.split(' ')
image = cv.rectangle(image, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2)
cv.imshow('text detect', image)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果
正确率还不错,需要进一步处理一下,直接放大两倍,然后再测试一波
发现错误识别大大减少,基本可用!