QRコードの作成と読み込み
2023-05-07
ここではpythonのライブラリを使ってQRコードの生成と検出をする。
qrcode (作成)
qrcode
というライブラリの使い方について。インストールしたあと、コマンドライン上で文字列を与えたらそれをQRコードの画像として出力されるので使い勝手が良い。画像を生成するためにpillow
が必要。生成された画像を読み込むと文字列が読み込まれる。実際にこのサイトのURL文字列を生成して読み込んでみた。読み込んだリンクを選択すればブラウザが開いてサイトに行き着く。
pip install qrcode
pip install pillow
qr 'https://shitori3no.jp/' > qrcode.png
より詳細に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')
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
で可能だ。
以下のコードで動画のように読み込むことが出来る。
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()
font
とcolor
は読み込んだQRコードの情報を文字として表示するために使う。
line
とrectangle_color
はQRコードの位置を正方形で囲むために使う。
動画のウィンドウサイズの設定したあと、カメラの接続状態がTrue
であるならimage
にカメラに映った画像が入るようにしている。画像内にQRコードがあった場合正方形と文字を表示するための処理を入れて、画像をcv2.imshow()
でウィンドウに表示する。
最後にウィンドウがアクティブの状態で「q」キーを押すとカメラの接続を解除し、プログラムが終了する。