ラズパイ(Raspberry Pi)へOpenCVをインストールして画像解析する

今回はラズパイへ画像認識ライブラリのOpenCvをインストールし、画像処理を行います。
○開発環境○
プログラミング言語:Python 3.6
使ったラズパイのモデル:Raspberry Pi 3 Model b+ ラズベリーパイ 3 b
※Python 3.7系は動作が不安定なので、6系をお勧めします
なお、Pythonはpvenvを利用してインストールしています。
インストールパスは以下
/home/pi/.pyenv/shims/python
PvenvとPythonのインストール方法は以下
ラズパイ(Raspberry Pi)へPyenvでPython3をインスールする
目次
1:OpenCVとは
インテルが開発したオープンソースの画像解析ライブラリになります。
これを利用して画像から人物判定を行ったり、画像にモザイクをかけるなど様々な機能が搭載されています。
様々なプログラミング言語で利用可能ですが
今回はこちらをPython3を利用し、OpenCVの有名なテスト画像lenaを利用します。具体的には以下の事を行います
2:OpenCVのサンプルコードを利用して、顔の画像に枠を設定する
ラズパイへOpenCVをダウンロードすると以下と同様のサンプル画像もダウンロードされます。
これにOpenCvで処理を加えると
上記のように顔の部分に枠が設定され、顔認識されます
勿論自分で用意した画像や動画に同様の処理を加える事も可能です。
サンプル画像はlena(レナ)と呼ばれ、意図せず世界的な有名人になったみたいです。
3:OpenCVをラズパイにインストールする
pythonのライブラリで
opencv-python
という物があるのですが、こちらはOpenCV非公式のライブラリです。
ざっくり試すにはopencv-pythonの方がいいですが、あくまで非公式ツールです。
その為公式サイトからのOpenCVをダウンロードしてビルドする方法を記載していますが、 公式ファイルが重いので、インストールに1時間かかります。
中断しても、再開したら中断地点からダウンロードが開始されますいずれにしても時間がある時にインストールした方がいいです
手順はこちらの記事を参考にしました。
上記を元につまづいたところに解説を付記します
ホームディレクトリでパッケージ管理システムをアップデート
cd ~ sudo apt-get update sudo apt-get upgrade
各種ライブラリのインストール
sudo apt-get install build-essential cmake unzip pkg-config sudo apt-get install libjpeg-dev libpng-dev libtiff-dev sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev sudo apt-get install libxvidcore-dev libx264-dev sudo apt-get install libgtk-3-dev sudo apt-get install libatlas-base-dev gfortran sudo apt-get install python3-dev
4:OpenCVを公式からダウンロード
バージョン3.4.3をwgetでダウンロード
wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.3.zip
モジュールをダウンロード
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.4.3.zip
ファイルを解凍
unzip opencv.zip unzip opencv_contrib.zip
PythonへpipとNumPyをインストール
sudo apt-get install python3-pip
numpyをインストール(5分くらいかかります)
pip3 install numpy
installと表記されて、画面が進まない事がありますが、問題ありません。そのままお待ち下さい
5:OpenCVのビルドを行います。
cd ~/opencv-3.4.3/ mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D INSTALL_C_EXAMPLES=OFF \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.3/modules \ -D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \ -D BUILD_EXAMPLES=ON ..
6:OpenCVのコンパイル
makeでコンパイルしますが、1時間以上かかります。 2回ほど途中で中断しましたが、中断しても続きからコンパイルされます。
make -j4
OpenCVをインストールする
sudo make install sudo ldconfig
以下コマンドでOpenCVがインストールされたか確認
pkg-config --modversion opencv 3.4.3
pythonのパッケージとして、インストールされているか確認
ls /usr/local/lib/python3.6/site-packages/ cv2.cpython-36m-x86_64-linux-gnu.so
名称変更
cd /usr/local/lib/python3.6/site-packages/ sudo mv cv2.cpython-36m-x86_64-linux-gnu.so cv2.so
pyenvを利用している場合はpyenv配下のsite-packagesへ移動
sudo mv cv2.so /home/pi/.pyenv/versions/3.6.0/lib/python3.6/site-packages
pythonコマンドで動作確認
python3 >> import cv2 >> cv2.__version__
7:PythonでOpenCVを利用する際のサンプルコード
以下が全コードです
import cv2 import numpy as np faceCascade = cv2.CascadeClassifier('opencv-3.4.3/data/haarcascades_cuda/haarcascade_frontalface_alt.xml') img = cv2.imread('topencv-3.4.3/samples/data/lena.jpg', cv2.IMREAD_COLOR) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) face = faceCascade.detectMultiScale(gray, 1.1, 3) if len(face) > 0: for rect in face: cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 0,255), thickness=2) else: print( "no face" ) cv2.imwrite('detected.jpg', img)
コードは以下の内容を参考にしています。
サンプル画像を調べるには、以下のコマンドでパスを確認します
find opencv-3.4.3 -name lena.jpg opencv-3.4.3/doc/js_tutorials/js_assets/lena.jpg opencv-3.4.3/samples/data/lena.jpg
カスケードファイルについても指定を誤るとエラーになります 以下コマンドでパスを確認できます。
find opencv-3.4.3 -name haarcascade_frontalface_alt.xml
function 'cvtColor'
画像パスの指定が間違っている 画像ファイル名の名前の指定が誤っています。
error: (-215:Assertion failed) !empty() in function 'detectMultiScale'
detectMultiScale
カスケードファイルのパス指定が間違っている。
error: (-215:Assertion failed) !empty() in function 'detectMultiScale'
findコマンドでカスケードファイルのパスを確認
find opencv-3.4.3 -name haarcascade_frontalface_alt.xml opencv-3.4.3/data/haarcascades_cuda/haarcascade_frontalface_alt.xml opencv-3.4.3/data/haarcascades/haarcascade_frontalface_alt.xml opencv-3.4.3/samples/winrt_universal/VideoCaptureXAML/video_capture_xaml/video_capture_xaml.Windows/Assets/haarcascade_frontalface_alt.xml opencv-3.4.3/samples/winrt/FaceDetection/FaceDetection/Assets/haarcascade_frontalface_alt.xml
上記で出力されたパスを相対かフルパスで指定すれば解決します。
関連書籍
OpenCVで詳細な処理を行う場合は以下のような書籍がお勧めです
以上になります。
ラズパイへカメラを接続すれば、ご自身で撮影した写真を解析する事も可能です。詳細は以下から御覧ください
ラズパイ(Raspberry Pi) 3 Model b+でカメラを操作する
ラズパイ(Raspberry Pi) 3 Model b+で人感センサーで監視カメラを作成する
画像をアップロードする際は以下
ラズパイ(Raspberry Pi) +Python3でS3のバケットへファイルを一括アップロードする
その他関連記事
AWS S3コマンドでS3のバケットにzipファイルを転送する
BeautifulSoupとpython3を利用し、画像をスクレイピングしてローカルに保存する
Python3でDjangoをインストールし、HellowWoldを表示する
エンジニア転職で転職エージェントを使った方が良い人|使わなくて良い人
Djangoでページを追加し表示する|初心者・独学者向け入門コンテンツ
Python3.7をインスールすると No module named '_ctypes'
というエラーになる