😄
バーコードを作成、読み取り
計画
- QRコードとバーコードの違いをまとめる
- 扱えるデータの違い
- 実際に作成
- 読み取り
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