10

私の仕事では、印刷されたソースコードを取得して、テキストエディタに手動でソースコードを入力する必要がある場合があります。理由を聞かないでください。

明らかに、入力には長い時間がかかり、入力エラーをデバッグするために常に余分な時間がかかります(おっと、そこで「$」記号を見逃しました)。

私は次のようないくつかのOCRソリューションを試すことにしました:

  • MicrosoftDocumentImaging-OCRが組み込まれています
    • 結果:先頭の空白をすべて見逃し、すべての下線を見逃し、句読文字の多くを誤って解釈しました。
    • 結論:手動でコードを入力するよりも時間がかかります。
  • さまざまなオンラインWebOCRアプリ
    • 結果:MicrosoftDocumentImagingと同等またはそれより悪い
    • 結論:手動でコードを入力するよりも時間がかかります。

フォントがサンセリフとモノスペースであることを考えると、ソースコードはOCRするのが非常に簡単だと思います。

ソースコードでうまく機能する優れたOCRソリューションを見つけた人はいますか?

たぶん私はより良いOCRソリューション(必ずしもソースコード固有ではない)が必要ですか?

4

7 に答える 7

6

OCRには、現在3つのオプションがあります。

  • AbbeeFineReaderとOminPage_ どちらも、機能とOCRの結果に関してはほぼ同等の商用製品です。OmniPageについてはあまり言えませんが、FineReaderにはソースコードの読み取りがサポートされています(たとえば、Java言語ライブラリがあります)。
  • 最高のOSSOCRエンジンはtesseractです。使用するのははるかに難しいです、あなたはおそらくあなたの言語のためにそれを訓練する必要があるでしょう。

私はめったにOCRを行いませんが、商用ソフトウェアに150ドルを費やすと、無駄な時間が大幅に減ることがわかりました。

于 2009-12-11T15:11:05.943 に答える
5

今日(質問が行われてから数年後)、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 -いくつかの基本

OCRの品質はとても良いです。それでも、テキストが小さすぎる場合は、前に画像を増幅する必要があります。手書きの場合でも、WindowsUpdateを介して世界中に存在するすべての言語をダウンロードできます。


2.)

もう1つのオプションは、OfficeのOCRライブラリを使用することです。COMDLLです。Office 2003、2007、Vistaで利用できますが、Office2010では削除されました。

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

欠点は、すべてのOfficeインストールにいくつかの言語のサポートが付属していることです。たとえば、スペイン語のOfficeは、スペイン語、英語、ポルトガル語、フランス語のサポートをインストールします。しかし、スペイン語のテキストを検出するためにOCR言語としてスペイン語または英語を使用しても、ほとんど違いがないことに気づきました。

画像をグレースケールに変換すると、より良い結果が得られます。認識はOKですが、満足できませんでした。Tesseractはこれらの結果を得るためにはるかに多くの画像前処理を必要としますが、Tesseractとほぼ同じくらいのエラーが発生します。

于 2016-07-26T16:36:17.667 に答える
2

http://www.free-ocr.com/をお試しください。私はこれを使用して、IDEが警告なしにエディターセッションでクラッシュしたときに画面グラブからソースコードを回復しました。明らかに、エディターで使用しているフォントによって異なります(DelphiではCourier New 10ptを使用しています)。私はGoogleDocsを使用しようとしました。これは、アップロード時に画像をOCRします。GoogleDocsはスキャンされたドキュメントではかなり優れていますが、何らかの理由で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

OCRの場合、通常、印刷されたテキストと手書きの方が簡単ですが、すべてソース画像によって異なります。通常、PNG形式でキャプチャし、色を減らして(グレースケールが最適)、手動でクリーンアップします(スキャンなどによる画像ノイズを削除します)。最適に動作します。

ほとんどのOCRは、パフォーマンスと精度が類似しています。トレーニング/修正機能を備えたOCRが最適です。

于 2009-12-11T14:58:34.437 に答える
1

一般的に、FineReaderは非常に良い結果をもたらすことがわかりました。通常、すべての製品で試用版を利用できます。できる限り試してください。

さて、プログラムのソースコードは注意が必要です。

  • 主要な空白:郵便番号のきれいなプリンタープロセスが役立つかもしれません
  • アンダースコアと句読点:おそらく、そのために優れた製品をトレーニングできます
于 2009-12-11T15:07:02.250 に答える
1

OCRopusも優れたオープンソースオプションです。しかし、Tesseractのように、それを効果的に使用および統合するには、かなり急な学習曲線があります。

于 2009-12-11T15:24:45.220 に答える
1

Googleドライブの組み込みOCRは私にとって非常にうまく機能しました。スキャンをPDFに変換し、Googleドライブにアップロードして、[Open with...GoogleDocs]を選択するだけです。色やテキストサイズには奇妙なものがいくつかありますが、それでもセミコロンなどが含まれています。

元のスクリーンショット: 元のスクリーンショット Google Docs OCR: 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; 
于 2020-05-19T00:18:40.263 に答える