PHP
GoogleCloudPlatform
OCR
PHP7
VisionAPI

PHPでOCR(Google Cloud Vision APIを使って)

画像から文字列を読み取る、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/


ocr.php

<?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ライブラリがあるそうですが、未確認です。