Raspberry Piに接続されたUSBカメラをOpenCV+python3で動作させる

Raspberry Pi 2に接続されたUSBカメラをOpenCVを入れてpython3で動作させるに至るまでとにかくErrorで長時間ハマってしまった…他にも同じことで苦しんでいる人がいるかもと思い,とりあえず覚えている範囲でメモ.

背景

以前の記事で,師匠への誕生日プレゼントとして畑監視システムを作ることになり,USBカメラの動作確認をとりあえず行った.
www.eletech.work
USBカメラの動作確認では,fswebcamというパッケージをインストールして,ターミナルでコマンドを実行することで撮影を行ったが,最終的な畑監視システムのプログラムはpython3系で組もうと思っている.理由は,会社で信号処理などを行うときに使用しているのがpython3系だからというそれだけ.でも,この縛りのせいで結構ハマってしまった…

使用機器

使用する機器は以下の通り.

  • Raspberry Pi 2 model B
  • QuickCam Pro 4000


Raspberry Pi 2 Model B (1)

OpenCVのインストール

USBカメラをpythonで制御する上では,OpenCVを使用するのが良さそうだった.色んなWebページを見ていると,以下の二つのパッケージをインストールすれば良さそうであった.

pi@raspberrypi:~ $ sudo apt install libopencv-dev
pi@raspberrypi:~ $ sudo apt install python-opencv

がしかし,これでOpenCVをpython3プログラム上では"impot cv2"として呼び出すのだが,以下のようなエラーが出た.

ImportError: No module named 'cv2'

そうか,python3へインストール出来ていないからと思い,pip3で再度インストールする(pip3がインストールされていない場合はapt-getでまずpip3をインストールする).

pi@raspberrypi:~ $ sudo pip3 install opencv-python

すると,今度は何やらライブラリが足りないとのエラーが…

from .cv2 import *
ImportError: libcblas.so.3: cannot open shared object file: No such file or directory

ということで,libatlasに関するライブラリをインストール.

pi@raspberrypi:~ $ sudo apt install libatlas-base-dev

が,まだ不足のものがあるような感じのエラー.

mportError: libQtGui.so.4: cannot open shared object file: No such file or directory

なので,このQt関連のライブラリをまたまた追加でインストール.

pi@raspberrypi:~ $ sudo apt install libqt4-dev

と,私の場合はここまでインストールした時点でやっとこそエラーが消え,動作することができました.とりあえず私と同じような境遇の人は,pip3でOpenCVをインストールして,cv2をimportして出るライブラリの不足に関するエラーを一つずつ潰していくとゴールにたどり着けると思う.

python3でのテストプログラム

OpenCVをつかってpython3でUSBカメラを使用するプログラムは以下の通り.(cap.release()とcv2.destroyAllWindows()がないと,一回プログラムを実行したのち再度実行しようとすると何かしらのエラーでRaspberry Piを再起動しなければUSBカメラを使用できなくなることがあるので注意.少なくとも私はそうだった…)

import cv2

cap = cv2.VideoCapture(0)
r, img = cap.read()
cv2.imwrite('test.jpg', img)

cap.release()
cv2.destroyAllWindows()

で,これをターミナル上で実行.

pi@raspberrypi:~ $ sudo python3 farm_camera.py farm_camera

無事,私が最近好んで飲んでいるレモンティーの撮影に成功.

f:id:EleTECH:20190203222404p:plain
test.jpg
長い道のりであった…以前はUSBカメラではなくRaspberry Pi向けのPiCameraを使用したのでこんなややこしいことはなかったが,今回は本当にドハマりしてしまった…