Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

最後に

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away