スマホとPythonでQRコード画像を読み取る
今回はスマホとPythonを使って保存されたQRコード画像の読み取り実験。
リアルタイムで画像検知して読み取る賢い機能は無し!
結果
- Pydroid3
- termuxとPython3.7
の2つの実行環境を使って、保存してあるQRコード画像を読み取らせようとしました。
結果的に、
Pydroid3では失敗したが、
termuxとPython3.7では成功した。
スマホでQRコード画像を生成するのは超簡単でしたが、読み取りは難しい…。
ということを踏まえて、はじめにつづく。
目次
はじめに
通常、QRコード読み取りアプリでは、QRコードにカメラを向けると
- 画面上に枠が表示され、
- QRコード画像を検知し、
- 検知した部分から文字情報を読む
といった手順が行われますよね。
被写体から特定の物を検知するには、以前に
画像から顔検知
画像から目の検知
画像から顔検知してモザイクを掛ける
で使ったOpenCV
のようなモジュールが要るかと思います。
検索しても、OpenCV
を使ってされているものが多く見つかる。
今回はOpenCV
を使わず、保存されたQRコードの画像を読み取るシンプルな作業のみをやります。
(OpenCVをスマホで動かすのが難しそうなので!)
作業環境
Androidスマホ
・Pydroid3(python3.7)
・termux、python3.7
必要なもの
2つ同時にインストール
pip install pillow pyzbar
・Pydroid3の場合
「Pip」→「SEARCH LIBRARIES」→各々のモジュールを検索→「INSTALL」
または
「Terminal」→pip install pillow pyzbar
・termuxでPython3.7を動かす場合
pip install pillow pyzbar
・Qpythonの場合
pillow
がインストール出来ないので実験不可。
代わりに「起動画面」→「スキャン」でQRコード読み取り機能を使う…
まずはQRコード画像を生成する
復習を兼ねて、カレントディレクトリにQRコードの画像を生成します。
参照
前回投稿 QRコード画像生成
import qrcode text = "http://nagasaki-kunchi.com/dashimono/" img = qrcode.make(text) # カレントディレクトリに保存 img.save("QRCode_NgKunchi.png")
実行すると、カレントディレクトリにQRCode_NgKunchi.png
というQRコードの画像が生成されます。
QRコード画像の読み取り
ここからが本来の目的。上で作ったQRコード画像を読み取ります。
調べた限り、Windows10では前述通り、pillow
とpyzbar
のモジュールをインストールすれば、次のコードだけで難なく動くようです。(現時点で未確認)
Pydroid3で実行
from pyzbar.pyzbar import decode from PIL import Image # 画像ファイルの指定 img = "QRCode_NgKunchi.png" # QRコードの読み取り data = decode(Image.open(img)) # コード内容を出力 print(data[0][0].decode('utf-8', 'ignore'))
------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-3-c90755833915> in <module>
----> 1 from pyzbar.pyzbar import decode
2 from PIL import Image
3
4 # 画像ファイルの指定
5 img = "QRCode_NgKunchi.png"
/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.7/site-packages/pyzbar/pyzbar.py in <module>
5 from .locations import bounding_box, convex_hull, Point, Rect
6 from .pyzbar_error import PyZbarError
----> 7 from .wrapper import (
8 zbar_image_scanner_set_config,
9 zbar_image_scanner_create, zbar_image_scanner_destroy,
/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.7/site-packages/pyzbar/wrapper.py in <module>
141 c_int,
142 c_uint_p, # major,
--> 143 c_uint_p, # minor
144 )
145
/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.7/site-packages/pyzbar/wrapper.py in zbar_function(fname, restype, *args)
134 """
135 prototype = CFUNCTYPE(restype, *args)
--> 136 return prototype((fname, load_libzbar()))
137
138
/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.7/site-packages/pyzbar/wrapper.py in load_libzbar()
113 global EXTERNAL_DEPENDENCIES
114 if not LIBZBAR:
--> 115 libzbar, dependencies = zbar_library.load()
116 LIBZBAR = libzbar
117 EXTERNAL_DEPENDENCIES = [LIBZBAR] + dependencies
/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.7/site-packages/pyzbar/zbar_library.py in load()
63 path = find_library('zbar')
64 if not path:
---> 65 raise ImportError('Unable to find zbar shared library')
66 libzbar = cdll.LoadLibrary(path)
67 dependencies = []
ImportError: Unable to find zbar shared library
↑ Pydroid3のJupiterNotebookによる実行結果。エラーが出ました。
ImportErrorでzbar
ライブラリーが見つからないとか言っている。
「zbar
はPython2系のモジュールで不必要云々」みたいな解説が色んなページで書いてあるけど?
pydroid3で「Pip」からzbar
をインストールしようとするもError。
「Terminal」からやっても同じ。
aptやらapt-getやらpkgやら何をやっても全てnot found
。
その他、QRコード読み取りの解説ページに載っているモジュールを色々試したが、インストール出来ないか、使い方がわからない。
Pydroid3は諦めた。
termuxとPython3.7なら行けるか?
termuxで
pip install pillow pyzbar
インストール成功。
上のPythonスクリプトをvimでQRcode_reader.py
なるファイルにして実行。
python QRcode_reader.py
こちらも上記と同じくImportErrorが出て、zbarが見つからんらしい。
今度はtermuxでapt install
apt install zbar
aptはpipの間違いではありません!ご注意を。
インストール成功。
再びPythonコードを実行。
python QRcode_reader.py
$ python QRcode_reader.py http://nagasaki-kunchi.com/dashimono/
上手く行った!
成功した割には地味な出力…
おわりに
後日PCのWindowsで実行確認します。
それと、他の方法や、スマホでOpenCVが動かせるかどうか調べます。
どうもありがとうございました。