1)在主页上下载了tesseract-3.01-win_vs.zip(工程);tesseract-3.01.tar.gz(源代码)之后;解压;(注意:选择解压到****\(E)。如:解压到tesseract-3.0.1\(E))。
2)将目录tesseract-3.01中的所有文件夹拷贝到\tesseract-3.01-win_vs\tesseract-3.01中。
3)对于tesseract工程:打开vs2010文件夹,删除post-build.cmd文件,(因为该配置文件对部分的配置有效)
4)在vs2010环境中打开tesseract工程,选择其属性,在后期生成事件中均删除所有配置的命令行
5)在c/c++-〉预处理器-〉预处理器定义中填入“__MSW32__”(注:不是_MSW32_),否则会引起\host.h(123): error C2146: 语法错误: 缺少“;”(在标识符“inT64”的前面)错误。
6)libtesseract工程与tesseract工程里面同时包含了baseapi.cpp、pageiterator.cpp、resultiterator.cpp。所以如果你把libtesseract工程编译成静态的lib或者动态的dll及其导出库lib,然后在tesseract工程中清除原有的工程依赖项,并把libtesseract对应的静态lib或者动态dll对应的lib作为linker的输入,则会出现函数重复定义,因为tesseract中也包含了baseapi.cpp、pageiterator.cpp、resultiterator.cpp,故应该先把tesseract工程里的baseapi.cpp、pageiterator.cpp、resultiterator.cpp删除。
7)如果你的图片仅仅只有一行,如:
但如果你直接把该图片放在tesseract中运行,并在dos窗口中显示,会有两个回车换行符。原因是tesseract识别结果的输出是以utf8编码的,并且在末尾加了两个回车符。所以对于一行文本的图像来说,应该要去掉这两个回车符,可以把baseapi.cpp修改为
char* TessBaseAPI::GetUTF8Text() { if (tesseract_ == NULL || (!recognition_done_ && Recognize(NULL) < 0)) return NULL; int total_length = TextLength(NULL); PAGE_RES_IT page_res_it(page_res_); char* result = new char[total_length]; char* ptr = result; for (page_res_it.restart_page(); page_res_it.word () != NULL; page_res_it.forward()) { WERD_RES *word = page_res_it.word(); WERD_CHOICE* choice = word->best_choice; if (choice != NULL) { strcpy(ptr, choice->unichar_string().string()); ptr += choice->unichar_string().length(); //if (word->word->flag(W_EOL)) // *ptr++ = '\n'; //else // *ptr++ = ' '; } } // *ptr++ = '\n'; // *ptr = '\0'; return result; }
8)在vs2010环境下运行(即f5键,或工具栏中 三角形符号按钮),当出现错误在:
for (i = 0; i < Templates->NumClasses; i++) {
NormAdjust = (int) (INT_CHAR_NORM_RANGE *时候,主要是tessdata特征库文件未找到。但你当按组合键ctrl+f5,就会发现提示的错误信息。
9)如果自定义某个语言的特征库词典,此时使用的tesseract的版本一定要与生成该特征词典的tesseract版本一致。
10)在word里生成bmp文件时,不要对里面的符号进行类似于 膨胀,或者闭操作等。如果一味追求类别中的字符个数,反而导致准确度差。