LoginSignup
15
0

QRコードを生成したり読んだりしてみた

Posted at

はじめに

こんにちは、チョコレートの入っているアドベントカレンダーを12/1に完食したさこもなです!

Wifi?Bluetooth? いいえ、カメラです

私がとある電子工作をしていた時、データを Raspberry Pi に送りたかったのですが、ラズパイにはカメラを接続していたので、それを活用できないかと考え、QRコードを利用することに決めました。

QRコードについて

日常において、QRコードを見ないことはないのではしょうか。
そんなQRコードと聞いたら、皆さんは何を連想しますか?
一般的には「URL」を取得するイメージが強いと思います。
だがしかし!実はURL以外にもテキスト形式など様々なデータを設定することができるのです。

今回その際にQRコードの読み取りにつまづいたので、それをここにメモしていこうと思います。

ちなみに、QRコードに埋め込める情報量は、バイナリだと約3000バイトほどだそうです( -`ω-)✧

Raspberry Pi でQRコードを読み取ってみる

サンプル用のQRコードを生成には「QRのススメ」さんという素晴らしいサイトを利用させていただき無事成功したので、次は読み取りの実装をしていきます。

まずはじめにラズパイで書いていた言語、PythonのQRコードリーダーで有名なライブラリ、pyzberでやってみます。

pyzber_test.py
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コードで確認します。

image.png

お!それっぽい!画面が出てきました!
結果を見る限りいけてそうなので、次は場所で分けてprintしていきます。

image.png
するとこのような結果が。
正しく読まれていれば一番下の行は /x00 ではなく、値を埋め込んでいたつもりなのですが、、、

あれ?QRコード生成に失敗してた、、?

よくわからずにもう一度QRコードをスマホで読み取ってみるものの、無事に入ってます。

読み取りに失敗してたりする???

先輩と一緒にもう一度見比べてみるとなんと、本来NUMPYと書かれている場所が文字化けしているのを確認しました!!!!!

image.png

 その後先輩と一緒に試行錯誤してみるも、うまく解決することができず、違うライブラリを使ってみることにしました。

リトライ!

先輩が発見してくれたライブラリを使ってQRコードを読み取ってみます。

pyquirc
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コードライフ!!!!

15
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
0