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-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コードの読み取りを開始し、コンソールに結果を表示します
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
最後に
何か間違っている部分・気になる部分があれば気軽にコメントをください