需要好的 OCR 来打印源代码列表,有啥想法吗?

Posted

技术标签:

【中文标题】需要好的 OCR 来打印源代码列表,有啥想法吗?【英文标题】:Need good OCR for printed source code listing, any ideas?需要好的 OCR 来打印源代码列表,有什么想法吗? 【发布时间】:2010-12-25 16:56:42 【问题描述】:

在我的工作中,有时我必须获取一些打印的源代码并手动将源代码输入文本编辑器。不要问为什么。

显然,输入它需要很长时间,而且总是需要额外的时间来调试输入错误(哎呀,那里漏掉了一个“$”符号)。

我决定尝试一些 OCR 解决方案,例如:

Microsoft Document Imaging - 内置 OCR 结果:遗漏了所有前导空格、遗漏了所有下划线、错误地解释了许多标点字符。 结论:比手动输入代码慢。 各种在线网络 OCR 应用程序 结果:与 Microsoft Document Imaging 相似或更差 结论:比手动输入代码慢。

鉴于字体是无衬线和等宽字体,我觉得源代码很容易进行 OCR。

你们有没有找到一个很好的 OCR 解决方案,可以很好地处理源代码?

也许我只是需要一个更好的 OCR 解决方案(不一定是特定于源代码的)?

【问题讨论】:

【参考方案1】:

使用 OCR,目前有三种选择:

阿比FineReader 和OminPage。两者都是商业产品,在功能和 OCR 结果方面差不多。关于 OmniPage 我不能说太多,但 FineReader 确实支持读取源代码(例如,它有一个 Java 语言库)。 最好的 OSS OCR 引擎是tesseract。它更难使用,您可能需要针对您的语言对其进行训练。

我很少做 OCR,但我发现在商业软件上花费 150 美元可以弥补浪费的时间。

【讨论】:

我试过 tesseract。我第一次下载它时失败了。在线自述文件指定它不附带任何训练数据。我从网站上下载了英文训练数据并解压到 tessdata 子目录中。但后来它仍然抱怨“找不到 eng.unicharset”。我怎么搞砸了? 明白我的意思吗? Tesseract 只有在您的时间不花钱的情况下才免费。但是您可以在 tesseract 用户组中发布问题。他们在那里很友好,您的意见将有助于让下一个人更容易设置这个野兽。 @Aaron Digulla,先生,您能不能分享一些在 $150 到 $500 之间的 OCR 库, @Sajjad 我什么都不知道。 想指出的是,在没有经过训练的情况下,tesseract 与常规 ocr 没有什么不同,后者将忽略所有前导空格,忽略所有下划线。但是,它也很难训练,因为你需要花费时间来获取每个样本的标签。【参考方案2】:

今天有两个新选项(问题提出多年后):

1.)

Windows 10 附带 Microsoft 的 OCR 引擎。

它在命名空间中:

Windows.Media.Ocr.OcrEngine

https://msdn.microsoft.com/en-us/library/windows/apps/windows.media.ocr

Github 上也有一个例子:

https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/OCR

你需要 VS2015 来编译这些东西。或者如果你想使用旧版本的 Visual Studio,你必须通过传统的 COM 调用它,然后阅读 Codeproject 上的这篇文章:http://www.codeproject.com/Articles/262151/Visual-Cplusplus-and-WinRT-Metro-Some-fundamentals

OCR 质量非常好。然而,如果文本太小,您必须先放大图像。您可以通过 Windows 更新下载世界上存在的所有语言 - 甚至是手写!


2.)

另一种选择是使用 Office 中的 OCR 库。它是一个 COM DLL。它在 Office 2003、2007 和 Vista 中可用,但在 Office 2010 中已被删除。

http://www.codeproject.com/Articles/10130/OCR-with-Microsoft-Office

缺点是每个 Office 安装都支持少数语言。例如,西班牙办公室安装了对西班牙语、英语、葡萄牙语和法语的支持。但我注意到,如果您使用西班牙语或英语作为 OCR 语言来检测西班牙语文本,几乎没有区别。

如果您将图像转换为灰度,您会得到更好的结果。 识别还可以,但并没有让我满意。尽管 Tesseract 需要更多的图像预处理才能获得这些结果,但它产生的错误几乎与 Tesseract 一样多。

【讨论】:

【参考方案3】:

试试http://www.free-ocr.com/。当我的 IDE 在编辑器会话中崩溃而没有警告时,我已经使用它从屏幕抓取中恢复源代码。这显然取决于您在编辑器中使用的字体(我在 Delphi 中使用 Courier New 10pt)。我尝试使用 Google Docs,它会在您上传图像时对图像进行 OCR - 虽然 Google Docs 在扫描文档上非常好,但由于某种原因它在 Pascal 源上失败了。

FreeOCR 工作示例:输入图像:

给了这个:

begin
FileIDToDelete := FolderToClean + 5earchRecord.Name ;
Inc (TotalFilesFound) ;
if (DeleteFile (PChar (FileIDToDelete))) then
begin
Log5tartupError (FormatEx (‘%s file %s deleted‘, [Annotation, Fi eIDToDelete])) ;
Inc (TotalFilesDeleted) ;
end
else
begin
Log5tartupError (FormatEx (‘Error deleting %s file %s‘, [Annotat'on, FileIDToDelete])) ;
Inc (TotalFilesDeleteErrors) ;
end ;
end ;
FindResult := 5ysUtils.FindNext (5earchRecord) ;
end ;

所以替换缩进是大部分工作,然后将所有5 更改为大写S。它也被 80 列标记处的垂直线弄糊涂了。幸运的是,大多数错误都会被编译器发现(引用字符串中的错误除外)。

很遗憾,FreeOCR 没有“源代码”选项,其中空白被视为重要。

提示:如果您的来源包含语法突出显示,请确保在上传之前将图像保存为灰度。

【讨论】:

【参考方案4】:

打印文本与手写通常对于 OCR 来说更容易,但这完全取决于您的源图像,我通常发现以 PNG 格式捕获,减少颜色(灰度是最好的)并进行一些手动清理(去除由于扫描等引起的任何图像噪声)效果最好。

大多数 OCR 在性能和准确性方面都相似。具有训练/纠正能力的 OCR 是最好的。

【讨论】:

【参考方案5】:

OCRopus 也是一个不错的开源选项。但与 Tesseract 一样,要有效地使用和集成它有一个相当陡峭的学习曲线。

【讨论】:

【参考方案6】:

总的来说,我发现FineReader 给出了非常好的结果。通常所有产品都有试用版。尽可能多地尝试。

现在,程序源代码可能很棘手:

前导空格:可能是邮政编码 漂亮的打印机进程可以提供帮助 下划线和标点符号:可能是 好的产品可以为此进行培训

【讨论】:

【参考方案7】:

Google Drive 的内置 OCR 对我来说效果很好。只需将扫描件转换为 PDF,上传到 Google Drive,然后选择“Open with... Google Docs”。颜色和文字大小有一些奇怪的东西,但它仍然包括分号等。

原截图: Google 文档 OCR:

明文版:

#include <stdio.h> int main(void)  
char word[51]; int contains = -1; int i = 0; int length = 0; scanf("%s", word); while (word[length] != "\0") i ++; while ((contains == 1 || contains == 2) && word[i] != "\0")  
if (word[i] == "t" || word[i] == "T")  
if (i <= length / 2)  
contains = 1;  else contains = 2; 
return 0; 

【讨论】:

以上是关于需要好的 OCR 来打印源代码列表,有啥想法吗?的主要内容,如果未能解决你的问题,请参考以下文章

有啥想法可以像读取代码一样读取用户输入吗?

iPhone和/或Android手机有啥好的OCR API吗? [关闭]

编写ID3v2 Tag解析代码,需要好的例子来测试

Visual Studio 2010 - 在 *** 网络更改时崩溃......有啥想法吗?

对模型(类图)跟踪网站访问者有啥想法吗?

APP想要拥有OCR智能识别录入身份证的信息,大神们有啥建议吗?