站长原创,版权所有ITEEDU,2011-07-29
进入公司之后,一直在做ocr这里。从06月26日到公司,已经一个月了,今天终于做完了这个模块。回想起来这种经历,真是从头开始,一直处于摸索的状态,包括让我做的CTO。去了之后,只是给了个google地址,去读源码,一周做出个模型来……
不断地尝试,大致经历了一下几个阶段,尤其说是阶段,不如是不断地尝试不同的方案的过程:
(1)第一个方案:从阅读tesseract-ocr,了解其功能,安装,测试,调用其接口函数;从windows转到linux下边;从cpp调用完毕到JNI技术的支持,搞了两周左右,最后,宣告此路线失败……
原因:JNI技术对所调用的c/c++库要求较为严格,其调用的.so文件找到了,通过.so文件再次搜索更底层的库时,就会出错;最终归结于所.so文件所调用的tesseract-ocr本身在编译安装的时候,其源码中所带的makefile文件本身就没有包含进去所有的库文件,呜呜……
(2)第二个方案:在第一个方案的基础上,将JNI改为JNA技术。
在此,先简单讲述一下JNI和JNA的最直接的区别:利用JNI时,思路:java利用JNI机制调用中间我们自己编写的cpp所生成的.so文件,该.so文件又调用了其他的库;利用JNA时,在java中直接就添加了所用到的lib库,故而出错就比JNI较少……
但事实上,同样还是出错了,因为该过程所调用的库太多了,不是添加那么一个或者几个就可以解决的。
(3)第三个方案:采用Apache+cgi实现一个图片文字信息提取的ocr服务器。眼看着就要成功,结果还是失败了……
原因:传递过来的是的图片内容,并且在windows下边以base64编码得到的字符串,在这里接受了,用c++对其进行base64解码,我的天哪,明明就是按照base64规则,写出的算法,怎么就得不出正确的结果——生成不了正确的本地临时图片。最终原因是java的base64编码规则,和我这里c++编码规则对最简单的字符串所编码的结果都不一样,而客户端那里又不曾研究java base64具体的编码算法……
(4)第四个方案:采用Tomcat+java web实现一个图片文字信息提取的ocr服务器。在原来的基础上,两天之内测试和移植完毕,呵呵……
在整个过程,我可谓是,走一步,想一个方案,又去测试,不成功,再次测试……,直到最后一个方案,在我想出来之后,我才释然了,因为我觉着这个方案实现起来最简单,几乎所有代码都是现成的,经过CTO同意,就实施了……
(1)利用java web+tomcat服务器来接收远程发送过来的图片内容,并进行base64解码,以生成服务器上的临时文件;
(2)实现一个java类,来调用服务器上的cpp可执行文件;
(3)实现cpp程序,功能:
读取临时图片,调用ImageMagick将jpg转换成bmp,调用ocr给远程返回图片上文字内容。
具体实现过程,见源码包。
本地测试成功。
上传到服务器上,等于移植过程。再次采用安装原包的原因:
(1)所包含的类库太多了,没有办法进行一一地搜索完整然后copy到服务器上;
(2)测试机器是32位,而服务器是64位的,需要安装完毕,重新对源码进行编译生成二进制可执行文件。
sudo apt-get install libpng12-dev
sudo apt-get install libjpeg62-dev
sudo apt-get install libtiff4-dev
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install automake
wget http://www.leptonica.org/source/leptonlib-1.67.tar.gz
tar -zxvf leptonlib-1.67.tar.gz
cd leptonlib-1.67
./configure
make
make install
安装目录为/opt/ocr
./configuer --prefix=/opt/ocr
make
make install
下载和安装中文包:
安装目录为opt/IMageMagick
./configuer --prefix=/opt/IMageMagick
make
make install
利用makefile文件进行编译。
该程序包在服务器的/root目录下边。
进入服务器/root/imageocr目录下的Debug目录中,直接make即可。
编译完毕后,将cpp可执行文件image-ocr放入/bin目录下边……
公司的服务器上已经有一个tomcat服务器了,我们还需要单独安装一个tomcat服务器作为ocr专门的接口服务器。该部分内容在后续中我们会专门介绍。
java程序完成了接收远程传递过来的图片内容,对其进行base64解码,在服务器上生成jpg图片,调用ocr接口去读取服务器上的jpg图片,并提取图片上的文字,再返回其文字信息给java web进行转发处理。
这些都需要在服务器上进行的,所以都必须上传到服务器上,具体的上传过程,在后续中会专门介绍。
测试通过,url:
http://202.108.112.121:8080/arserver/post
返回的是图片上文字内容。