初试tesseract-ocr

最近需要做一个有关验证码识别的项目,文字字体是Courier New加粗版,每个字母都有可能倾斜、偏离位置,伴有不同位置的各种颜色的噪点。我使用阀值过滤和连通区域分析法(参考:http://blog.csdn.net/icvpr/article/details/10259577)去除所有的噪点,并将不同的字符准确分割开来,现在剩下的唯一的问题就是准确地识别每一个字符了。我尝试了许多商业OCR系统,效果都不甚理想;最终,tesseract-ocr成了我尝试的对象。

其实很久之前我尝试过tesseract-ocr,感觉其效果也蛮不咋地。这一次最先尝试的是其3.02版,已经编译好的Win32版本,支持exe和dll调用。我在网上尝试了下训练方法,结果用训练数据的时候主程序总是提示软件崩溃,我靠……用它默认的eng库吧,外加限制白名单字符,识别结果倒实在是太勉强了(网站给了三个备选答案,靠模糊匹配能够实现一些正确率,但是没有达到要求。)从另一个网站上找到了越南字体库,里面恰好含有Courier New字体。使用后正确率也有所提高,可是仍然不够高。事情就只能这样了吗?

当然没有。最近,tesseract-ocr的官网(https://code.google.com/p/tesseract-ocr/)放出来了其3.03RC版的源代码,据说提高了准确率,还有了更为便捷的训练工具(text2image等。)这种好东西可是不能放过。

用SVN软件同步了一下源码(超过1G了,主要是语言库很大),发现里面有VS2008和VS2010目录,好开心有没有……按照网上的编译教程,下载了leptonica 1.68(这是它的依赖库之一)的win32版本,然后开开心心地开始了Build……等等,什么,你需要leptonica 1.70!?好吧,去leptonica网站下载了其1.70版本的源码(它是2014年1月发布的,只有源码…),解压后却发现…尼玛,没有VS的工程文件夹。再去官网翻下载,倒是得到了一份1.68版本的VS2008工程目录,可是至于用它来编译1.70的源码,那可是爆出了一堆错误。不甘心,再去问Google,结果从Google网络论坛里发现了这些东西:

Project Member #3 tomp2…@gmail.com

I have NOT released a Visual Studio 2008 Solution yet for Leptonica 1.70. Please be patient. A temporary VS2008 solution was sent to the tesseract project for their use only. I have yet to hear back directly from them. (No news is good news?)

Using VS2008 (and my new VS2008 Solution files), I have successfully build v1.70 many times over the past 2 weeks.

I’m not sure when I will release an official v1.70 VS2008 solution. For one thing, it depends on when leptonica itself stops changing (there were changes just yesterday). It will probably be at least a week from now.

这TM是在逗我吗……Windows上直接编译就不行了吗……

算了,先把东西搞出来再说。找了一台Linux VPS,系统是CentOS 6.4。编译leptonica和tesseract-ocr的主程序貌似很顺利的说(鸡冻啊)然后是编译训练工具(training文件夹下面的。)然后嘛……

 fatal error: pango/pango.h: No such file or directory

我明明装了pango-devel,这又是什么鸟问题!!跑到/usr/include/下看了看,有一个pango-1.0文件夹,再里面有个pango,还里面就是pango.h了……立即为pango文件夹建立了一个软链接,此错误消失,继而又来一大片错误代码-_-||| 仔细一看,原来又是glib.h找不着了,尼玛我不是也装glib-devel了吗……再次新建了个软链,并且改了下源文件,再尝试编译,错误代码又多了不少。

⊙﹏⊙b狂汗!

突然想起来开发团队是用Ubuntu编译的,那我换成Ubuntu是不是就可以了呢?(好天真的想法)于是我在服务器上又开了个虚拟机,下载了Ubuntu Server 13.10,然后是手动安装的……按照编译说明下载完毕所有开发组件,然后就是同步SVN了。同步了一小会……咦,为什么SSH连接直接断掉了?尝试ping一下?不通!吓吓……赶紧跑到宿主机上去看,原来是虚拟机直接关掉了,可这是为什么!!再次启动、同步,没多久虚拟机又一次罢工。靠,SVN这么牛B,能不动声色地硬关机?!

没办法,再次装了回Ubuntu(这次用的VMware的自动安装),然后先SVN,成功……然后apt-get所有依赖项,成功……编译leptonica,成功……编译tesseract的主程序,成功……胜利的曙光仿佛即将到来…然后又开始编译训练程序…一切都是那么的美好……

 fatal error: pango/pango.h: No such file or directory

无语了,又是找不到pango的问题。编译几个小破程序有那么难吗到底!!

快没耐心了,这次还是简单粗暴点好了:直接把pango扔到/usr/include下面。glib.h?一样扔过去,文件结构乱不乱早就不管了,看你还敢不敢说找不到。

在扔了4-5次后,所有的程序终于编译过去了,我的天啊……赶紧用训练工具生成粗Courier New字体库,然后用新版tesseract程序识别下……嗯,结果强多了!这次终于完全可以达到要求了!

可是这还没完,因为我需要在Windows下运行识别软件。我尝试了用tesseract-ocr 3.02的程序+新语言库识别,结果则差了不少。可是VS那边不给力,除了等,还能怎么办呢?

对,用交叉编译,Cygwin还是官方推荐的编译方法之一呢!赶紧搞定Cygwin,然后开始在Windows上面编译。Leptonica很快倒是OK了,不过这次tesseract非常不走运,一上来就是非常严重的问题:

error: ‘snprintf’ was not declared in this scope

error: ‘strtok_r’ was not declared in this scope

好吧,原来是找不到这个函数了,可是这怎么可能!!搜了一下含有strtok_r的文件,发现VS工程目录下有个port目录,貌似是为了Windows兼容性而准备的,里面有个strtok_r的手动实现版本。不过好奇怪啊,Cygwin不是模拟的UNIX环境吗,怎么会需要Windows的东西?不管了,先加上再说。然后是查找snprintf函数,发现它就躺在Cygwin自带的GCC的stdio.h里面。它被无视了?可这又为什么?

继续Google,这时一个关于此函数的叙述引起了我的注意:

snprintf不是标准中规定的函数,但是很多编译器都自带了这个函数。

原来是这样。还有另一个叙述:

我遇到过这种情况,需要把编译标准改为gnu++11而不是c++11。

哈哈,貌似有救了。打开configure脚本,把所有的c++11改为gnu++11,重新configure重新make。OK,一次通过。不过至于训练工具,我实在是懒得再编译了(好像cygwin不支持它所需要的那几个库。)

终于可以用上exe版本的最新的tesseract-ocr了。哈哈!

Samsung Galaxy S4 四核版(i9505) 真正可用的ROOT方法

刚拿到机器就琢磨着怎么获取ROOT权限。网上各种“一键ROOT”工具都试过了,都不可以。算了,还是到国外神坛xda-developers上面找找吧。真不错,找到能用了!

注意,如果你想要用此工具,确定你的机器型号是i9505,其它一律不行!

我已经试过i9505了,保证可以!

破解工具下载地址:

CF-Auto-Root-jflte-jfltexx-gti9505.zip

我就把原来的说明翻译一下吧:

– Download and unzip the CF-Auto-Root-….zip file

把这个文件下载并解压

– (USB) Disconnect your phone from your computer

把你的手机数据线从电脑上拔下
– Start Odin3-vX.X.exe

运行Odin3-v1.85.exe
– Click the PDA button, and select CF-Auto-Root-….tar.md5

点击PDA按钮,如图,并且选择CF-Auto-Root-jflte-jfltexx-gti9505.tar.md5
– Put your phone in download mode (turn off phone, then hold VolDown+Home+Power to boot – if it asks you to press a button to continue, press the listed button, or run adb reboot download command)

让你的手机进入下载模式(方法:关机,按住音量向下+主屏幕键+电源键开机。如果它问你是否继续,那你选继续就可以了。你要是启用了调试模式,也可以用adb reboot download这个命令)
– (USB) Connect the phone to your computer

把手机数据线连上电脑
– Make sure Repartition is NOT checked

你要确保Repartition这个选项没有被选中(当然如果它是灰色的就不用管啦)
– Click the Start button

点击 Start 按钮
– Wait for Android to boot
– Done (if it took you more than 30 seconds, you need practise!)

等着就可以了,可能要一段时间!别动你的手机!

Galaxy S4 i9505的MIUIV5!传送+中文崩溃问题解决方法

相信大家等适配很久了,却没见S4的MIUI ROM。这次xda-developers论坛上的bmarko82大神为我们带来了i9505及其衍生机型的MIUI适配(仅支持高通600处理器),还算是比较完美的,等不及的可以开刷了。

原帖地址:http://forum.xda-developers.com/showthread.php?t=2306650
微盘下载地址:http://vdisk.weibo.com/s/zmYgMCNF1IqST

只翻译一下重要的地方:
暂不支持红外,电视输出和PIN锁。OTG“应该可用,未测试”。(很遗憾,我刚刚测试了,不可用!)
需使用CWM Recovery,刷之前务必禁用PIN锁。
如果你之前用的不是MIUI,再刷之前要格式化/cache、/system、/data分区;是的话只需格式化/system。
不含Google Play应用商店,有需要请使用Google Installer进行安装。

重要!如果只刷入上面一个包,切换至中文会出现com.android.phone崩溃的问题的。解决方法如下:(感谢aiwa1225 的提醒)
先选择英文,进入系统,安装Root Explorer;
下载framework-miui-res.apk(链接:http://vdisk.weibo.com/s/zmYgMCNF1IqSK),将之覆盖掉/system/framework下的同名文件,修改权限,如下图,重启就OK了。
<ignore_js_op>9d82d158ccbf6c81b6266d6cbc3eb13533fa4024.jpg

我发现的问题:
锁屏前会顿一下;
切换至中文界面后仍夹杂有少量英文,应该不影响正常使用的;
极少数动画效果不是特别流畅,但总体很赞,比小米桌面舒服很多;
相机有点小问题:第一次启动可能需要切换到录像模式才能看到图像,再切换回去就正常;开启闪光灯拍照时可能会卡顿;
……
其实刚开始也难免有这些问题(大神也要工作和休息的,他可能没注意到此些问题)。各位机友如果发现了其它问题也可以在此帖子里回复,我会想办法向bmarko82大神反馈下的……
再传几张截图吧,我自己的,刚刷完不久,没怎么美化:
Screenshot_2013-07-26-03-16-07.png Screenshot_2013-07-26-03-16-56.pngScreenshot_2013-07-26-03-17-48.png

为HD2上的Android 4.1开启SWAP

刷了MIUI V4 JB版,实在是不堪忍受各种程序自动关闭啊,于是就上SWAP了。

STEP 1:下载MiniTool Partition Wizard Home Edition。

盛赞这款工具,一直在用它,对数据保护很好,功能很多,最重要的是免费使用!!(仅英文版)

STEP 2:拔出SD卡,插到读卡器上面。曾经试过用USB存储模式来干这事,这是不行的,工具不认。为了干这事又买了个品胜的读卡器,算是保险一些。(我之前那个丢了哇……好笨……)

STEP 3:连接SD卡到电脑,启动工具,找到SD卡上的FAT32分区,进行Resize操作,使之后面留出几百兆的空间。(我用的Sandisk 16GB C6卡,分了300MB。如果SD卡性能不好就最好别开SWAP了,会睡死的……)然后在腾出来的空间里新建一个Linux Swap分区,设置为Primary,然后执行操作即可。数据可以不备份,不放心的话最好还是备份下。

STEP 4:很快完事。弹出卡,插回手机。打开终端模拟器。输入这些内容:

cd /dev/block

ls

会出来一堆名字。一般来说会有这几个:

mtd是指手机里的内存空间
mtdblock0    splash1
mtdblock1    recovery
mtdblock2    boot
mtdblock3    system
mtdblock4    cache
mtdblock5    userdata

而mmc指SD卡空间
mmcblk0 指第一个SD卡,当然只有1个
mmcblk0p1 指第SD卡上的第一个分区  Fat32
mmcblk0p2 指第SD卡上的第二个分区

根据刚才的操作,当然就是mmcblk0p2啦。再输入以下内容,开启SWAP功能:

swapon /dev/block/mmcblk0p2

这下子就好了。不过这只管用到重新启动之前。下次开机还要运行上面这行命令。