よちよちpython

独習 python/Qpython/Pydroid3/termux

スマホとPythonでQRコード画像を読み取る

今回はスマホPythonを使って保存されたQRコード画像の読み取り実験。

リアルタイムで画像検知して読み取る賢い機能は無し!



結果


結果から先に書きます。

Androidスマホで、

  • Pydroid3
  • termuxとPython3.7

の2つの実行環境を使って、保存してあるQRコード画像を読み取らせようとしました。

結果的に、
Pydroid3では失敗したが、
termuxとPython3.7では成功した。


スマホQRコード画像を生成するのは超簡単でしたが、読み取りは難しい…

ということを踏まえて、はじめにつづく。


目次




はじめに


通常、QRコード読み取りアプリでは、QRコードにカメラを向けると

  1. 画面上に枠が表示され、
  2. QRコード画像を検知し、
  3. 検知した部分から文字情報を読む


といった手順が行われますよね。

被写体から特定の物を検知するには、以前に
画像から顔検知
画像から目の検知
画像から顔検知してモザイクを掛ける

で使ったOpenCVのようなモジュールが要るかと思います。

検索しても、OpenCVを使ってされているものが多く見つかる。

今回はOpenCVを使わず、保存されたQRコードの画像を読み取るシンプルな作業のみをやります。
(OpenCVスマホで動かすのが難しそうなので!)



作業環境


Androidスマホ
・Pydroid3(python3.7)
・termux、python3.7



必要なもの


  • 読み取るQRコード画像ファイル
  • バーコードとQRコードの読み取りモジュールpyzbar
  • 画像処理モジュールpillow

2つ同時にインストール

pip install pillow pyzbar


Androidスマホで行うなら】

・Pydroid3の場合
「Pip」→「SEARCH LIBRARIES」→各々のモジュールを検索→「INSTALL」

または

「Terminal」→pip install pillow pyzbar

・termuxでPython3.7を動かす場合
pip install pillow pyzbar

・Qpythonの場合
pillowがインストール出来ないので実験不可
代わりに「起動画面」→「スキャン」でQRコード読み取り機能を使う…



まずはQRコード画像を生成する


復習を兼ねて、カレントディレクトリにQRコードの画像を生成します。

参照
前回投稿 QRコード画像生成

長崎くんち」のサイトURLを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では前述通り、pillowpyzbarのモジュールをインストールすれば、次のコードだけで難なく動くようです。(現時点で未確認)

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による実行結果。エラーが出ました。
ImportErrorzbarライブラリーが見つからないとか言っている。



zbarはPython2系のモジュールで不必要云々」みたいな解説が色んなページで書いてあるけど?



pydroid3で「Pip」からzbarをインストールしようとするもError。
「Terminal」からやっても同じ。
aptやらapt-getやらpkgやら何をやっても全てnot found
その他、QRコード読み取りの解説ページに載っているモジュールを色々試したが、インストール出来ないか、使い方がわからない。

Pydroid3は諦めた。



termuxとPython3.7なら行けるか?


termuxで

pip install pillow pyzbar

インストール成功。
上のPythonスクリプトvimQRcode_reader.pyなるファイルにして実行。

python QRcode_reader.py

こちらも上記と同じくImportErrorが出て、zbarが見つからんらしい。

今度はtermuxでapt install

apt install zbar


aptpip間違いではありません!ご注意を。

インストール成功。

再びPythonコードを実行。

python QRcode_reader.py


$ python QRcode_reader.py
http://nagasaki-kunchi.com/dashimono/

上手く行った!



成功した割には地味な出力…



おわりに


後日PCのWindowsで実行確認します。
それと、他の方法や、スマホOpenCVが動かせるかどうか調べます。

どうもありがとうございました。