画像から文字列を読み取る、OCRの処理をアプリに実装させたいというニーズは、よくあるでしょうが、割と手っ取り早いのはGoogleのCloud Vision APIを使うやり方かな、と思います。
PHPでの例を紹介します。
Cloud Vision APIとは? 使うには? 注意事項は?
こちらに大変よくまとめてくださっているので、ご覧ください。
Cloud Vision APIをPHPから使ってみた。その① | TECH Projin
https://tech.pjin.jp/blog/2017/07/31/cloud-vision-api-from-php-1/
PHPでcURLを使えるようにする
環境によって様々のようなので、ここでは詳細は割愛。
Ubuntu 16.04の場合、
$ sudo apt-get update
$ sudo apt-get install php-curl
のみでOKでした。
PHPでの実装
こちらから大部分を借用させていただきました。
コピペで動くGoogle Cloud Vision API!!サンプルコード有! | ただの備忘録ブログですよ
http://bibouroku.blog/2018/01/04/api_google_cloud_vision_api/
<?PHP
// APIキー
$api_key = "あなたのAPIキーを入力ください。" ;
//画像のPATHを入力してください(URLでいいですよ)
$image_path = "画像のURL";
// リクエスト用のJSONを作成
$json = json_encode( array(
"requests" => array(
array(
"image" => array(
"content" => base64_encode( file_get_contents( $image_path ) ) ,
) ,
"features" => array(
array(
"type" => "TEXT_DETECTION" ,
"maxResults" => 10 ,
) ,
) ,
) ,
) ,
) ) ;
// リクエストを実行
$curl = curl_init() ;
curl_setopt( $curl, CURLOPT_URL, "https://vision.googleapis.com/v1/images:annotate?key=" . $api_key ) ;
curl_setopt( $curl, CURLOPT_HEADER, true ) ;
curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, "POST" ) ;
curl_setopt( $curl, CURLOPT_HTTPHEADER, array( "Content-Type: application/json" ) ) ;
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false ) ;
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ) ;
if( isset($referer) && !empty($referer) ) curl_setopt( $curl, CURLOPT_REFERER, $referer ) ;
curl_setopt( $curl, CURLOPT_TIMEOUT, 15 ) ;
curl_setopt( $curl, CURLOPT_POSTFIELDS, $json ) ;
$res1 = curl_exec( $curl ) ;
$res2 = curl_getinfo( $curl ) ;
curl_close( $curl ) ;
// 取得したデータ
$json = substr( $res1, $res2["header_size"] ) ;
$array_json=json_decode($json, true);
$text=$array_json["responses"]["0"]["textAnnotations"]["0"]["description"];
echo $text;
?>
実行
php -f ocr.php
さすがはGoogle、という精度。
注意点
生のAPIキーを記述したソースコードを、リモートリポジトリに直接pushしないように!
特にGitHubの公開リポジトリに上げてしまったりしようものなら、途端にAPIキーを不正利用される危険があります。
例えばPythonの場合、dotenv等を使って、APIキーを環境変数に持たせて、実際にAPIを叩くコードでは、環境変数からAPIキーの値を取得するようにするやり方があります。
PHPは不勉強にして事情を存じ上げないのですが、たぶん同じようなことができると思います。
他のやり方
Googleに限らず、APIを利用する場合は課金が発生したり、仕様が変わったり、サービスが終了したりする可能性があります。
(Clould Vision APIの利用料金は、2018年12月現在、月あたり1,000ユニットまでであれば無料のようですが)
他のやり方としては、Tesseract OCRというオープンソースのOCRライブラリがあるそうですが、未確認です。