API】ウェブカメラで名刺を読みとって会員データ入力という記事を公開しています。APIを使って画像から文字を取得するという内容なのですが、実はこのサービスは有料になっています。(ただし、実行回数が少なければ無料でいけますし、基本的に料金は安いです)正直なところ、精度を問われると間違いなくこういったクラウドのサービスを使うべきだと思いますが、もしかすると「精度は落ちてもいいので無料でやりたい」という需要があるのかなとも思いましたので、今回PHPを使って画像からテキストを読み取る(OCR)を無料でできる方法を紹介することにしました。いうのも、これも以前公開したネットカフェ向けにコミックをどこまで読んだか記録するLINEボットをつくったという記事でつくったBotは、基本的にバーコードを読み取って漫画情報を取得しているのですが、どうやら講談社はコミック本体にバーコードをつけていないので、どうしたもんかと考えていたからです。(←おそらく「せどり」なんでしょうね)そこで!今回はPHPを使って画像から文字を読み取る方法(無料バージョン)をお届けしたいと思います。OCRというパッケージになります。(Apacheライセンスで使えます)そのため、まずはこのパッケージをインストールしておきましょう。CentOSなど他のOSの場合はそれぞれのパターンでこちらにインストール方法がまとめられています。インストールが完了したら以下のコマンドを実行してみてください。-v実行して次のような表示が出たらインストールはうまくいっています。OCRはコマンドラインで実行するものですので、PHPから使うためには次のようにexec()を使います。$ocr_texts);$ocr_textsの中に配列で取得されたテキストが入ってくることになりますので、foreach()などでひとつずつ中身を取得するといいでしょう。上の例では実際は以下のコマンドを実行することになります。指定するパスは、絶対パスでないといけない」という部分です。OCRについても同じです。以下のように通常のコマンドラインの感覚で実行してもうまくいきません。OCRの場所がわからないようでしたら、以下のコマンドを実行してください。絶対パスを返してくれます。PHPを使って画像からISBNを取得する例をご紹介します。}}print_r(array_unique($isbn_codes));この例ではうまく画像からISBNが取得されると$isbn_codesの中にその全てが配列で格納されることになります。LINEの漫画チャットボットにもこれをベースとした同様の機能をつけてみましたので良かったら以下から試してみてください。18にインストールしたわけですが、初期状態では日本語には対応していません。そのため、ここでは日本語対応させる手順を紹介します。以下2つのURL先にあるDownloadというボタンをクリックしてそれぞれファイルをダウンロードします。OCRは、GitHubにWikiページがあって、こちらのページから言語データを取得できるようにしてくれているのですが、これは古いバージョン用のパラメータが残ってしまっているようでうまくいきません。ダウンロードしたら、その2つのファイルを以下のフォルダに移動させます。/usr/share/tesseract-ocr/4.00/tessdataこれで日本語対応は完了です。以下のコマンドで確認しておきましょう。--list-langsうまいいっていれば、このような表示になります。OCRの実装方法を紹介してきましたが、「じゃあ、どのくらいの精度があるのか」という探究心が湧いてきたので実際の画像と一緒に抽出結果を紹介していきます。日本語のものは-lの言語オプションをjpnにして実行していますが、それ以外はengです。アルファベットだけ【実行結果】ABCDEFGHIJKLMNOPQRSTUVWXYZさすがにこれは完璧でした!数字だけ【実行結果】1234567890こちらも完璧です。アルファベットの文章フォントサイズは25で、フォントタイプはsansす。today!ビックリマークまで読み取っています。英語のように文字の総数が少ない言語はOCRには有利ですね。文字を小さくしてみたフォントサイズは18です。today!完璧です😊もっともっと文字を小さくしてみたフォントサイズは8です。hになってしまいました。この大きさで大したもんです。斜体にしてみた先ほどの実験である程度小さい文字でも大丈夫なことがわかったのでフォントサイズは15でやっています。today!完璧です。today!文字的には完璧ですが、スペースがひとつ抜けてしまいました。ちなみにフォントサイズを20にすると完璧に読み取ってくれました。ここからは、実行する言語パラメータ-lをjpnに変えて実行しています。日本語化はOCRを日本語対応させるをご覧ください。ん元画像にスペースは入れていませんが、「い」と「う」の間のようにスペースできてしまう場合があります。文字としては完璧に読み取っています。!漢字も完璧に読み取るとは思いませんでした!スペースは相変わらず入ってきますが、str_replace()などを使えば簡単に除去できますし、それほど問題ではないと思います。