10

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

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

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

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

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

你们中有人找到了一个很好的在源代码上运行的 OCR 解决方案吗?

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

4

7 回答 7

6

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

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

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

于 2009-12-11T15:11:05.943 回答
5

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

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 -一些基本面

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 一样多。

于 2016-07-26T16:36:17.667 回答
2

试试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 没有“源代码”选项,其中空白被视为重要。

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

于 2015-04-22T21:04:10.147 回答
1

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

于 2009-12-11T15:24:45.220 回答
1

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

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

于 2009-12-11T14:58:34.437 回答
1

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

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

  • 前导空格:也许邮政编码漂亮的打印机过程可以提供帮助
  • 下划线和标点符号:也许可以为此训练一个好的产品
于 2009-12-11T15:07:02.250 回答
1

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

原始屏幕截图: 原始截图 Google Docs OCR: 谷歌文档 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; 
于 2020-05-19T00:18:40.263 回答