我个人不是搞互联的,仅是工业控制从业人员,基本都与硬件打交到,所以只熟悉WINDOWS下的编程应用,由于硬件上涉及有OCR处理,才翻阅资料学习。
对OCR需求也不复杂,大多都是单个识别,最多一行而已。
查询网络资料后,总体印象口碑较好的是tesseract与百度自家的产品。
前者是GOOGOL当下在维护的开源项目。
后者是百度搞的商用产品,但每日提供足够多免费使用次数;
两者都可以满足我当下使用情况。
主要看识别效果择优选择,效果差不多是人都会选择tesseract,开源免费有源代码。
我在第一次熟悉这些时时倒没有先看识别效果,直接下载了tesseract,搞了好几天的编译环境搭建。
最后测试识别效果不理想,选择了百度的,真是浪费时间。
所以选择前还是尽量准备多张自己要识别的图片用不同产品分别测试,择优选择。
比如我随机截图网页内容。
发现用tesseract新版本使用不同版本的中文语言包都没法正常识别。
fast,best中文语言漏识别内容:荷兰语,另一版本识别内容不正确。
再比如我选取第一字'有'识别,识别失败。
--psm有几个可选参数逐一试过,很不理想,单字,几个字识别是我最基本需求,所以内以开始犹豫选择。
再用英文测试倒全正确、
再用英文测试倒全正确
再用百度提供的API测试,全都正确,单字,单行,多行,英文效果很好。
看来商用与免费的还是没啥可比性的,时间不多想直接应用的还是商用的好。
当然tesseract也是相当不错,只是没法花太多精力熟悉它代码,调整低层参数或自己训练语言包。
我测试这两库效果都是自己搭建完编译环境正常运行程序来测试的,
就为测试,狗日的就得踩那么多坑。
其实它两都提供现成的测试demo.
tesseract 有提供二进制安装包,因为tesseract比较出名原因,各大中文下载站都可下载。
搜索tesseract排第一的就是其源代码下载站:
https://github.com/tesseract-ocr。
我主要在这里下载中文语言包,有tessdata_fast,tessdata_best,tessdata三种。
tesseract安装版本:
https://digi.bib.uni-mannheim.de/tesseract/
自行下载安装完成,解压语言包,再准备好测试用图片。
将语言包目录,tesseract安装目录设置到系统环境变量中,就可以运行cmd测试效果。
VS版本要注意下,建议安装最新版本VS2019,40GB左右,先下载安装好。
tesseract是通过mmd命令形式使用,测试前自己手动添加语言包与tessseract.exe目录,
附件是我初次使用时参考的帖子,安装测试介绍很详细。
用不同图片测试看看效果满意,就选择,不满意再往下看百度OCR。
百度OCR,
公有云API最高可享每天50000次免费调用,个人认证免费调用量9000次。
个人用的话,这个数量足够,还不够可以付费,自己综合考虑。
自己用C++调用时,仅两个函数就能实现,不过难在环境搭建。
下面是其免费效果测试地址:
https://ai.baidu.com/tech/ocr/general
往下滚动可看到上传图片测试部分。
两者效果先对比,确定选择后开始在Windows搭建编译环境生成可执行程序等。
1.tesseract 编译环境搭建。
上面有介绍过,一搜索就是其源代码下载地址。
不过不是windows下的,只是一个跨平台的压缩包,再得自己生成window下可供vs2019编译的工程文件。
这可就麻烦了,tesseract 是开源的,用到了一箩筐其他的开源项目,比如libpng,zlib,openjpeg,leptonica;
就好比跟菇凉谈个恋爱,非得强制介绍她七大姑八大姨认识,认识认识就算了,我下载便是。
但很多又是老外写的,不翻墙还下不到,真恶心到家。
又比如leptonica是开源的图片处理库,又用到了一堆其他开源库,还得自己一一编译生成库文件。
这么一搞,真的死了的心都有,又不是搞互联网的,几个月几年都在倒腾这些库。
真的是,谈个恋爱,她祖宗十八代,旁系真系血亲统统都要问候一遍。
个别还躲在国外不让见。
最后我是这么实现编译的,
安装好最新版本VS2019,
准备好VS2019下的tesseract项目工程框架:
其内有leptonica,tesseract 两文件夹,直接下载对应夸平台包放进去就好。
然后工程框架目录内双击tesseract.sln就可打开工程编译运行,生成动态库与可执行程序;
下载网址就不提供了,有条件自己翻墙。
这里涉及用到的三个包,我打包到网盘供大伙下载,也供自己后期有需要再研究学习。
找到如tesseract_4.1文件夹,下载对应版本或直接附件的夸平台包。
找到leptonica文件夹,下载最新版本或直接附件的夸平台包。
这样就准备好了tesseractd WINDOWS下的编译工程。
当前我编译时下载的是tesseract v4.1.1,最新版本是v5.0测试版(等他测试久点再用)。
可以看到目录下其他常用库都已经下载准备好了,不用自己一一问候。
直接编译看看,处理编译问题就好。
打开工程文件,
打开工程文件
tesseract工程会生成可执行程序,也就是自己前面安装包相同的程序。
要设置语言包及自身位置到系统环境变量中,才能测试效果,参考上边安装包的方法。
libtesseract工程为OCR库工程,会生成动态库与链接库供自己代码调用 。可以先单独编译libtesseract,会发现出错。
1>D:\Program Files\Tesseract41\tesseract_4.1\src\ccmain\equationdetect.cpp(236,23): error C3688:
文本后缀“銆”无效;未找到文文本运算符或文本运算符模板“operator """"銆”
双击提示文本定位到出错处,
把 static const STRING kCharsToEx[] = {"'", "`", "\"", "\\", ",", ".",
"〈", "〉", "《", "》", "」", "「", ""};
修改成
static const STRING kCharsToEx[] = { "'", "`", "\"", "\\", ",", ".",
"<", ">", "<<", ">>", "" };
重新编译此工程,方可正常编译成功,选择性忽略一箩筐的警告提示。
- if (unicharset.get_ispunctuation(id)) {
- // Exclude some special texts that are likely to be confused as math symbol.
- static GenericVector<UNICHAR_ID> ids_to_exclude;
- if (ids_to_exclude.empty()) {
- /*
- static const STRING kCharsToEx[] = {"'", "`", """, "\", ",", ".", "〈", "〉", "《", "》", "」", "「", ""};
- */
- static const STRING kCharsToEx[] = {"'", "`", """, "\", ",", ".","<", ">", "<<", ">>", ""};
- int i = 0;
- while (kCharsToEx[i] != "") {
- ids_to_exclude.push_back(
- unicharset.unichar_to_id(kCharsToEx[i++].string()));
- }
- ids_to_exclude.sort();
- }
- return ids_to_exclude.bool_binary_search(id) ? BSTT_NONE : BSTT_MATH;
- }
复制代码 然后全部编译,生成库文件与测试程序。
如我的会生成保存在D:\Program Files\Tesseract41\Release。
会发现有很多 链接库,
libtesseract.lib 为tesseract链接库供我们代码链接调用。
其他的为此库所依赖的其他库。
tesseract.exe为测试用,设置好电脑系统环境变量后,可通过cmd测试。
程序如何调用也是可以参考工程tesseract下main函数。
参考上边网址https://github.com/tesseract-ocr也是提供例程,手册下载。
至于具体头文件,链接库文件如何调用,
参考tesseract工程的就好,如我的,
tesseract相关头文件都在
D:\Program Files\Tesseract41\tesseract_4.1\src
leptonica相关头文件都在
D:\Program Files\Tesseract41\leptonica\src
链接库文件都在
D:\Program Files\Tesseract41\Release
自己整理出来就好。
这样TESSERACT就可以自己执行编译,生成release,debug,或是x86,x64的。
2.再来看看百度OCR如何搭建环境,调用API。
其API申请过程就略过的,都是中国人都识中国字,搜索进入官网申请就好。
我自己用的是VS2019,C++语言.
在官网上下载对应SDK包,再记下自己申请的下面3个参数,以便在代码中使用。
- // 设置APPID/AK/SK
- std::string app_id = "3838438";// 你的 App ID";
- std::string api_key = "3838438d1dN1314520";// 你的 Api key";
- std::string secret_key = "ZOmGfKnEZz3838438d1dN1314520kHZaZet";// 你的 Secret Key";
- aip::Ocr client(app_id, api_key, secret_key);
复制代码 过程中最恶心的是百度OCR所依赖的第三方库要自己下载编译。
又是开源的,涉及谈恋爱见祖宗问题,折腾了好久,你说你一个商业用的,考虑问题不能全面些么?
直接提供可编译运行的工程压缩包不就得了。
包含库,包含你的API,我们只要修改为自己的App ID,Api key ,Secret Key多省心省时。
还有一点恶心的是乱码问题。搜索也有很多相同的提问,你们官方就不是不直接回复问题在哪,如何解决?
非得统一回复已经线下解决,这也保密乎?到低是图片问题,网络问题,算法问题,还是人品问题呢?
好了,唠叨后就开始准备搭建编译环境,下载3个其所依赖的第三方库。
openssl源码下载地址:
https://gitee.com/mirrors/openssl
https://github.com/openssl/openssl
嫌麻烦没下载来编译,我不是要学习用它编程。
直接下载安装程序,内有其头文件,链接库等。
直接用省时,具体国外的下载网址与安装程序怕失效都备份了一下,在附件内。
安装完成打开安装目录头文件在include\openssl,库文件在\lib,等会会用到。
curl库下载,也是跨平台的要自己搞成window下的工程,
使用的工具是cmake,很方便下载,也要自己搞成window下的工程自己编译。
不过有exe版本的下载,附件内对应的是cmake-gui.exe运行起来,
下载CURL库或直接使用附件的,解压出curl-master生成window下的工程。
如图4点顺序操作,选择电脑安装的VS2019,
有提示错误为找不到指定的文件,整个界面红红的也不用管,重复点击Configur按钮就好。
最后点击Generate按钮,生成VS2019可打开的工程文件,文件位于图片中build目录下。
双击目录下的CURL.sln工程文件,便可打开执行编译。
我编译一切正常没报错,默认是DEBUG的x64版本。
其头文件在,如我的C:\Users\baikhgmv\Desktop\curl-master\include\curl
生成的链接库目录,如我的:C:\Users\baikhgmv\Desktop\curl-master\build\lib\Debug;
libcurl-d_imp.lib,libcurl-d.dll为其链接库与动态库。
其他版本的自行设置重新编译。
再来编译第3个库json。
也是第三方开源库,
下载地址:
https://github.com/open-source-parsers/jsoncpp
附件也有,得自己提取出WINDOW下的VS2019项目文件。
同样解压出来如C:\Users\baikhgmv\Desktop\jsoncpp-master。
参考上图,运行CMake.exe。
执行提取操作。
结果会生成保存在build文件夹下,
目录内jsoncpp.sln双击打开,执行编译就好。
默认工程是DEBUG,X64版本。
库文件生成保存如我的:
C:\Users\baikhgmv\Desktop\jsoncpp-master\build\bin\Debug
C:\Users\baikhgmv\Desktop\jsoncpp-master\build\lib\Debug
头文件在,如我的:
C:\Users\baikhgmv\Desktop\jsoncpp-master\include\json
自己根据需要重新生成想要的其他版本,整理到项目中用。
最后附件还保含我MFC写的例程,加上上面提到的全部压缩打包。供论坛会员直接使用。
另外百度OCR返回乱码是什么原因呢?如何处理?隐藏部分是我通过代码搞定的方法,
自己额外写了两个函数来处理,这百度技术员看来也只是搞互联网,手册上只字不提。
|