ℹ️

QRコード作成+QRコード画像から情報の取り出し

2024/10/05に公開

雑談

QRコードといえば「囲碁から着想を得た」という豆知識がよくクイズで出されている印象があります。囲碁の碁盤からQRコードを思いつくなんて…すごい発想力ですよね!

QRコードは扱う情報の種類によって保持できる情報量が異なるようです。QRコードの最大情報量は以下のようになっています。

  • 数字のみ: 最大 7,089文字
  • 英数字(数字と英字の組み合わせ): 最大 4,296文字
  • バイト(バイナリデータ): 最大 2,953バイト
  • 漢字: 最大 1,817文字

ちなみにバーコードは12~13桁の数字データが限界です。QRコードはバーコードの数百倍の情報量を持っているわけです。QRコードの誕生は、コード革命といっても良さそうですね。

QRコードを作成する方法

Pythonを使ってQRコードを簡単に作成することができます。例えば、qrcodeというライブラリを使用して、以下のようなコードでQRコードを生成できます。

事前にqrcodeライブラリをインストールします。

pip install qrcode[pil]

次にQRコードを生成します。

import qrcode

# QRコードの生成
qr = qrcode.QRCode(
    version=1,  # バージョンを指定(サイズが大きくなるほど多くのデータを格納)
    error_correction=qrcode.constants.ERROR_CORRECT_L,  # エラー訂正レベル
    box_size=10,  # 1つのブロックのサイズ
    border=4,  # 枠線の太さ
)

# 格納するデータ
data = "疾如風、徐如林、侵掠如火、不動如山" # 適宜 置き換えてください
qr.add_data(data)
qr.make(fit=True)

# QRコードの画像を作成
img = qr.make_image(fill='black', back_color='white')
img.show()  # 画像を表示

このプログラムを実行すると、指定したデータを格納したQRコードが生成され、画像として表示されます。

QRコードを解析する方法

次にQRコード画像を読み込んで、埋め込まれた情報を取り出す方法です。opencv-pythonとpyzbarのライブラリを使います。

pip install opencv-python pyzbar

次にQRコードを読み込むコード例です。画像ファイルとして保存されているQRコードを解析します。

import cv2
from pyzbar.pyzbar import decode

# QRコードを含む画像ファイルを読み込む
image = cv2.imread('qrcode.png')

# QRコードの解析
decoded_objects = decode(image)

# 解析結果を表示
for obj in decoded_objects:
    print("QRコードの種類:", obj.type)
    print("QRコードのデータ:", obj.data.decode("utf-8"))
    print("位置:", obj.rect)

# 解析したQRコードが存在する場所を描画
for obj in decoded_objects:
    points = obj.polygon
    if len(points) > 4:
        hull = cv2.convexHull(np.array([point for point in points], dtype=np.float32))
        hull = list(map(tuple, np.squeeze(hull)))
    else:
        hull = points
        n = len(hull)
    for j in range(0, n):
        cv2.line(image, hull[j], hull[(j + 1) % n], (255, 0, 0), 3)

image = cv2.imread('qrcode.png') の 'qrcode.png'の部分は、各自お手元にあるファイル名に置き換えてください。もし適当なQRコードがない場合は、下の画像をダウンロードして動作確認してみてください。

おわりに

1次元のバーコードが2次元のQRコードになったことで扱えるデータ量が飛躍的に増えました。ってことは、QRコードの各座標に異なる色をつけたりすることで3次元にもできるということでしょうか?QRコード自体が色褪せたり(劣化)、微妙な色合いの違いを読み取れないカメラだと正しく読み込むことが難しいかもですが…実現したらもっとたくさんのデータが扱えそうですね。
あ、QRコード自体も3次元にして凹凸の高さで3次元を表現するというのはいかがでしょう?そのかわり読み込むセンサー側も凹凸を正しく認識できる機能が求められそうですが…!

Discussion