RaspberryPiのセットアップからOpenCVでQRコードを読み取るまで

# RaspberryPiでQRコードを読み取れるようになるまで

Python3 + OpenCV + pyzbarな環境を構築してQRコードを読み取れるようになるまでの手順です

## 使用したもの

* RaspberryPi 3B
* ウェブカメラ([bsw200mbk](http://buffalo.jp/product/multimedia/web-camera/bsw200m/))
* PC(RaspberryPiのセットアップ・ssh接続用)
* LANケーブル

## 環境構築

### RaspiにOSをインストールする

まず[ここ](https://www.raspberrypi.org/downloads/raspbian/)からisoをダウンロードします
Torrentがおすすめ

ダウンロードが終わったらMicroSDに書き込みます
Windowsの場合、書き込みには[Win32DiskImager](https://sourceforge.net/projects/win32diskimager/)を使います
書き込みが終わったらbootという名前のドライブの直下に`ssh`という名前の空ファイルを作ります
これによってSSHが有効化されます

### Raspiに接続

まず、zeroconfサービスを使えるようにしておきます
Windowsの場合は[Bonjour](https://support.apple.com/kb/DL999?locale=ja_JP)をインストールしましょう
これで`.local`が使えるようになります

PCとRaspiを有線LANで接続します
[Tera Term](https://ja.osdn.net/projects/ttssh2/)等で`raspberrypi.local`に接続します
デフォルトのユーザー名は`pi`、パスワードは`raspberry`です

### OpenCVの導入

##### ファイルシステムの拡張

`sudo raspi-config`を実行しAdvanced Options → Expand Filesystemを実行します
これでmicroSDの容量を全部使うことができます

```
$ sudo raspi-config
```

##### スワップの設定

スワップを設定しないとOpenCVのmake中にハングしてしまいます
`/etc/dphys-swapfile`の`CONF_SWAPSIZE`を書き換えてください(単位はMB)

```
$ sudo vim /etc/dphys-swapfile

︙
CONF_SWAPSIZE=2048
︙

$ sudo systemctl stop dphys-swapfile
$ sudo systemctl start dphys-swapfile
```

##### 必要なパッケージのインストール

まずは更新

```
$ sudo apt update
$ sudo apt upgrade
```

必要なパッケージ群のインストール

```
$ sudo apt install build-essential cmake pkg-config libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libgtk2.0-dev libatlas-base-dev gfortran python2.7-dev python3-dev
```

libx264はaptからインストールできないのでソースからビルドします

```
$ git clone git://git.videolan.org/x264
$ cd x264
$ ./configure --host=arm-unknown-linux-gnueabi --enable-static --disable-opencl
$ make -j4
$ sudo make install
$ cd ..
```

##### OpenCVのビルド

まずはソースをダウンロード

```
$ git clone https://github.com/opencv/opencv.git
$ git clone https://github.com/opencv/opencv_contrib.git
```

ビルドします
この作業は時間がかかるので注意してください

```
$ cd opencv
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=/home/pi/opencv_contrib/modules -D BUILD_EXAMPLES=ON -D WITH_FFMPEG=ON -D ENABLE_PRECOMPILED_HEADERS=OFF ..
$ make
$ sudo make install
$ sudo ldconfig
$ cd ..
```

### pyzbarの導入

これはpipだけで入ります

```
$ sudo pip3 install pyzbar
```

## テスト

以下のプログラムを`(適当な名前).py`で保存してpython3で実行するとQRコードの読み取りを開始し、コンソールに結果を表示します

```python:test.py
import cv2
from pyzbar.pyzbar import decode


cap = cv2.VideoCapture(0) # ここでエラーを吐いたら ls /dev/video* を実行してカメラを認識しているか確認

cap.set(cv2.CAP_PROP_FPS, 30)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

while True:
    ret, frame = cap.read()
    # cv2.imshow("test", frame) # GUIが使える時だけ
    gray = cv2.cvtColor(frame, cv2.COLOR_RGBA2GRAY)
    data = decode(gray)
    for symbol in data:
        if symbol.type == "QRCODE": # QRコード以外を読み取らないように
            print(data[0][0].decode("utf-8", "ignore"))

    if cv2.waitKey(1) == 27: # Escキーで終了(GUIがある場合のみ)
        break

cap.release()
cv2.destroyAllWindows()

```

```
$ python3 test.py
```

## 最後に

何か間違っている部分・気になる部分があれば気軽にコメントをください