プログラミング > Python >

QRコードの作成と読み込み

2023-05-07

目次

   ここではpythonのライブラリを使ってQRコードの生成と検出をする。

qrcode (作成)

   qrcodeというライブラリの使い方について。インストールしたあと、コマンドライン上で文字列を与えたらそれをQRコードの画像として出力されるので使い勝手が良い。画像を生成するためにpillowが必要。生成された画像を読み込むと文字列が読み込まれる。実際にこのサイトのURL文字列を生成して読み込んでみた。読み込んだリンクを選択すればブラウザが開いてサイトに行き着く。
                    
pip install qrcode
pip install pillow
qr 'https://shitori3no.jp/' > qrcode.png
                
図1. 生成したQRコード (左) と読み込んでいる様子 (右)。
   より詳細にQRコードをカスタムするには以下のようにする。QRコードのピクセル数の設定はversionを用いて1から40の値を設定する。QRコードの一部が欠けても機能するように誤り訂正を設定するにはerror_correctionを用いる。L、M、H、Qがあり順に誤り訂正による復元能力が大きくなる。出力される画像サイズの設定はbox_sizeを使う。1で縦と横が37ピクセルの画像となり、それが基本となっていて2と設定すれば縦と横が2倍の74ピクセルの画像となる。borderはクワイエットゾーンと呼ばれるQRコードにとって必要な余白で、基本は4ピクセルとなっている。
                    
import qrcode

qr_code = qrcode.QRCode(version=3, error_correction=qrcode.ERROR_CORRECT_M, box_size=10, border=4) qr_code.add_data(data='qr code text data') qr_code.make_image().save('qrcode.png')
   また背景とドットの色が白黒以外を指定したり、ドットの間隔や形を変えたり、QRコードの中央に画像を置くことができる。詳細はここに。
                    
import qrcode
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.colormasks import HorizontalGradiantColorMask
from qrcode.image.styles.moduledrawers import RoundedModuleDrawer

qr_code = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H, version=5) qr_code.add_data(data='123abcあいうαβγ') color_mask = HorizontalGradiantColorMask(back_color=(255, 255, 255), left_color=(255, 255, 0), right_color=(0, 0, 255)) module_drawer = RoundedModuleDrawer(radius_ratio=1)
qr_code.make_image(image_factory=StyledPilImage, color_mask=color_mask, module_drawer=module_drawer, embeded_image_path='./qr.png').save('qrcode.png')
図2. 背景色は白、ドットは黄色から青へグラデーションされて形が丸になり、中央に「QR」という画像を置いた。

pyqrcode (作成)

   pyqrcodeの使い方について。画像を生成するときはpypngが使われている。画像のサイズ (1で縦横37px)はscale 、ドットの色はmodule_color、背景色はbackground、誤り訂正の設定はerror、QRコードのピクセル数の設定はversionのようだ。注意点としては日本語がShift JISにしか対応していないので半角英数字と混同できない。
                    
pip install pyqrcode
pip install pypng
                
                    
import pyqrcode

qr_code = pyqrcode.create(content='QRコードのtext3', error='M', version=3) qr_code.png('./qr_code.png', scale=5, module_color=(122, 166, 255, 255), background=(255, 211, 122))

OpenCV (作成)

   OpenCVによるQRコードの作成について。バージョンや誤り訂正については一度cv2.QRCodeEncoder_Params()を呼び出す。その後にピクセル数は.versionで、モードは.modeで、誤り訂正は.correction_levelで設定する。そのあと画像に変換する。モードについてはcv2.QRCodeEncoder_MODE_AUTOと自動で決めるようにしておくのが無難で、間違ったものを選ぶと表示されなくなったり、読み込むと文字化けしたりする。
                    
pip install opencv-python
                
                    
import cv2

qr_code = cv2.QRCodeEncoder()
# パラメーターの設定 parameters = cv2.QRCodeEncoder_Params() parameters.version = 3 parameters.mode = cv2.QRCodeEncoder_MODE_AUTO parameters.correction_level = cv2.QRCodeEncoder_CORRECT_LEVEL_H qr_code = qr_code.create(parameters=parameters)
# numpy.ndarrayへ変換しcv2で書き出し text = 'a1aA1' qr_code = qr_code.encode(encoded_info=text) cv2.imwrite('./qrcode.png', qr_code)
   OpenCVの4.5.5からQRコードの作成が使えるようになっている。

OpenCV (読み込み)

   QRコードの作成だけでなく、読み込みもOpenCVで可能だ。
QRコードの読み込み。
   以下のコードで動画のように読み込むことが出来る。
                    
import cv2

font = cv2.FONT_HERSHEY_SIMPLEX color = (0, 0, 0) line = cv2.LINE_AA rectangle_color = (0, 255, 0)
capture = cv2.VideoCapture(0) capture.set(cv2.CAP_PROP_FRAME_WIDTH, 600) capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)
qr_code = cv2.QRCodeDetector()
capture_state = True while capture_state: capture_state, image = capture.read() qr_state, decoded_strings, points, _ = qr_code.detectAndDecodeMulti(image) if capture_state and qr_state: for decoded_string, point in zip(decoded_strings, points): if decoded_string: image = cv2.polylines(image, [point.astype(int)], True, rectangle_color, 4, line) image = cv2.putText(image, decoded_string, point[0].astype(int), font, 1.0, color, 2, line) cv2.imshow("capture", image)
if cv2.waitKey(1) & 0xFF == ord('q'): break capture.release() cv2.destroyAllWindows()
   fontcolorは読み込んだQRコードの情報を文字として表示するために使う。
   linerectangle_colorはQRコードの位置を正方形で囲むために使う。
   cv2.VideoCapture()の引数には整数が入る。数字はPCに接続されているWebカメラの順番で、Macならターミナルからsystem_profiler SPCameraDataTypeで確認が可能。iPhoneもWebカメラとして使える (https://support.apple.com/ja-jp/HT213244) 。PC側でアプリにカメラの使用を許可すればok。
   動画のウィンドウサイズの設定したあと、カメラの接続状態がTrueであるならimageにカメラに映った画像が入るようにしている。画像内にQRコードがあった場合正方形と文字を表示するための処理を入れて、画像をcv2.imshow()でウィンドウに表示する。
   最後にウィンドウがアクティブの状態で「q」キーを押すとカメラの接続を解除し、プログラムが終了する。