Edited at

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


最後に

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