ラズパイ用PiカメラとOpenCV4.0でQRコードを読み取る

#1.目的
OpenCV4.0のQRコード読み取り機能とRaspberryPiのPiカメラでQRコードを読み取ります。
![helloworldQR.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110861/7c1e4b9d-ce75-2aeb-9a18-a3fc4749255c.png)
#2.環境
・RaspberryPi3
・Raspbian Buster
・Python3.7.3
・[OpenCV4.0](https://opencv.org/opencv-4-0/)
・[Piカメラ Official V2](https://raspberry-pi.ksyic.com/)
#3.方法
##OpenCV4.0のインストール
[ラズパイ: Buster向け OpenCV4](https://qiita.com/mt08/items/4e8c36ee398fea5ed8d9)
[ラズパイ3にOpenCV3/4を簡単に導入](https://qiita.com/mt08/items/e8e8e728cf106ac83218#_reference-0f412541cf8798b6aab0)


##QRコードの読み取り
次のサイトのコードを参考に組み合わせました。
[OpenCV 4.0のQRコード検出、G-APIを試す](https://rest-term.com/archives/3491/)
[Accessing the Raspberry Pi Camera with OpenCV and Python]
(https://www.pyimagesearch.com/2015/03/30/accessing-the-raspberry-pi-camera-with-opencv-and-python/)

OpenCV Official
[cv::QRCodeDetector Class Reference](https://docs.opencv.org/4.0.0/de/dc3/classcv_1_1QRCodeDetector.html#a3becfe9df48966008179e1e6c39bf8f9)
>###Function
>QRCodeDetector object=cv.QRCodeDetector()
>retval, points, straight_qrcode=cv.QRCodeDetector.detectAndDecode(img[, points[, straight_qrcode]])
>###パラメータ説明
>**img** : grayscale or color (BGR) image containing QR code.
>**points** : opiotnal output array of vertices of the found QR code quadrangle. Will be empty if not found.
>**straight_qrcode** : The optional output image containing rectified and binarized QR code


#4.コード
```sample.py

# import the necessary packages
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2 as cv
 
# initialize the camera and grab a reference to the raw camera capture
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))
 
# allow the camera to warmup
time.sleep(0.1)
 
# capture frames from the camera
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):

        image = frame.array
        output_image = image.copy()
        detector = cv.QRCodeDetector()
        data, points, straight_qrcode = detector.detectAndDecode(image)

        if data:
            print(f'decoded data: {data}')
            for i in range(4):
                cv.line(output_image, tuple(points[i][0]), tuple(points[(i + 1) % len(points)][0]), (0, 0, 255), 4)
            cv.imshow('QR',output_image)
            print(f'QR code version: {((straight_qrcode.shape[0] - 21) / 4) + 1}')

        # show the frame
        cv.imshow("Frame", image)
        key = cv.waitKey(1) & 0xFF
        # clear the stream in preparation for the next frame
        rawCapture.truncate(0)
        # if the `q` key was pressed, break from the loop
        if key == ord("q"):
            break
```

#5.結果
実行すると撮影状態となります。
QRコードを写したスマホ画面などをあまりボケない程度に近づけます。
Piカメラのフォーカス調整は付属のこの部品を使ってレンズ部分をまわして調整します。
![IMG_6471.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110861/23163fc7-a47f-c4f5-b862-60b5a5d1937f.png)

QRコードが認識され、QRコードを赤枠で囲んだウィンドウが開きます。
![Screenshot_20190712_202351.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110861/d9a4b6bc-22e8-1b4c-161c-77f3eb5ced89.png)
コンソールには読み取ったデータとQRコードのバージョンが出力されます。
![console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110861/50f9f45b-0a8f-7612-9bdd-3f5994f41e5b.png)

Piカメラにオートフォーカス機能はないのでQRコード読み取り機のようにカメラとQRコードの距離が固定になるような工夫を加えると認識精度もあがりそうですね。