pythonでQRコード画像生成・読み取り(PyQRCode・pyzbar)


 

目次

1. QRコードの概要
2. PyQRCode
3. 実験のコード
_3.1 環境準備
_3.2 QRコードの生成(Encode)
_3.3 QRコード画像の読み取り(Decode)
_3.5 QRコード動画の読み取り(Decode)

 

1. QRコードの概要

どこにでもあるQRコードはpythonでどう生成しますか?この記事はこの質問に回答します。

QRコードの生成と読み取るPythonは複数のパッケージがあります。今回はPyQRCode・pyzbarを解説します。

 

2. PyQRCode

PyQRCodeのパッケージはQRコード作成、エラー修正、QRコードのバージョン、Encodeのモードなどを設定することができます。

pyqrcode.create(content, error=’H’, version=None, mode=None, encoding=None)

content(コンテンツ):

QRコード

error(エラー):

・‘L’ コードの7%を修正できる。

・‘M’ コードの15%を修正できる「M」。

・‘Q’一般)コードの25%を訂正できます。

・‘H’ コードの30%を修正できる。

version(バージョン):

・バージョンは1から40まで設定ができます。バージョン1が最小のQRコードで、バージョン40が最大です。

mode(モード):

・整数をエンコードするために使用される「数値」。

・一部のASCII文字をエンコードするために使用される「英数字」。

・「漢字」モードは日本語の文字に使用できますが、shift-jis文字列エンコードで理解できる文字のみです。

・バイトをQRコードに直接エンコードする「バイナリ」モード

 

3. 実験のコード

環境:Google Colab

Pythonパッケージ:PyQRCode, pypng, pybar

コード:QRコード Encode Decode

3.1 環境準備

下記のライブラリをインポートします。

!pip install PyQRCode

!pip install pypng

!sudo apt-get install libzbar0

!pip install pyzbar

 

3.2 QRコード生成(Encode)

QRコードのsvg画像とeps画像を作成します。

# import pyqrcode

url = pyqrcode.create(‘https://data-analysis-stats.jp/’)

url.svg(‘qrcode_svg.svg’, scale=8)

url.eps(‘qrcode_eps.eps’, scale=2)

QRコードのsvg画像を確認します。

# Show image svg

from IPython.display import Image, display_svg

svg = open(‘qrcode_svg.svg’, ‘r’).read()

display_svg(svg, raw=True)

QRコードのpng画像を作成します。

import pyqrcode

big_code = pyqrcode.create(‘https://data-analysis-stats.jp/’, error=’L’, version=3, mode=’binary’)

big_code.png(‘code.png’, scale=9, module_color=[0, 0, 0, 128], background=[255, 255, 255])

QRコードのpng画像を確認します。

# Show image

from IPython.display import Image

img_file = “code.png”

Image(img_file)

3.3 QRコード読み取り(Decode)

pyzbarでQRコード読み取ります。

from pyzbar.pyzbar import decode

from PIL import Image

d = decode(Image.open(‘code.png’))

print(d[0].data.decode(“utf-8”))

https://data-analysis-stats.jp/

 

3.5 QRコード動画の読み取り(Decode)

携帯で撮ったQRコード動画を読み取ります。

 

# Play Video

from IPython.display import HTML

from base64 import b64encode

video_path = ‘qrcode.mp4′

mp4 = open(video_path,’rb’).read()

decoded_vid = “data:video/mp4;base64,” + b64encode(mp4).decode()

HTML(f'<video width=400 controls><source src={decoded_vid} type=”video/mp4″></video>’)

3秒の動画から、0.5秒ことQRコード読み取ります。動画の一部分では読み取れていない事がわかります。

import cv2

video_path = ‘qrcode.mp4’

vidcap = cv2.VideoCapture(video_path)

def getFrame(sec):

vidcap.set(cv2.CAP_PROP_POS_MSEC,sec*1000)

hasFrames,image = vidcap.read()

if hasFrames:

cv2.imwrite(“img”+str(count)+”.jpg”, image)     # save frame as JPG file

return hasFrames

sec = 0

i = 1

end_sec = 3

frameRate = 0.5 #//it will capture image in each 0.5 second

count=1

success = getFrame(sec)

while True:

count = count + 1

sec = sec + frameRate

sec = round(sec, 2)

success = getFrame(sec)

i +=1

if i == (end_sec / frameRate):

break

images = [‘img1.jpg’, ‘img2.jpg’, ‘img3.jpg’, ‘img4.jpg’, ‘img5.jpg’, ‘img6.jpg’]

for image in images:

d = decode(Image.open(image))

try:

print(d[0].data.decode(“utf-8”))

except:

print(‘Cannot detect’)

Cannot detect

Cannot detect

Cannot detect

Cannot detect

Cannot detect

https://data-analysis-stats.jp/

 

担当者:KW
バンコクのタイ出身 データサイエンティスト
製造、マーケティング、財務、AI研究などの様々な業界にPSI生産管理、在庫予測・最適化分析、顧客ロイヤルティ分析、センチメント分析、SaaS、PaaS、IaaS、AI at the Edge の環境構築などのスペシャリスト