需要好的 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吗? [关闭]