当前位置:   article > 正文

OCR识别常见开源库_ocr开源库

ocr开源库

做OCR有很多库可以使用。

Tesseract

新建系统变量

我的电脑点击右键,属性,高级系统设置,环境变量,系统变量里面,新建一个TESSDATA_PREFIX变量名,路径就是tessdata文件夹的路径地址。如:D:\tessdata。

Python环境配置

pip install pytesseract
pip install matplotlib

测试代码

运行测试代码,使用Pillow读取图像

import pytesseract
from PIL import Image
import matplotlib.pyplot as plt

srcImage = Image.open('./pic/t1.jpg')
plt.imshow(srcImage)
plt.show()
text = pytesseract.image_to_string(srcImage, lang='eng')
print(text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行测试代码,使用OpenCV读取图像

import pytesseract
import cv2 as cv

srcImage = cv.imread('./pic/t7.jpg')
grayImage = cv.cvtColor(srcImage, cv.COLOR_BGR2GRAY)
thresh, binaryImage = cv.threshold(grayImage,0, 255, cv.THRESH_BINARY|cv.THRESH_OTSU)
blurImage = cv.GaussianBlur(binaryImage, (5, 5),3)
cv.imshow('blurImage',blurImage)
text = pytesseract.image_to_string(blurImage, lang='eng')
print(text)

cv.waitKey(0)
cv.destroyAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

VS环境配置

Tesseract的GitHub网址:https://github.com/tesseract-ocr/tesseract
在Windows下Visual Studio 调用,要先配置环境。官方有3种方法:https://tesseract-ocr.github.io/tessdoc/Compiling.html
CMake:https://cmake.org/,SW:https://software-network.org/,Vcpkg:https://vcpkg.io/en/index.html

Vcpkg环境配置

使用Vcpkg官方方法:https://github.com/Microsoft/vcpkg/blob/master/README.md
下载Vcpkg,位置为:D:\vcpkg。我的电脑点击右键,属性,高级系统设置,环境变量,系统变量里面Path添加:D:\vcpkg。
推荐终端使用powershell,而不是cmd。https://github.com/PowerShell/PowerShell/releases/tag/v7.4.2
在powershell下,打开目录D:\vcpkg,运行命令:

vcpkg install tesseract:x64-windows 
vcpkg integrate install
vcpkg integrate project
  • 1
  • 2
  • 3

使用CMake官方方法:https://github.com/tesseract-ocr/tesseract/blob/main/.github/workflows/cmake-win64.yml
将编译好的文件放在本地,如:D:\tesseract
我的电脑点击右键,属性,高级系统设置,环境变量,系统变量里面,Path添加:D:\tesseract\bin
新建一个项目,进入属性管理器:
VC++目录->包含目录:添加:D:\tesseract\include
VC++目录->库目录:添加:D:\tesseract\lib

链接器->输入->附加依赖项:添加:
tesseract50d.lib,Debug模式,tesseract50.lib,Realease 模式。那个 d 就是Debug 的意思。

这个时候,就可以运行代码,测试一下了。

测试代码

运行测试代码

#include <opencv2/opencv.hpp>
#include <tesseract/baseapi.h>

int main()
{
	// 加载图像
	cv::Mat image = cv::imread("testocr1.jpg");

	// 将图像转换为灰度图
	cv::Mat gray;
	cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);

	// 创建Tesseract OCR对象
	tesseract::TessBaseAPI tess;
	tess.Init(NULL, "eng");  // 使用英语语言模型
	tess.SetImage((uchar*)gray.data, gray.cols, gray.rows, 1, gray.cols);

	// 进行字符识别
	tess.Recognize(NULL);
	const char* result = tess.GetUTF8Text();

	// 输出识别结果
	std::cout << "识别结果: " << result << std::endl;

	// 释放资源
	tess.End();
	delete[] result;

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

训练自定义字体

训练工具安装

训练工具:jTessBoxEditor。使用说明可以参见网址:https://vietocr.sourceforge.net/training.html
jTessBoxEditor下载地址:https://github.com/nguyenq/jTessBoxEditor
java的JDK:由于jTessBoxEditor是用Java开发的,运行该工具需要java环境。下载地址:https://www.oracle.com/java/technologies/downloads/?er=221886#jdk22-windows

训练过程

解压jTessBoxEditor点击train.bat,运行软件。具体步骤如下:
Step1:打开jTessBoxEditor,选择Tools->Merge TIFF,进入训练样本所在文件夹,选中要参与训练的样本图片:
Step2:点击 “打开” 后弹出保存对话框,选择保存在当前路径下,文件命名为 “yxfa.test.exp1.tif” ,格式只有一种 “TIFF” 可选。
tif文面命名格式: [lang].[fontname].exp[num].tif。lang是语言,fontname是字体,num为自定义数字,方便记录训练样本。
Step3:将训练数据生成box格式。从官网下载tessdata_best-main压缩包解压缩放在本地,如:D:\tessdata。先删掉其中的configs文件,再从本地jTessBoxEditorFX软件的目录下\tesseract-ocr\tessdata复制configs,tessconfigs两个文件夹到D:\tessdata下面。不然不能生产box文件。
在生产的tiff文件夹目录下,提供管理员权限打开CMD,使用如下命令:注意-l是英文字母l,不是数字1。

tesseract yxfa.test.exp1.tif yxfa.test.exp1 -l eng batch.nochop makebox
tesseract yxfa.test.exp1.tif yxfa.test.exp1 -l eng --psm 6 batch.nochop makebox
tesseract yxfa.test.exp1.tif yxfa.test.exp1 batch.nochop makebox
  • 1
  • 2
  • 3

注意:–psm的语法,数字对应不同的页面分割模式。box文件和对应的tif一定要在相同的目录下,不然后面打不开。
Step4:使用jTessBoxEditor矫正.box文件的错误
点击Box Editor,Open,打开上面的tif文件。标注调整样本图,校正完之后点击保存。
Step5:产生字符特征文件,生成.tr文件。如:yxfa.test.exp1.tr。命令如下:

tesseract yxfa.test.exp1.tif yxfa.test.exp1 nobatch box.train
  • 1

Step6:计算字符集,生成一个unicharset文件。命令如下:

unicharset_extractor yxfa.test.exp1.box
  • 1

Step7:定义字体特征文件
新建一个font_properties文件。注意,文件的名字就是font_properties,它没有.txt后缀。里面内容写入 test 0 0 0 0 0 表示默认普通字体。表示字体test的粗体、倾斜等共计5个属性。这里的“test”必须与“yxfa.test.exp1.box”中的“test”名称一致。
或者执行命令:
echo test 0 0 0 0 0 >font_properties
执行完之后,会在当前目录生成font_properties文件。
Step8:生成shape文件,运行如下命令:

shapeclustering -F font_properties -U unicharset -O yxfa.unicharset yxfa.test.exp1.tr
  • 1

执行完之后,会生成 shapetable 和 yxfa.unicharset 两个文件。
Step9:生成聚字符特征文件
执行下面命令:

mftraining -F font_properties -U unicharset -O yxfa.unicharset yxfa.test.exp1.tr
  • 1

会生成 inttemp、pffmtable 两个文件。
Step10:生成字符正常化特征文件
执行下面命令:

cntraining yxfa.test.exp1.tr
  • 1

会生成 normproto 文件。
Step11:文件重命名
重新命名inttemp、pffmtable、shapetable和normproto这四个文件的名字为[lang].xxx。
这里修改为yxfa.inttemp、yxfa.pffmtable、yxfa.shapetable和yxfa.normproto
Step12:合并训练文件
执行下面命令:

combine_tessdata yxfa.
  • 1

会生成yxfa.traineddata文件。
yxfa.traineddata 便是最终生成的语言文件,将生成的 yxfa.traineddata 文件拷贝到本机的tessdata目录下(如D:\tessdata),就可以用它来进行字符识别了。

PaddleOCR

环境配置

PaddleOCR的GitHub网址:https://github.com/PaddlePaddle/PaddleOCR
在Windows下Python调用,要先配置环境。
官方方法:https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/environment.md#1.1
先安装Anaconda,然后创建环境:

conda create --name paddle python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/  
python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple  #GPU版本
python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple  #CPU版本
pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本
  • 1
  • 2
  • 3
  • 4

命令行测试代码

paddleocr --image_dir ./imgs/11.jpg --use_angle_cls false--use_gpu false
  • 1

创建ocr.py文件,加入测试代码。

from paddleocr import PaddleOCR, draw_ocr

# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=False, use_gpu=False, lang="en")  # need to run only once to download and load model into memory
img_path = './imgs/11.jpg'
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):
    res = result[idx]
    for line in res:
        print(line)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号