编译tesseract-ocr碰到的问题以及解决方法

下载地址 https://github.com/tesseract-ocr/tesseract
首先下载了 tesseract-master 版本,
解压后运行 ./autogen.sh 提示 libtoolize: command not found

使用yum install libtool 安装缺少的命令,重新运行 ./autogen.sh, 成功生成 configure 文件,
运行 ./configure 提示需要C++11版本的编译器,不想升级系统自带的gcc版本
重新下载 https://github.com/tesseract-ocr/tesseract ,切换tag,选择 3.0.5分支,下载 tesseract-3.05.zip
unzip tesseract-3.05.zip 解压后,运行./autogen.sh生成configure文件

运行./configure 提示 leptonica not found
到 http://www.leptonica.org/download.html 下载安装包,目前最新版本为 leptonica-1.74.1.tar.gz
tar -xzvf leptonica-1.74.1.tar.gz
cd leptonica-1.74.1
./configure
./make
./make install

重新回到 tesseract-3.05目录下,
./configure
./make
./make install

安装完成
接着需要数据文件,到 https://github.com/tesseract-ocr/tessdata
按照提示,不下载master数据,切换到 tag/3.04.00 分支下下载数据文件,
下载完成后,将 eng开头的9个文件拷贝到 /usr/loca/share/tessdata目录下

Popularity: 2% [?]

Random Posts

使用CodeTyphon做FPC编译碰到的问题记录2

之前使用了CodeTyphon做FPC交叉编译,将Delphi写的部分命令行工具修改编译到Linux下运行,又碰到如下一些问题:
1. 重新安装后,不能Win64版本下编译生成x86_x64-linux的交叉编译相关包
解决方法:使用Win32版本编译生成x86_x64-linux交叉编译相关包

2. 代码文件中的中文字符,编译后运行显示乱码
原因,Delphi下写的代码是用GBK编码的,FPC高版本使用UTF8编码,格式转化失败
解决方法:在包含中文字符的代码文件最前面添加 {$codepage cp936} 指定源码文件的编码格式
编译再次碰到问题,提示cp936是不能识别 codepage
解决方法:检查CodeTyphon的fpcsrc目录下fpc编译器源码,
发现compiler/widestr.pas 文件中uses部分缺少cp936的引用,
修改该文件添加cp936的单元引用,
然后将 packages/rtl-unicode/src/inc/cp936.pas 文件拷贝一份到 rtl/charmaps目录下,
同时也修改rtl/charmaps/cpall.pas,添加cp936单元的引用
重新运行CodeTyphon安装程序,选择 4) Remove and Build FreePascal,
结束后,重新编译项目,再次在Linux下运行编译后的程序,中文可以正常显示了。
注: 修改后的文件,要添加/替换到 allzips/src/fpc_src.7z 中,否则重新编译时会自动被压缩包中解压出来的文件替换掉,导致修改失败

3.部分使用Hex格式传输的GBK中文字符,还原输出后显示为乱码
解决方法:对于还原回来的中文字符串,添加如下一个设置字符代码页的代码
SetCodePage(RawByteString(myStr), 936, false);
重新编译运行,问题解决。

4. 使用+号拼装中文字符串时,中文字符出现乱码,
解决方法,多写几个语句,拆分为单个+号连接
比如
Result := Result + ‘测试’ + sOther + ‘结束’;
修改为:
Result := Result + ‘测试’;
Result := Result + sOther;
Result := Result + ‘结束’;
问题解决。

Popularity: 2% [?]

Random Posts

MindManager2017配套插件ResultManager和MindReader使用注意点

换回Windows系统使用,安装上了MindManager 2017, 同时也找回很久以前的两个配套插件
ResultManager www.gryonix.com 新的MindManager 2017版本插件已经转移到 www.olympic-limited.co.uk 公司开发维护。
MindReader http://wiki.activityowner.com/index.php?title=MindReader

安装MindReader 要注意几个要点,否则使用会有异常
1. 安装时,虽然安装包有让修改安装路径,但是千万不能能修改,安装在非默认路径下插件运行会出错
2. 在MindManager安装后的MyMaps目录下要有如下两个文件

3. 初次通过MindReader建立主题,会提示创建/升级配置文件,配置文件路径在 MyMaps目录下的 ao\mindreaderconfig.mmap 中
在MindManager中打开这个配置文件,
a. 修改 links->defaultmap的路径,使其指向 MyMaps\Daily Capture Map.mmap,
如果不设置,则每次通过MindReader创建主题都会新建一个脑图文件。
b. 修改 CustomIcons 中 rmproject 和 rmresult 的图标基准路径为 C:\Program Files (x86)\Gyronix\Gyronix ResultsManager v3 for MindManager 2017 x86\Images 可以根据实际安装的路径做修改。
c. 其他根据自己需要添加修改的配置项

Popularity: 2% [?]

Random Posts

Clion遇到Out Of Memory问题的解决方法

运行已久的Clion环境突然提示Out of Memory,跳出程序,重新打开,项目加载完成后过一会又是Out of Memory崩掉,查看系统内存,还有很多,不是系统内存不够的原因。

将运行路径下的 clion64.exe.vmoptions 内容

-Xms256m
-Xmx2000m
-XX:NewSize=128m
-XX:MaxNewSize=128m

修改为

-Xms256m
-Xmx4000m
-XX:NewSize=256m
-XX:MaxNewSize=256m

将设置的值放大一倍后,重新启动Clion,在加载项目完成后,建立索引和符号时没有再出现Out of Memory错误崩溃

Popularity: 2% [?]

Random Posts

MySQL Connector++ 使用getString获取表字段数据出错

Linux下一个使用MySQL Connector++ 1.1.0 连接MySQL数据库的程序,在连接数据库获取数据时程序崩溃,
确定数据库中存在记录值,查看Core Dump文件,发现崩溃点发生在调用 MySQL 库的 getString 方法时的那一行,

通过google搜索,发现好一些getString出错的问题,但是多数是Windows下VS编译环境不同造成的,终于发现下面一篇中有和我的问题类似

http://stackoverflow.com/questions/4822958/mysql-c-connector-getstring-doesnt-work-correctly-while-getint-works-perfe

I had a similar problem the program would give a memory exception. Here is what I did to fix it:
std::string version = result->getString( COLUMN_NAME ).c_str();

This didn't work:
sql::SQLString sString  = result->getString( COLUMN_NAME ); <<

我的不正常代码是

std::string value = result->getString( field);

按照上面的方法将代码修改为

std::string value = result->getString( field).c_str();

暂时获取同样的数据没有出错,希望后面也不要出错。
MySQL Connector++ 从版本1.1.4开始编译依赖于BOOST库

Popularity: 2% [?]

Random Posts

    SQLite数据存取速度慢的原因分析

    写了一个小工具,使用SQLite作为本地数据结构的存取,但是在默认情况下,发现大批量插入数据的速度很慢,100条不到的记录,花了快10秒,没错不是毫秒,是秒,深感SQLite的存取速度太慢,现在很多软件都在使用SQLite作为本地数据存取,这么慢存取的效率怎么能用呢,估计是有什么参数没有设置对,网上搜索后发现如下一篇文章Increasing SQLite Performance
    文章主要是通过PRAGMA对一些参数设置不同值做效率对比

    方式 测试结果值 说明
    TEMP_STORE DEFAULT 235 不同值区别不大
    FILE 225
    MEMORY 215
     
    JOURNAL_MODE DELETE * 235 使用MEMORY和OFF方式速度较快
    TRUNCATE 210
    PERSIST 220
    MEMORY 65
    OFF 63
     
    SYNCHRONOUS FULL 235 OFF有较大提升
    NORMAL 175
    OFF 43
     
    LOCKING_MODE NORMAL 235 EXCLUSIVE独占有较大提升
    EXCLUSIVE 155

    另外 PAGE_SIZE 和 CACHE_SIZE 的只修改,对性能影响不是很明显,所以为了提升插入效率,在使用事物的基础上还可以通过修改 JOURNAL_MODE、SYNCHRONOUS和LOCKING_MODE的值

    PRAGMA locking_mode=EXCLUSIVE
    PRAGMA synchronous=0
    PRAGMA journal_mode=MEMORY
    

    Popularity: 2% [?]

    Random Posts

      libevent2的evhttp获取网页数据失败(dns未能正确解析)

      使用libevent2的evhttp请求阿里大于接口,调用失败,没有正确请求数据,但是利用curl可以正确访问。
      使用抓包工具抓包分析,和curl发起的请求对比发现libevent2在dns查询后没有连接实际的ip地址建立连接,怀疑libevent2没有正确的对dns解析结果做处理。
      网上搜索发现如下这篇文章:域名随机大小写导致libevent2的异步DNS解析失败

      经过检验,确实时dns查询阿里大于api接口域名返回的应答信息中,域名大小写和请求时的有所不同,
      于是翻看libevent2的代码,发现有函数evdns_base_set_option可以设置global_randomize_case的值,

      在阿里大于接口请求前添加一样代码:
      evdns_base_set_option(dnsbase, “randomize-case”, “0″);
      重新编译运行,解决问题。

      Popularity: 2% [?]

      Random Posts

        libcurl请求速度慢问题解决

        一直使用libcurl请求接口数据,最近发现一个问题,post部分请求速度变慢,每次都要超过一秒,get速度没有变化,0.1秒左右获取完毕。
        对POST请求打开VERBOSE开关,看到发出请求头信息包含 Expect: 100-Continue, 网上查找对应说明,当POST数据大于1024字节时,
        有这个头信息会先等待服务端一个继续接受的应答才继续上传,如果服务端没有应答会等待1秒再继续上传后续数据,对照VERBOSE输出的信息,
        发现发出的Content-Length 大小1026字节,刚好超出1024字节,服务端没有对100-Continue做应答于是libcurl多等了1秒才发送数据。
        修改方法,让libcurl不处理Expect 头信息

        1.   /* 添加头信息 */
        2.   struct curl_slist *list = NULL;
        3.   list = curl_slist_append(list, "Expect: ");
        4.  
        5.  /* 设置头信息 */
        6.   curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
        7.   …
        8.   curl_slist_free_all(list); /* 释放头信息 */

        添加这段代码后,再次请求,时间降到0.x秒内,速度正常

        Popularity: 3% [?]

        Random Posts

          Linux下df和du看到的剩余空间不一致处理方式

          昨日突然测试用的Linux服务器报存储空间不足,使用 df 查看,磁盘已经使用 100%,使用du 命令查看使用空间最大的目录,结果发现 du 显示的总使用空间才占用总磁盘空间的 70%左右,剩下的 30%空间跑哪去了呢?
          找了一下df和du区别的资料,发现他们的工作方式有所区别,所以造成了看到的结果不一致

          du的工作原理
          du命令会对待统计目录下的文件逐个调用fstat,获取每个文件大小。它的数据获取是基于文件目录中的文件的,可以跨越多个分区操作。如果目录中文件很多,那么du的速度就会很慢.

          df的工作原理
          df命令使用statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它只能针对整个分区块,运行速度不受文件多少的影响。

          du和df不一致的一般原因
          常见的df和du不一致情况是文件删除造成的,当一个文件被删除后,在文件系统目录中已经不可见了,所以du就不会再统计它了。然而如果这个时候还有运行的进程持有这个已被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。

          一般处理方法
          使用lsof命令找到还持有被删除文件句柄的进程,然后关闭进程或者杀掉进程用以释放空间。

          lsof | grep deleted

          避免这个问题的一般方法
          1.可以使用清空文件的方式来代替删除文件,方式是:

          echo > myfile

          2.对于要经常做删除操作的日志文件,以改名、清空、删除的顺序操作

          Popularity: 2% [?]

          Random Posts

            NDK回调Java类方法碰到的问题解决

            以前写的一个Android程序,使用NDK回调Java中的类函数方法,以前在Android 4.x之前的系统上都没有问题,5.x,6.x系统的手机上在回调Java类函数时,出错,报:… invalid object …

            搜索Google发现,是由于jni接口触发时,传入的jobject对象使用的是Local reference方式,而自己写的ndk代码是将这个类对象存起来作为全局对象使用了。

            http://android-developers.blogspot.com/2011/11/jni-local-reference-changes-in-ics.html

            JNI 函数参数中 jobject 或者它的子类,其参数都是 local reference。Local reference 只在这个 JNI函数中有效,JNI函数返回后,引用的对象就被释放,它的生命周期就结束了。若要留着日后使用,则需根据这个 local reference 创建 global reference。Global reference 不会被系统自动释放,它仅当被程序明确调用 DeleteGlobalReference 时才被回收。(JNI多线程机制)
            gobj=(*evn)->NewGlobalRef(evn, object);

            需要在存起来的地方将这个类对象先NewGlobleRef一下,使其不会由于在退出这个保存对象的jni调用后就因为Local临时对象引用被销毁掉,导致后续的NDK调用访问不到这个临时对象,报错跳出程序。

            代码做了这个小修改后,再在NDK代码中调用这个java类的方法,程序没有再报错。

            Popularity: 2% [?]

            Random Posts

              ← Previous PageNext Page →