はじめに
こんにちは、チョコレートの入っているアドベントカレンダーを12/1に完食したさこもなです!
Wifi?Bluetooth? いいえ、カメラです
私がとある電子工作をしていた時、データを Raspberry Pi に送りたかったのですが、ラズパイにはカメラを接続していたので、それを活用できないかと考え、QRコードを利用することに決めました。
QRコードについて
日常において、QRコードを見ないことはないのではしょうか。
そんなQRコードと聞いたら、皆さんは何を連想しますか?
一般的には「URL」を取得するイメージが強いと思います。
だがしかし!実はURL以外にもテキスト形式など様々なデータを設定することができるのです。
今回その際にQRコードの読み取りにつまづいたので、それをここにメモしていこうと思います。
ちなみに、QRコードに埋め込める情報量は、バイナリだと約3000バイトほどだそうです( -`ω-)✧
Raspberry Pi でQRコードを読み取ってみる
サンプル用のQRコードを生成には「QRのススメ」さんという素晴らしいサイトを利用させていただき無事成功したので、次は読み取りの実装をしていきます。
まずはじめにラズパイで書いていた言語、PythonのQRコードリーダーで有名なライブラリ、pyzberでやってみます。
import cv2
from PIL import Image
from pyzbar.pyzbar import decode
# QRコードデコード
img = Image.open('yahoo.png')
value = decode(img)
if value:
for qrcode in value:
print(qrcode)
Decoded(data=b'https://www.yahoo.co.jp/', type='QRCODE', rect=Rect(left=25, top=25, width=198, height=198), polygon=[Point(x=25, y=25), Point(x=25, y=222), Point(x=223, y=223), Point(x=222, y=25)], quality=1, orientation='UP')
yahooのurlを埋め込んだQRコードは無事取れてることがわかりました!
続いて、qrcode 7.4.2というライブラリで作成したデータを埋め込んだQRコードで確認します。
お!それっぽい!画面が出てきました!
結果を見る限りいけてそうなので、次は場所で分けてprintしていきます。
するとこのような結果が。
正しく読まれていれば一番下の行は /x00
ではなく、値を埋め込んでいたつもりなのですが、、、
あれ?QRコード生成に失敗してた、、?
よくわからずにもう一度QRコードをスマホで読み取ってみるものの、無事に入ってます。
読み取りに失敗してたりする???
先輩と一緒にもう一度見比べてみるとなんと、本来NUMPYと書かれている場所が文字化けしているのを確認しました!!!!!
その後先輩と一緒に試行錯誤してみるも、うまく解決することができず、違うライブラリを使ってみることにしました。
リトライ!
先輩が発見してくれたライブラリを使ってQRコードを読み取ってみます。
from PIL import Image, ImageOps
import quirc
img = Image.open("QRCode1.png")
img = ImageOps.grayscale(img)
decoded_codes = quirc.decode(img)
for code, data in decoded_codes:
# QRコードのタイプを取得
qrcode_type = data.payload[0:1]
if qrcode_type == b'A':
print("登録成功!")
print(f"QR_Type : {qrcode_type.decode('utf-8')}")
# user_idを表示
user_id = data.payload[1:33]
print(f"user_id : {user_id.decode('utf-8')}")
# display_nameを表示
display_name = data.payload[33:53]
print(f"display_name : {display_name.decode('utf-8')}")
# 攻撃力を表示
power = data.payload[53:55]
power_int = int.from_bytes(power , "little")
print(f"power : {power_int}")
# numpyのファイスサイズを表示
print(f"numpy {len(data.payload[55:])} bytes")
登録成功!
QR_Type : A
user_id : monanosuke
display_name : さこもな
power : 2
numpy 640 bytes
無事値が取れてる!!!!!
今回使ったライブラリはこのpyquircというものです。quircではないので注意!
まとめ
pyzberがなぜ文字化けしてしまったかの調査は今後してみますが、電子工作は無事終えることができました!
今回QRコードの理解を深めるとともに、扱いについても学ぶことができました。
QRコードに対しての魅力を再発見できたのはよかったです。
皆さんもレッツQRコードライフ!!!!