需要良好的OCR打印源代码列表,任何想法?

时间:2009-12-11 14:54:15

标签: ocr

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

显然,输入它需要很长时间并且总是有额外的时间来调试输入错误(oops错过了“$”符号)。

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

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

我觉得源代码很容易OCR,因为字体是无衬线和等宽字体。

你们有没有找到一个在源代码上运行良好的优秀OCR解决方案?

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

7 个答案:

答案 0 :(得分:5)

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

  • Abbee FineReaderOminPage。两者都是商业产品,在功能和OCR结果方面大致相同。我不能说OmniPage,但FineReader确实支持读取源代码(例如,它有一个Java语言库)。
  • 最好的OSS OCR引擎是tesseract。它使用起来要困难得多,你可能需要为你的语言训练它。

我很少做OCR,但我发现花费150美元购买商业软件可以减轻浪费时间。

答案 1 :(得分:3)

今天存在两个新选项(问题提出后几年):

<强> 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 Update下载世界上存在的每种语言 - 即使是手写!

<强> 2)。

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

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

缺点是每个Office安装都支持少量语言。例如,西班牙语Office支持西班牙语,英语,葡萄牙语和法语。但是我注意到,如果你使用西班牙语或英语作为OCR语言来检测西班牙文本,那几乎没有什么区别。

如果将图像转换为灰度,则可获得更好的效果。 认可还可以,但它并不能让我满意。虽然Tesseract需要更多的图像预处理才能获得这些结果,但它产生的误差几乎和Tesseract一样多。

答案 2 :(得分:1)

打印文本vs手写通常更容易进行OCR,但这一切都取决于你的源图像,我通常会发现以PNG格式捕获,减少颜色(灰度最好)并进行一些手动清理(删除因扫描等造成的图像噪声)效果最佳。

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

答案 3 :(得分:1)

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

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

  • 领先的空白:也许是一个邮政编码 漂亮的打印机程序可以帮助
  • 下划线和标点:也许是 好的产品可以接受培训

答案 4 :(得分:1)

OCRopus也是一个很好的开源选项。但就像Tesseract一样,有一个相当陡峭的学习曲线可以有效地使用和集成。

答案 5 :(得分:1)

试试http://www.free-ocr.com/。当我的IDE在编辑器会话中崩溃而没有警告时,我用它来从屏幕抓取中恢复源代码。它显然取决于您在编辑器中使用的字体(我在Delphi中使用Courier New 10pt)。我试图使用谷歌文档,当你上传图片时它会OCR图像 - 而谷歌文档在扫描文档方面相当不错,但由于某种原因,它在失败的Pascal源文件上失败了。

FreeOCR的一个例子:输入图像:

image uploaded

给出了这个:

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没有源代码&#34;选项,其中空格被视为重要空格。

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

答案 6 :(得分:1)

Google Drive的内置OCR对我来说效果很好。只需将扫描结果转换为PDF,然后上传到Google云端硬盘,然后选择“使用...打开Goog​​le文档”即可。颜色和文字大小有些奇怪,但仍然包括分号等。

原始屏幕截图: original screenshot Google文档OCR: Google Docs 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;