なぜQRコードは物理的な個体識別の「王様」であり続けるのか?
在庫にある数千ものアイテムを管理したいが、RFIDスキャナーに多額の費用をかけたくない場合、QRコードが救世主となります。私がこれまで手掛けてきた資材管理からイベントのチェックインアプリまで、QRコードはその経済性の高さから常に選ばれてきました。RFIDタグが1枚あたり数十円から数百円するのに対し、QRコードは紙に印刷するだけなので、ほぼ無料です。
ストレージ容量に関しては、従来のバーコードが約20〜25文字しか保持できないのに対し、QRコードは最大で数字7,089文字、または英数字4,296文字を格納できます。そして最も重要なのは、現代のスマートフォンであればどれでもプロ仕様のリーダーになれるという点です。
本記事では、Pythonを使ったQRコードの処理方法について詳しく解説します。単に画像を生成するだけでなく、実際の運用フローにどのように組み込むかまで踏み込みます。
最適な実装方法の選択
通常、主に2つのアプローチがあります。
- オンラインAPI(Google Chartsなど)を使用する: リクエストを送信して画像リンクを受け取ります。手軽ですがインターネットに依存します。APIサーバーの障害や機密データの漏洩のリスクがあります。
- ローカルライブラリ(qrcode, pyzbar)を使用する: すべての処理をローカルマシン上で行います。レスポンス速度はミリ秒単位で、オフラインでも動作し、ロゴの追加やブランドカラーのカスタマイズも容易です。
在庫管理システム(WMS)のように高い安定性が求められるシステムでは、私は常にローカルでの実行を優先します。`qrcode`ライブラリは非常に軽量でコード生成に特化しており、一方の`pyzbar`は、画像が傾いていたり多少ぼやけていたりしても読み取れる感度の高さで知られています。
詳細な実装ガイド
1. 環境構築
pipを使用して必要なライブラリをインストールします。画像の処理には`Pillow`を、リアルタイムのカメラスキャンには`opencv-python`を併用します。
pip install qrcode[pil] pyzbar opencv-python
Windowsユーザーへの注意: DLL不足のエラーが出る場合は、Visual C++ Redistributableをインストールしてください。Linuxの場合は、ライブラリを動作させるためにapt-getで`libzbar0`をインストールするのを忘れないでください。
2. プロフェッショナルなQRコードの生成
在庫の各アイテムに、製品ID、入庫日、ロット番号を含む識別コードが必要だと仮定しましょう。以下のコードは、最高レベルの誤り訂正能力を持つQRコードを生成します。
import qrcode
def create_warehouse_qr(data, filename="product_001.png"):
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H, # 面積の30%が損壊しても読み取り可能
box_size=10,
border=4,
)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save(filename)
print(f"成功: {filename}")
# 実際のデータでは、区切り文字としてバーティカルバー(|)がよく使われます
raw_data = "SKU-9923|2023-12-01|ZONE-A"
create_warehouse_qr(raw_data)
データが複雑になった場合、スキャン後にRegex(正規表現)を使って情報を抽出するのが一般的です。コードに組み込む前に正規表現パターンを素早くテストしたい場合は、Regex Testerを試してみてください。このツールを使えば、パターンがSKUコードを正しく取得できているかを即座に確認できます。
在庫の各アイテムに、製品ID、入庫日、ロット番号を含む識別コードが必要だと仮定しましょう。以下のコードは、最高レベルの誤り訂正能力を持つQRコードを生成します。
3. 画像ファイルからのQRコードデコード
ラベルを貼付した後、スタッフは写真を撮るだけで入庫処理ができます。`pyzbar`を使えば、画像ファイルから内容を簡単に読み取ることができます。
from pyzbar.pyzbar import decode
from PIL import Image
def scan_qr_file(path):
results = decode(Image.open(path))
for obj in results:
print(f"内容: {obj.data.decode('utf-8')}")
print(f"コードの種類: {obj.type}")
scan_qr_file("product_001.png")
4. カメラによるリアルタイムスキャンシステム
これはチェックインカウンターなどで最も一般的なアプリケーションです。ファイル一つひとつを開く代わりに、システムがウェブカメラを通じて継続的にスキャンします。新しいコードを検出するたびに、データを自動的に照合します。
import cv2
from pyzbar.pyzbar import decode
def start_scanner():
cam = cv2.VideoCapture(0)
history = set()
while True:
_, frame = cam.read()
for code in decode(frame):
content = code.data.decode('utf-8')
if content not in history:
print(f"[チェックイン]: {content}")
history.add(content)
# 画面上に確認用の枠を描画
x, y, w, h = code.rect
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 3)
cv2.imshow("Scanner", frame)
if cv2.waitKey(1) & 0xFF == ord('q'): break
cam.release()
cv2.destroyAllWindows()
システムを安定稼働させるための実戦経験
多くの実プロジェクトを経験した結果、スキャンエラーを最小限に抑えるための「3つの黄金律」を導き出しました。
- 誤り訂正レベルHを優先する: 倉庫環境では、ラベルに傷がついたり埃がついたりしがちです。レベルHは最大30%のデータ損失を復元できるため、スタッフが何度もスキャンし直す手間を省けます。
- データ密度を制御する: QRコードに長い文章を詰め込みすぎないでください。文字数が増えるほどセルが小さく密集し、安価なカメラではピント合わせが困難になります。IDや短縮URLのみを保存するのがベストです。
- コントラストが鍵: 常に白背景に黒で印刷してください。薄い色を使ったり、光沢のあるナイロン面に印刷したりするのは避けてください。照明の反射でリーダーが機能しなくなります。
最後に
`qrcode`と`pyzbar`の組み合わせは、Pythonで業務プロセスをデジタル化するための最短ルートです。資産管理でもイベントのチケット管理でも、このペアは速度と精度の両面で非常に優れたパフォーマンスを発揮します。DockerやWindows環境での`zbar`のインストールで困ったことがあれば、下のコメント欄で質問してください。サポートします!

