😄

バーコードを作成、読み取り

2024/06/28に公開

計画

  1. QRコードとバーコードの違いをまとめる
    • 扱えるデータの違い
  2. 実際に作成
  3. 読み取り

1. QRコードとバーコードの違い

扱えるデータの違い

  • データ量
    • QR: 多くて数千桁の文字数
    • バー: 格納数の多い規格でも英数字100桁程度が上限

今回はタスク管理を目的とするのでQRを選択した。
データベースにタスクの内容を保存する場合はバーコードでも良いだろう。

ライブラリ選択

ライブラリ 作成 読み取り 備考
qrcode × シンプルで使いやすいQRコード生成ライブラリ
pyzbar × バーコードやQRコードの読み取りに使用
opencv-python × コンピュータビジョンライブラリ、QRコードの読み取りも可能
zxing (ZXing) × Javaベースのバーコードスキャナー、Pythonバインディングあり
qrtools Python 2用だが、Python 3でも使用可能
segno × 追加の依存関係がない純粋なPythonで書かれたQRコード生成ライブラリ
qrtool (qrcodegen) × 高機能なQRコード生成ライブラリ
MyQR × カスタマイズされたQRコード(カラーやアニメーション)を生成可能
pyqrcode × SVG形式での出力もサポートするQRコード生成ライブラリ
Pillow × 直接QRコードを生成する機能はないが、画像処理に使用

chatGPTに聞いた内容です

qrcode、opencv、pyzbarを使用することに決めた。

2. 実際に作成

create_QR.py
import qrcode

# QRコードに含めるデータ
data = "Hello, World!"

# QRコードを作成
qr = qrcode.QRCode(
    version=1,  # サイズのバージョン
    error_correction=qrcode.constants.ERROR_CORRECT_L,  # エラー訂正レベル
    box_size=15,  # 各ボックスのサイズ
    border=10,  # ボーダーのサイズ
)
qr.add_data(data)
qr.make(fit=True)

# 画像を生成
img = qr.make_image(fill='black', back_color='white')

# 画像を保存
img.save("output/qrcode.png")

エラー訂正レベル

エラー訂正レベル 訂正能力 説明
L (Low) 約7%の誤りを訂正可能 軽度の汚れや傷、小さな部分の欠損
M (Medium) 約15%の誤りを訂正可能 比較的多くの汚れや傷、部分的な欠損
Q (Quartile) 約25%の誤りを訂正可能 大きな部分の欠損や歪み、部分的な破損
H (High) 約30%の誤りを訂正可能 大きく破損したり、強い汚れがある場合でも訂正可能

バージョンごとの扱える日本語数

バージョン 行×列の数 L レベル M レベル Q レベル H レベル
1 21×21 17 14 11 7
5 37×37 106 84 60 44
10 57×57 174 137 104 81
15 77×77 279 220 167 130
20 97×97 379 301 229 178
25 117×117 502 386 293 221
30 137×137 641 493 376 279
35 157×157 799 610 466 335
40 177×177 961 736 574 409

chatGPT調べです

3. 読み取り

read_QR.py
import cv2
from pyzbar import pyzbar


def decode_qr_code(image):
    # QRコードを検出してデコードする
    # decoded_objects = pyzbar.pyzbar.decode(image)
    decoded_objects = pyzbar.decode(image)
    
    for obj in decoded_objects:
        # デコードされたデータを出力
        print("Type:", obj.type)
        print("Data:", obj.data.decode("utf-8"))
    return image

# カメラからのキャプチャを開始
cap = cv2.VideoCapture(0)

while True:
    # フレームをキャプチャ
    ret, frame = cap.read()
    if not ret:
        break
    # QRコードをデコード
    frame = decode_qr_code(frame)
    # フレームを表示
    cv2.imshow('QR Code Scanner', frame)
    # 'q'キーを押すと終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# カメラのリソースを解放してウィンドウを閉じる
cap.release()
cv2.destroyAllWindows()

cv2.VideoCapture(0)でmacからiphoneカメラを起動しようとしたらエラーが出る。
iphoneとmacを有線で繋ぐことで解決した

反省

計画段階でライブラリを選択する段階を考慮できていなかった。
今後は、ライブラリを探す工程があることを意識したい。

Discussion