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

Tre*_*ith 10 ocr

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

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

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

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

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

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

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

Aar*_*lla 6

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

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

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

  • 明白了吗?如果你的时间没有任何成本,Tesseract只是免费的.但您可以在tesseract用户组中发布问题.他们在那里很友好,你的输入将有助于让下一个人更容易设置这个野兽. (3认同)

Elm*_*mue 5

今天有两个新的选择(问了问题的几年后):

1.)

Windows 10附带了Microsoft的OCR引擎。

它在名称空间中:

Windows.Media.Ocr.OcrEngine
Run Code Online (Sandbox Code Playgroud)

https://msdn.microsoft.com/zh-CN/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 Update下载世界上存在的每种语言,甚至可以手写!


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


Fut*_*der 5

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

原截图: 原始截图 谷歌文档 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; 
Run Code Online (Sandbox Code Playgroud)