投稿者leck_3328TweetPocketこんにちは、leckです。初のブログ投稿になります。今日は、自分が買った食材をレシートから読み取り、その食材でCookPad上に検索をかけるプログラムを大学の授業の演習で作ったので少し紹介します。レポートからそのまま流用しているので文章が若干堅くなっているのは許してください。動機、やりたかったこと私は一人暮らしして約半年近く経ちますが、なかなか料理をする機会が増えない。やろうと思ってもレシピを思い浮かばずに終わってしまう。そもそもお店で食材を買いながらどんな料理を作ろうか考えるのか、苦手だったのです。ないかと思いつきました。そこで、以下のことを実装しようと考えました。文字データから食材のワードだけを選び出すCookPad上で検索をかける、ヒットしたレシピを表示させる実装方法、利用したライブラリと工夫点レシートを切り出すまずは画像を読み込み、レシートの部分だけを切り取るプログラムを書く必要がありました。これにはOpenCVを使って画像を読み取り、2値化処理を行ってからエッジ抽出を行いました。実際、この方法でレシートを切り出すのは難しい、というより自分で好ましい画像を用意できなかったためこの部分の実装はほとんど役に立ちませんでした。ここの実装は以下のサイトのコードから引っ張ってきました。ちなみに今回デモ用に使っているレシートの画像はここのサイトから使わせてもらっています。レシートの画像を矩形補正してOCRにかけてみた。暇な女子高専生のブログ携帯の水没とパソコンのWebカメラをうまく認識できなかったため自前で用意できなかった影響が大きかったです。4点を指定してトリミングする。yが小さいもの順に並び替え。前半二つは四角形の上。xで並び替えると左右も分かる。後半二つは四角形の下。分離した二つを再結合。変換前の座標と変換後の座標の対応を渡すと、透視変換行列を作ってくれる。透視変換行列を使って切り抜く。matplotlibで正常に画像が表示できるための関数。2値化させた画像を表示させる。レシートと思われる輪郭の面積を算出。レシートの輪郭を認識できないことがあるため、元の画像に対してある一定以上の大きさでないとトリミングをしないようにした。Webカメラで読み込むこともやりたかったがUbuntuがうまく認識してくれず、断念。文字認識についてはGoogleのAPIを利用させてもらった。以下のコメントを外せばtesseractでの実行もできる。google_api_ocr.detect_text(rect_th_filename)このプログラムをreceipt_read.pyの名前で保存します。レシートの文字を読み込むここの部分はGoogleのAPIを大いに頼らせていただきました。いうものがあるのですが、Googleの提供するOCRのAPIのほうが段違いに精度良く読み取れたのでこちらを採用。tessearactのインストールは以下のページを参考に行いました。Qiita余裕があればこのあたりも学習して読み取るようにできたらいいと思っています。以下のサイトのコードを流用しました。名前で保存しておきます。食材一覧のテキストデータを用意する文部科学省のサイトから食材と栄養素一覧のエクセルデータを入手しました。ページにある一括ダウンロードにあるファイル(リンクをクリックすればダウンロードできます)をsyokuzai.xlsxの名前で先ほどまでのプログラムと同じディレクトリにおきます。これをPandasを使って食材データだけを抜き出しました。それからレシートの印字にはカタカナだけのものも混ざっているので食材の名前をひらがなに変換したものとカタカナに変換したもの両方を入れました。このひらがなとカタカナの変換にはjavacというものを使いました。インストールできます。jaconvコマンドも簡単だったし、すごい便利です。以下のコマンドをPython3ののインタラクティブシェルで実行すると食材のリストであるfood_list.txtが出力されるようになっているはずです。料理の写真の4つの情報を抜き出します。requestsもlxmlもPythonのpipでインストールできます。以下のファイルをreceipt_tabelog.pyの名前で保存します。CookPadなのにtabelogの名前で保存してしまいましたが、そこは気にしません。レシートデータから文字データを抽出する。作っておいたfood_list.txtを呼び出す。3つの検索ワードで検索する場合、このようなURLになる。以下のようになります。無事、レシピを表示させることができました。今後の課題メインでMacOSを使っているので、まずはそこで動くように環境を整えたい。やることは多いが、まずはカメラからレシートを読み込めるようにして、色々な画像を作っていく。文字データを抽出したい。ubuntu著者プロフィール。