レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

雑誌のプログラムリストのOCR読み取りについて検証してみた(その2)

2023年03月26日 | 自作プログラム

前回の続きです。

まずはProgramListOCR(1.7.3)でBASICプログラムリストを読み取ってみます。読み取りの前に上部のアイコンをクリックして、読み取るリストの種類を選択します。

BASICを読み込むときは"bas"か"n6x"を選択し、マシン語のダンプリストを読み込むときは"hex"を選びます。それ以外はプログラムリストの読み込みには向いていないようです。

"n6x"はPC-6001のBASICに特化しているようですが、他機種のBASICでも問題なく利用できます。カナ文字も読み取ってくれるので便利です。"bas"は一般的なBASIC向けなのでしょうか?こちらはカナ文字は読み取ってくれず文字化けします。"Multilingual"の項目でこれらを混在して使うことができるようなのですが、読み取り精度に変化があるようには見えなかったので今回は"n6x"のみを使用しました。

読み取りたいプログラムリストの画像ファイルをドラッグ&ドロップして、上部メニューの「すべて読み取り」をクリックすると読み取りが開始され、右側にテキストファイルが出力されます。

画像は同時に何枚でも読み込めて、スキャン結果は右側のテキストに追加されていきます。テキストは上部のアイコンメニューから保存できます。
保存時の文字コードはSJISになるようです。個人的にはUTF-8で保存したいのでテキストの上でマウス右クリックしてメニューを出し、全テキストをコピーしてWindowsのテキストエディタにペーストしてからUTF-8で保存しています。
後でDumpListEditorで修正するときにUTF-8またはSJISのカナ文字を1バイトコードのカナ文字に変換できるのですが、どちらのコードだったか迷わないように統一しておきたいからというだけの理由です。

読み取りの精度は画像の内容によって大きく変わります。上手くいくときはこんな風にほぼ完璧に読み取ってくれます。

                  ↓


ところが同じプログラムリストでも、場所によって全く読み取れないこともあります。

                  ↓

なんでこうなるのかわからず色々なリストを読み込んで試してみたのですが、傾向としてはリストに空白部分が多い場合、このような文字化けが発生するようです。

ProgramListOCRは読み取りたい部分を範囲指定できるので、なるべく空白がなくなるように囲んでみるとほぼ完璧に読み取ってくれます。極端な話、一行ごとに範囲指定して読み取ればかなり正確に読み取ることが可能です。ただ短いプログラムならいいのですが、長いプログラムではあまり現実的ではありませんね。

次にGoogleドライブのOCRでリストを読み込んでみます。

GoogleのOCRを使うときは、読み取りたい画像ファイルをGoogleドライブにドラッグ&ドロップでアップロードしてから、そのファイルを右クリックしてメニューの「アプリで開く」→「Googleドキュメント」を選択すると読み取り結果が表示されます。

読み取ったデータは、メニューから「編集」→「全て選択」と「編集」→「コピー」で、テキストをWindowsのテキストエディタにペーストして保存します。「ファイル」メニューからダウンロードすることもできますが面倒くさいですよね。

先ほどProgramListOCRで読み取った原稿を試してみるとこうなりました。

文字サイズはテキストのコピー&ペーストで関係無くなるので気にしないでください。文字に関して大部分は読み取ってくれています。ただ最初の画像ではレイアウトがおかしくなってしまいました。GoogleのOCRは縦方向に空白や同じ文字が並んでいると、そこを区切りとみなして次の行を読み取ってしまう傾向があるようです。
他にも色々なリストを読み取ってみましたが、カナ文字もProgramListOCRほど正確ではないもののある程度は読み取れます。ただし、""で囲まれた文字列やREM文などの読み取りは苦手なようです。

続いて比較のためWindowsに搭載されているOCRエンジンを試してみます。

前回配布したここからダウンロードできるファイルの中のBasicOcrReader.exeがWindowsのOCR用プログラムです。

起動すると右側に読み取りたいBASICの種類を選択する項目があるのに気付くと思います。これは読み取ったBASICプログラムの変数リストを作る際に予約語を取り除くためのものです。今は読み取りテストだけなので選択の必要はありません。詳しい使い方は後で説明します。

とりあえず上記で読み込んだリストをWindowsのOCRでも読み込んでみます。
右下の「OPEN」ボタンで画像ファイルを選択すると読み取ったテキストをテキストボックスに表示します。

最初のプログラムリストは全くだめですね。つぎのリストはちゃんと認識してくれています。なぜこうなるのかはわかりません。色々なリストを試してみましたが、誤変換が多くて正確に読み取れるプログラムリストはあまりありませんでした。

WindowsのOCRでは使用する言語パックによっても認識率は変わります。BasicOcrReader.exeではデフォルトで日本語の言語パックをつかっていますが、英語の言語パックをインストールすれば(インストールについてはネットで検索してください)英語モードで読み取りを行うことができます。

英語の言語パックを使って読み取ると次のようになりました。

一見きれいに見えますが、かなりの部分が欠落していて使い物にはなりそうもありません。

以上の結果から、WindowsOCRはBASICプログラムリストの読み取りには向いてなさそうです。文字の認識に関するライブラリも用意されていないので、今はこれ以上何もできません。

ProgramListOCRとGoogleOCRの方は、それぞれ一長一短があってどちらがBASICプログラムの読み取りに向いているかは決めかねます。使い勝手はProgramListOCRの方が圧倒的にいいのですが、大量のリストの読み取りとなるとGoogleのOCRの方が割といい精度で読み取ってくれるので利用価値はありそうです。

BASICプログラムの読み取りは、ProgramListOCRとGoogleOCRの双方を使ってみて結果の良い方を採用するか、GoogleのOCRでBASICリスト全体を読み取り、文字列やDATA文など修正が面倒な部分だけをProgramListOCRの範囲指定でこまめに区切って正確に読み取ってマージするといった使い方がよさそうです。

これらのOCRで読み取ったテキストデータですが、そのままではエラーになってBASICプログラムとしては使えないので修正する必要があります。修正を手助けするプログラムが配布したDumpFormater.exeです。

使い方ですが、今回も長くなってしまったのでまた次回に説明します。

 

最新の画像もっと見る

コメントを投稿