Python
OpenCV
RaspberryPi
QRcode
Python3

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

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

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

使用したもの

  • RaspberryPi 3B
  • ウェブカメラ(bsw200mbk)
  • PC(RaspberryPiのセットアップ・ssh接続用)
  • LANケーブル

環境構築

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

まずここからisoをダウンロードします
Torrentがおすすめ

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

Raspiに接続

まず、zeroconfサービスを使えるようにしておきます
Windowsの場合はBonjourをインストールしましょう
これで.localが使えるようになります

PCとRaspiを有線LANで接続します
Tera Term等でraspberrypi.localに接続します
デフォルトのユーザー名はpi、パスワードはraspberryです

OpenCVの導入

ファイルシステムの拡張

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

$ sudo raspi-config
スワップの設定

スワップを設定しないとOpenCVのmake中にハングしてしまいます
/etc/dphys-swapfileCONF_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コードの読み取りを開始し、コンソールに結果を表示します

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

最後に

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