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

# 概要
電子決済を中心に一般生活にも当たり前となったQRコード。
自ら作って、認識させてみたいと思いRaspberryPiで試した結果を投稿します。

# やったこと
・任意のQRコード生成
・USBカメラを使ってコード読み取り＋内容の表示
実行した見ためはこんな感じ。
<iframe width="560" height="315" src="https://www.youtube.com/embed/xLL4vZN3S7g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

コードの内容（自ら生成可能）を表示。
認識している様子をわかりやすくするため、認識毎に数値が増える表示をしています。
![2020-05-12-171506_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/c21863fe-e54a-9160-6fdd-cf32266c891c.png)


# 環境
・RasPi4　(RasPi3でも動くはずです)
・USBカメラ(Logicool)　→　Raspi camでも可能。

## RasPiのセットアップ　
・RasPiやOpenCVのセットアップが完了していれば不要。
　[Raspberry PiでArUcoを使ってみる](https://qiita.com/h-kiyo/items/764673e6dafafc19eb14)
・必要なパッケージのインストール
　ターミナル で下記を実行

```python:install
pip install --upgrade pip
pip install pillow
pip install pyzbar
pip install qrcode
```

# QRコードを生成する

```python:QRcreate.py
import qrcode
from PIL import Image

#サイズを決める
qr = qrcode.QRCode(box_size=5)
    #種類と大きさ一覧。
    #1	57x57
    #2	114x114
    #5	285x285
    #10	570x570

#埋め込む内容を指定
qr.add_data('QRコードを身近に試してみる')
qr.make()

img_qr = qr.make_image()
img_qr.save('/home/pi/qr_lena_1.png') #保存したい場所と名前。

```


## QRコードを認識する

```python:QRdetect.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from pyzbar.pyzbar import decode
from PIL import Image
import cv2
import time #test用、無くても可

#ビデオキャプチャの開始
cap = cv2.VideoCapture(1) 
i=0 #test用

while True:
    #ビデオキャプチャから画像を取得
    ret, frame = cap.read() 

    #sizeを取得
    Height, Width = frame.shape[:2] 
    img = cv2.resize(frame,(int(Width),int(Height)))
    PIL_Image=Image.fromarray(img)

    #画像の表示
    cv2.imshow('Qr Test', img)
    data = decode(PIL_Image)

    #何か読めていたら表示する
    if(data != []):
        print('Read' ,i)
        i=i+1
        #print(data[0][0]) 
        print(data[0][0].decode('utf-8', 'ignore'))

    #キーボード入力の受付
    cv2.waitKey(1) 

#ビデオキャプチャのメモリ解放
cap.release() 
#すべてのウィンドウを閉じる
cv2.destroyAllWindows()


```


## 実行結果
　少し見えにくいですが、認識毎に数値が増えているのがわかると思います。
　Printをしなければもっと高速で動きます。
<iframe width="560" height="315" src="https://www.youtube.com/embed/xLL4vZN3S7g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# エラー対応
opencvエラーの場合、インストールしなおすと解決することがある。

```
pip3 install opencv-contrib-python==4.1.0.25
```

# 参考リンク
　・[QRコードの生成](https://qiita.com/Kosuke_Matsui/items/abc379e4486eeacd283e)
　・[PythonでQRコードとバーコードを生成して普通に読み取ったりOpenCV でリアルタイムに読み取る方法](https://qiita.com/igor-bond16/items/0dbef691a71c2e5e37d7)
　・[色々な生成方法](https://qiita.com/MuAuan/items/7265da5281aa69623a03)

## 応用
* [pythonでArUcoライブラリを使ってARマーカの位置とか角度とか知る](https://sgrsn1711.hatenablog.com/entry/2018/02/15/224615)
* [ARマーカー認識プログラム](https://qiita.com/hsgucci/items/37becbb8bfe04330ce14#tello%E3%81%A7ar%E3%83%9E%E3%83%BC%E3%82%AB%E3%83%BC%E3%82%92%E8%AA%8D%E8%AD%98%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)
* [pythonでARマーカーの姿勢推定](https://qiita.com/ReoNagai/items/a8fdee89b1686ec31d10)
* [ArUcoマーカーを使用して、安定した商品の監視映像を撮影してみました。](https://dev.classmethod.jp/articles/opencv-aruco-marker/)
* [Opencv Aruco で Pose estimation する その１](http://pongsuke.hatenadiary.jp/entry/2018/04/19/102146)
* [python ARマーカー認識](https://qiita.com/sugman_a/items/1af4664521decebace8b)
* [OpenCV+ArUco+Webカメラでマーカ検出をやった話](https://ensekitt.hatenablog.com/entry/2018/04/12/200000)
* [【QRコード入門】作成・読込からリアルタイムカメラ取得](https://qiita.com/MuAuan/items/7265da5281aa69623a03)


# 2022/10/4　追記

pyqrcode.createでも生成可能。

 https://twitter.com/miyashin_prg/status/1576413561747693568?s=46&t=kNa9ZOAuK71ulRUgWGElUg

以上