質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

580閲覧

PHPでVisionAPIを使用してOCRを行う。

ratezou

総合スコア62

Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/01/25 03:55

サイト作成の勉強中です。

一通りHTMLやCSS、IS、PHPを勉強したので業務でレシートをExcelに転記しているのでスマホで撮影したレシートを読み込み、DBに保存するプログラムを作成しようと思いました。
PHPでVisionAPIを使用したサンブルだとうまく読み込めず・・・レシート左の品名と単価が別れて表示されます。
そこでいろいろ検索したところ、以下の記事に辿り着きました。
https://qiita.com/shoku-pan/items/bf5645894803769edc72
これをPHPに書き換えたら、うまく行として読み込めると思った次第です。

作ったPHPは以下のとおりです

PHP

1<?PHP 2// APIキー 3$api_key = "私のAPIキー" ; 4 5// リクエスト用のJSONを作成 6$json = json_encode( array( 7 "requests" => array( 8 array( 9 "image" => array( 10 "content" => str_replace("data:image/png;base64,", "", $_POST['image']), 11 ) , 12 "features" => array( 13 array( 14 "type" => "TEXT_DETECTION", 15 "maxResults" => 10, 16 ) , 17 ) , 18 "imageContext" => array( 19 "languageHints" => array("ja"), 20 ), 21 ) , 22 ) , 23) ) ; 24 25// リクエストを実行 26$curl = curl_init(); 27curl_setopt($curl, CURLOPT_URL, "https://vision.googleapis.com/v1/images:annotate?key=" . $api_key); 28curl_setopt($curl, CURLOPT_HEADER, true); 29curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); 30curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/json")); 31curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 32curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 33if(isset($referer) && !empty($referer)) curl_setopt($curl, CURLOPT_REFERER, $referer) ; 34curl_setopt($curl, CURLOPT_TIMEOUT, 15); 35curl_setopt($curl, CURLOPT_POSTFIELDS, $json); 36$res1 = curl_exec($curl); 37$res2 = curl_getinfo($curl); 38curl_close($curl); 39 40// 取得したデータ 41$json = substr($res1, $res2["header_size"]); 42$array_json=json_decode($json, true); 43 44$document = $array_json["responses"]["0"]["fullTextAnnotation"]; 45$bounds = array(); 46foreach ($document["pages"] as $pages){ 47 foreach ($pages["blocks"] as $block) { 48 foreach ($block["paragraphs"] as $paragraph) { 49 foreach ($paragraph["words"] as $words) { 50 foreach ($words["symbols"] as $symbol) { 51 $x = $symbol["boundingBox"]["vertices"]["0"]["x"]; 52 $y = $symbol["boundingBox"]["vertices"]["0"]["y"]; 53 $text = $symbol["text"]; 54 array_push($bounds, array("x" => $x, "y" => $y, "text" => $text)); 55 } 56 } 57 } 58 } 59} 60$ys = array_column($bounds, "y"); 61array_multisort($ys, SORT_ASC, $bounds); 62$old_y = -1; 63$line = array(); 64$lines = array(); 65$threshold = 1; 66foreach($bounds as $bound) { 67 $x = $bound["x"]; 68 $y = $bound["y"]; 69 if ($old_y == -1) { 70 $old_y = $y; 71 } 72 elseif ((($old_y - $threshold) <= $y) && ($y <= ($old_y + $threshold))) { 73 $old_y = $y; 74 } 75 else { 76 $old_y = -1; 77 $xs = array_column($line, "x"); 78 array_multisort($xs, SORT_ASC, $line); 79 array_push($lines, $line); 80 $line = array(); 81 } 82 array_push($line, $bound); 83} 84$xs = array_column($line, "x"); 85array_multisort($xs, SORT_ASC, $line); 86array_push($lines, $line); 87 88foreach($lines as $line) { 89 $texts = ""; 90 foreach($line as $i) { 91 $texts = $texts . $i["text"]; 92 } 93 print_r($texts . "<br />"); 94}

この以下の画像を読み込むと、
イメージ説明
※ネットで拾ったものです。

このようにOCRされます。

いば
すと
けっ
TEL
045野庭町店
-840101063
-62FAX045840-
領収証-
営業時間:あさ9時~よる11時
年中無休
レジ01042019/6/28(金)17:05
EX7345:002153742
どん兵衛釜たま風うどん276
<2個X単138)
カルピスカルピスウォー184
<2個X単92)
雪メグなめらかプリン98
とろりクリームプリン128
糖質みかんゼリー98
メイトーなめらかプリン88
QTTA明太チーズ味128
(ボーナスポイント30P)
小計¥1,000
外税8%対象額
¥1,000
外税8%
¥80
合計
¥1,080
現金
¥1,100
ID:0164
お釣り
¥20

少しでもズレがあると違う行になっているように見えます。
私としては、パイソンの

python

1elif old_y-threshold <= y <= old_y+threshold:

PHP

1elseif ((($old_y - $threshold) <= $y) && ($y <= ($old_y + $threshold))) {

ここが違うのかなぁと思うのですが、わかる方いらっしゃいますでしょうか?
アドバイスのほどよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuma.inaura

2023/01/25 04:30

参考サイトと全く同じ画像で試すとどうなりますか?
ratezou

2023/01/25 04:34

結構きれいに読み込めてますね。 7セブン-イレブン 千代田店 東京都千代田区二番町8-8 電話:03-1234-5678レジ#1 2019年10月01日(火)08:45責012 領収書 手巻おにぎり辛子明太子*130 コカコーラ500ml*140 パラドゥミニネイルPK03300 メビウスワン490 50円切手50非 小計(税抜8%)¥270 消費税等(8%)¥21 小計(税抜10%)¥300 消費税等(10%)¥30 小計(税込10%)¥490 小計(非課税)¥50 合計¥1,161 (税率8%対象¥291) (税率10%対象¥820) (内消費税等8%¥21) (内消費税等10%¥74) キャッシュレス還元額-22 nanaco支払¥1,139 お買上明細は上記のとおりです。 nanaco番号************6666 今回ポイント 2P [*]マークは軽減税率対象です。
ratezou

2023/01/25 04:36

レシートはどうしてもまるまるので、カメラで撮るのは難しいかもですね。 かといってスキャナを使うのも手間ですし・・・ 良案ありませんかねぇ・・・
ratezou

2023/01/25 05:50 編集

このサイトレベルだと使えますが、傾きとかも考慮しているのでしょうか? http://asprise.com/receipt-ocr-data-capture-api/extract-text-reader-scanner-index.html ちなみに、まいばすけっとのレシートは、ここではスペースがうまく表現)できませんが、(上記サイト上ではきれいにスペースも表現できています まいばすけっと TEL045-840-1062 FAX045-840-1063 野 庭 町 店 領 収 証 営業 時間: あさ 9 時 ~ よる 11 時 年 中 無休 レジ 0104 2019/6/28 (金) 17:05 取 7345 : 002153742 どん 兵衛 釜 たま 風 うどん 276 < 2 個 X 単 138) カルピス カルピス ウォー 184 < 2 個 X 単 92) 雪 メグ なめらか プリン 98 とろり クリーム プリン 128 糖質 みかん ゼリー 98 メイトー なめらか プリン 88 QTTA 明太 チーズ 味 128 (ボーナス ポイント 30 P) 小 計 ¥ 1,000 外 税 8%対象 額 1,000 外 税 8% 80 合計 ¥ 1,080 現金 1,100 ID: 0164 お 釣り ¥ 20 こんな感じです。
guest

回答1

0

自己解決

読み込むレシートは決まっているので、一文字づつ読み込むのではなくて、一気読みしたテキストを改行ごとに読み込み、ハードコードできるか判断しようと思います。

PHP

1text = $array_json["responses"]["0"]["textAnnotations"]["0"]["description"]; 2$arr = explode("\n", $text); 3foreach($arr as $line) { 4 echo $line . "<br />"; 5}

投稿2023/01/25 05:47

ratezou

総合スコア62

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問