PythonでQRコードとバーコードを生成して普通に読み取ったりOpenCV でリアルタイムに読み取る方法

#0.はじめに

今回作るものがどういう感じで動くのか見てみたい方は、[こちら](https://youtu.be/2kRHo-biBjE)(youtubeの動画)でどうぞ。

まずは、今回必要なものを一度にインストールします。

```
pip install pyqrcode
pip install pypng
pip install python_barcode
pip install pyzbar
```

#1.QRコードの生成
ここではまずは文字の情報を含んだQRコードを生成します。

```qrcode_barcode.py
import pyqrcode

a = pyqrcode.create(content="Hello From Jetsonnano",error='H') 

a.png(file='test.png',scale=6) 
```
これを実行すると以下のようなQRコードが出来上がります。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616944/bf829111-168a-4558-ddc9-0bfd1b3692b8.png)
次にurlの情報を含んだQRコードを生成します。これは一般的に本などにつけられているQRコードになります。

```qrcode_barcode.py
import pyqrcode

b = pyqrcode.QRCode('https://www.youtube.com/channel/UCDYbu9aViDvkubFcwgbbKDA',error='M')

b.png('test2.png',scale=6)
```
これを実行すると以下のようなQRコードが生成されます。
![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616944/60b8b76d-d9b2-8034-65da-ce537bfc531f.png)

このQRコードたちの色を変えたり大きさを変えたりすることもできるので気になる方はぜひ[Youtube](https://youtu.be/2kRHo-biBjE)をご覧ください。

#2.バーコードの生成
次にバーコードを生成します。Pythonで使えるバーコードのタイプは今回使っているやつの他にも色々あります。気になる方は調べでみてください。

```qrcode_barcode.py
import barcode
from barcode.writer import ImageWriter

d = '938469387183' 

a = barcode.get_barcode_class('ean13') 
b = a(d,writer=ImageWriter()) 
c = b.save('barcode') 
```
これを実行すると以下のようなバーコードが生成されます。バーコードには文字を含ませることもできます。
![barcode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616944/6cf31091-155d-3bf1-cc87-205a00dfcbc7.png)

#3.QRコードとバーコードの読み取り
ここではQRコードとバーコードの読み取りを行います。どちらも読み取る方法は同じです。

```qrcode_barcode.py
from pyzbar.pyzbar import decode 
from PIL import Image

d = decode(Image.open('qrcode.png'))
print(d[0].data.decode("utf-8"))
#e = decode(Image.open('barcode.png'))
#print(e[0].data.decode('utf-8'))
```

#4.OpenCVを使った読み取り
ここではOpenCVを使ってQRコードまたはバーコードを検知したら画面の上にその情報を表示させます。

```qrcode_barcode.py
from pyzbar.pyzbar import decode
import cv2

cap = cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_SIMPLEX
while cap.isOpened():
    ret,frame = cap.read()
    if ret == True:
        d = decode(frame)
        if d:
            frame = cv2.putText(frame,d[0].data.decode('utf-8'),(10,50),font,1,(0,255,255),2,cv2.LINE_AA)
        cv2.imshow('frame',frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
```
これを実行するとカメラが読み取ったバーコードなどの情報が画面の上に表示されます。ですが、この方法はあまりカッコよくないので次にもっとカッコいい方法を紹介します。

#5.OpenCVを使った読み取り(カッコいい)
これはバーコードなどを検知したらそれを赤い四角で囲みその上にその情報を表示します。

```qrcode_barcode.py
from pyzbar.pyzbar import decode
import cv2

cap = cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_SIMPLEX
while cap.isOpened():
    ret,frame = cap.read()
    if ret == True:
        d = decode(frame)
        if d:
            for barcode in d:
                x,y,w,h = barcode.rect
                cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
                barcodeData = barcode.data.decode('utf-8')
                frame = cv2.putText(frame,barcodeData,(x,y-10),font,.5,(0,0,255),2,cv2.LINE_AA)
        cv2.imshow('frame',frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()

```
これは自分で作ったバーコードやQRコードは読み取れたのですが、本などについているやつは読み取れませんでした。

#最後に
今回作ったものは[Youtube](https://youtu.be/2kRHo-biBjE)でも解説しているのでそちらも良かったらご覧ください。質問、アドバイスなどがあればぜひコメントしてください。