我正在尝试使用tesseract OCR扫描名片,我正在做的是在没有预处理的情况下发送图像,继承我正在使用的代码。
Tesseract* tesseract = [[Tesseract alloc] initWithLanguage:@"eng+ita"];
tesseract.delegate = self;
[tesseract setVariableValue:@"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@.-()" forKey:@"tessedit_char_whitelist"];
[tesseract setImage:[UIImage imageNamed:@"card.jpg"]]; //image to check
[tesseract recognize];
NSLog(@"Here is the text %@", [tesseract recognizedText]);
正如您所看到的那样,准确度不是100%,这不是我所关注的,我想我可以用一些简单的每处理来解决这个问题。但是,如果你注意到它混合了底部的两个文本块,它们分割了地址,可能还有其他卡上的其他信息。
我怎么可能使用Leptonica(或其他可能的OpenCV)以某种方式对文本进行分组?可能会单独在图像上发送文本区域以进行扫描? 我一直坚持这个问题,欢迎任何可能的解决方案!
答案 0 :(得分:1)
我建议使用一种称为“运行长度平滑算法”(RLSA)的算法。该算法用于许多文档图像处理系统,但并非每个系统都将其作为API的一部分公开。
original paper于1982年出版,需要付款。但是,许多其他关于文档图像处理的论文引用了相同的算法,您可以在其中轻松找到实现细节和改进。
其中一篇论文是这样的:http://www.sciencedirect.com/science/article/pii/S0262885609002005
基本思想是逐行扫描文档图像,记录字母间隙的宽度。
然后,可以通过过滤间隙的宽度来组合附近的文本字符,并将小间隙设置为与文本相同的颜色。结果将是大型连接组件,代表:
如果您无权访问任何公开此功能的文档图像分析库,您可以通过以下方式模拟效果:
大多数图像处理库(如OpenCV)都提供此类功能。采用这种方法可能效率较低,因为除非用户为应用程序提供文本间隙大小,否则必须使用不同的文本间隙大小重新运行算法以实现不同的群集级别。
答案 1 :(得分:0)
我认为你已经遇到了OCR的一个基本问题 - 这种打印设计使用空格作为有意义的分隔符,但是OCR软件没有/无法理解。
这只是在黑暗中的狂野刺伤,但这是我会尝试的:
从左上方开始,构建一个可能占整个图像大小1-5%的框。将其发送到OCR,看看你是否得到了看起来有意义的东西。如果没有,请展开直到得到一些东西。
一旦你有了什么,开始以合理的单位扩展块,直到你停止获取新数据。希望你能够确定这一点是“有意义的空白区域”,现在你可以将这个处理过的文本视为“一个块”,从而完成。现在从图像的下一个未处理部分开始,然后一直工作直到你完成整个图像。
通过使用一组相互链接的扩展框,希望您只能获得组合在一起的有意义的数据块。使用您的示例,一旦您隔离徽标并处理它(以及由此产生的乱码),下一个框将以Noah中的“N”开头。然后向右扩展,直到你得到全名。
完成这一步后你再去一次,希望你能得到一个包含Associate中“A”的边界框,并获得整行。
一次一个像素,这对于所有那些运行到OCR的时间太长了,我敢肯定,但是肯定会在“每个间隔扩展的块的大小”和“处理量”中进行权衡。需要”。
我不明白为什么这种方法不适用于相对正常的印刷设计,例如普通风格的名片。
答案 2 :(得分:0)
您可以尝试HOCRText,它将所有扫描的单词以及该图像中每个单词的帧作为xml返回。
char *boxtext = _tesseract->GetHOCRText(0);
您可以解析该xml以获取每个单词及其框架。 否则,如果您需要,可以在图像中提及应该扫描的帧。
_tesseract->SetRectangle(100, 100, 200, 200);
在调用识别之前设置此帧。因此,tesseract将仅扫描该帧并返回该帧的文本。
答案 3 :(得分:0)
Github上有一个示例iOS应用程序可以帮助您:
https://github.com/danauclair/CardScan
他如何阅读名片?他写了以下内容,(或者您可以在文件中阅读:https://github.com/danauclair/CardScan/blob/master/Classes/CardParser.m)
// A class used to parse a bunch of OCR text into the fields of an ABRecordRef which can be added to the
// iPhone address book contacts. This class copies and opens a small SQLite databse with a table of ~5500
// common American first names which it uses to help decipher which text on the business card is the name.
//
// The class tokenizes the text by splitting it up by newlines and also by a simple " . " regex pattern.
// This is because many business cards put multiple "tokens" of information on a single line separated by
// spaces and some kind of character such as |, -, /, or a dot.
//
// Once the OCR text is fully tokenized it tries to identify the name (via SQLite table), job title (uses
// a set of common job title words), email, website, phone, address (all using regex patterns). The company
// or organization name is assumed to be the first token/line of the text unless that is the name.
//
// This is obviously a far from perfect parsing scheme for business card text, but it seems to work decently
// on a number of cards that were tested. I'm sure a lot of improvements can be made here.