Raspberry Pi(ラズパイ)のカメラモジュールを使ってバーコードを取得するPythonコード

投稿者: atsushi 投稿日:

Raspberry Pi(以下ラズパイ)を利用した工作の多くでカメラモジュールが利用されています。カメラモジュールは映像を画像にしたり、動画で取り込んだりすることができます。そして単に画像として保存するだけでなく、そこに映るオブジェクトを判定したり、そこから情報を得ることでよりIoTらしい利用法が可能になります。

今回はカメラモジュールを使って、書籍などのバーコード(ISBN)を読み取るまでの手順を紹介します。

raspi-configの設定

raspi-configを起動して、インタフェースのカメラを有効にします。設定後、再起動が必要です。

ライブラリのインストール

今回は次のライブラリを利用します。

  • OpenCV : 画像取得、簡易編集用
  • ZBar : 画像からバーコードを読み取り

aptを使って必要なライブラリをインストールします。

sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-103
sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
sudo apt-get install libatlas-base-dev libjasper-dev
sudo apt install libilmbase23 libopenexr23
sudo apt-get install zbar-tools libzbar-dev
sudo pip3 install opencv-python

次にPythonライブラリをインストールします。

sudo pip3 install pyzbar

Pythonのコード

ではコードの解説です。まず、画像を常時解析するので、繰り返し処理にします。

import cv2
from pyzbar.pyzbar import decode
cap = cv2.VideoCapture(0)

while True:

cap.release()

次にOpenCVライブラリを使って画像を取得します。OpenCVでグレースケール化した画像を取得します。今回のようにバーコードの読み取りであれば、カラー画像である必要はありません。解析も容易、高速になります。さらに画像が大きすぎると解析に失敗するので、画像を半分にしています。

以下は while True: の中に記述します。

ret, frame = cap.read()
img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
height = img.shape[0]
width = img.shape[1]
image = cv2.resize(img , (int(width*0.5), int(height*0.5)))

取得した画像をZBarのdecodeを適用し、バーコードとして結果が返ってくるか判定します。読み取れていると data の中に結果が返ってきますので、それを出力します。

data = decode(image)
if len(data) > 0:
  # 結果が返ってきた場合
  print(data[0][0].decode('utf-8', 'ignore'))
  break

実行

では実際に実行してみます。カメラモジュールに書籍のバーコードを表示すると、ISBNが標準出力に返ってきました。

python3 camera.py
9784405102873

注意点

ISBNの解析はバーコードの大きさと、2つのバーコードが上下に並んでいるため、かなりシビアな認識でした。ちょうどいい距離感、位置を掴むには時間がかかるかも知れません。なお、QRコードは素早く、簡単に認識されます。

応用

このISBNを使ってAmazonのAPIを実行すれば、書籍のタイトルや価格、著者などの情報も取得できます。それらをデータベースに保存すれば、簡易的な蔵書管理にも使えるでしょう。

ISBN以外でも通常のバーコードやQRコードを解析できるようにするのは容易です。様々な利用法が考えられそうです。

まとめ

カメラモジュールは目の前の情報を取得するのに手軽で、プログラミングの力で画像を分析すれば役立つ情報が手に入ります。テキストで入力するのではなく、カメラにかざすだけで情報が取得できるようなIoTプロジェクトにぜひチャレンジしてみてください。


0件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です