OpenCV 4をRaspberry Piでビルドする

title

OpenCVという画像処理のライブラリを久しぶりに触っていました。Raspberry Piでは使わないだろうと思っていたのですが、動けば何かに使うかもしれないので動かしてみます。
レポジトリからインストールもできるようですが、最新版を使いたいので自分でビルドする練習をしてみます。すぐに忘れそうなのでシェルスクリプトにしておきました。


OpenCVをビルドする準備

今回は
Raspbian Stretch with desktop Version:November 2018に
OpenCV4.0.1を
ビルドしインストールします。
pythonのバージョンは3.5.3です。

16GB以上のSDメモリーカードを使う

OpenCVのビルドは多くのファイルを使います。SDメモリーカードは16GB以上のものを使います。8GBでは容量が足りません。
また、ランダムアクセス速度が速いSDカードを使いましょう。遅いSDカードではビルドがなかなか終わりません。
関連記事:SAMSUNGのmicroSD EVO PlusはRaspberry Pi用に丁度良いです

SAMSUNGのEVO Plusは価格も安く高速でお薦めです。
A1とかA2対応のものがより良さそうですが容量の大きなものしかありません。またAmazonが販売するものでないと安心して買えません。偽物が多いようですね。

OpenCV 4をビルドする

OpenCVをビルドする手順は次の通りです
  • 必要なライブラリをインストールする
  • OpenCVソースファイルを取得する
  • pythonの仮想環境を作る(python3)
  • cmakeでビルドの準備をする
  • swapサイズを2GBにする
  • OpenCVのビルドをする
  • OpenCVをインストールする
  • swapサイズを元に戻す
  • OpenCVのライブラリをpythonへリンクする

レポジトリの更新

レポジトリを更新します。
sudo apt update
sudo apt -y upgrade

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

ビルドに必要なライブラリをインストールします。
sudo apt-get install -y libjpeg-dev libpng-dev libtiff-dev
sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install -y libxvidcore-dev libx264-dev
sudo apt-get install -y libgtk-3-dev
sudo apt-get install -y libcanberra-gtk*
sudo apt-get install -y libatlas-base-dev gfortran

OpenCVソースの取得

OpenCVのソースファイルを取得します。
ソースファイルは~/Downloadsファイルに置きます。
cd ~/Downloads/

git clone --depth 1 --branch 4.0.1 https://github.com/opencv/opencv.git
git clone --depth 1 --branch 4.0.1 https://github.com/opencv/opencv_contrib.git
この記事公開時の最新バージョンは4.0.1でした。

python仮想環境の作成

pythonはバージョン2とバージョン3で仕様が大きく異なります。この区別が曖昧だとトラブルの元になるためどちらかのバージョンだけが動く仮想環境を作ります。ここではバージョン3を使います。
仮想環境を管理するツールを入れます。
sudo pip install virtualenv virtualenvwrapper
sudo pip3 install virtualenv virtualenvwrapper
~/.profileファイルを編集し次の文を追加します。
# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
仮想環境の名前をCVとして作ります。
source ~/.profile
mkvirtualenv cv -p python3
仮想環境CVへ入ります。
workon cv
仮想環境へnumpyをインストールします。
pip install numpy

ビルドの準備

ビルド用ディレクトリを作ります。
cd ~/Downloads/opencv
mkdir build
cd build
ビルド条件を設定します。
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/Downloads/opencv_contrib/modules \
-D ENABLE_NEON=ON \
-D ENABLE_VFPV3=ON \
-D BUILD_TESTS=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_EXAMPLES=OFF ..

swapファイルサイズの拡張

ビルドの最後で大量のメモリーを必要とします。swapファイルサイズを2GBへ拡張しておかないとビルドに失敗するでしょう。Raspberry Pi 3 Model Bの場合、使うswapファイルサイズは約1.5GBになります。
関連記事:Raspbianで外付けドライブへswapファイルを移動する正攻法
sudo dphys-swapfile swapoff
sudo dphys-swapfile uninstall
sudo sed -i.bak 's/^#\?\(CONF_SWAPSIZE=\).*/\12048/' /etc/dphys-swapfile
sudo dphys-swapfile setup
sudo dphys-swapfile swapon

ビルド

ビルドします。Raspberry Pi 3 Model Bの場合で3時間強かかりました。
make -j4
表示が100%になった所でまだ半分くらい完了です。ここからswapファイルがどんどん大きくなります。個別にコンパイルされたオブジェクトファイルを集めて最後に組み立てるのに大量のメモリが必要なようです。swapファイルを置くドライブの性能でビルドの完了する時間が大きく変わるでしょう。

OpenCVのインストール

sudo make install
sudo ldconfig

swapファイルサイズを元に戻す

swapファイルのサイズを100MBに戻します。
sudo dphys-swapfile swapoff
sudo dphys-swapfile uninstall
sudo sed -i 's/^#\?\(CONF_SWAPSIZE=\).*/\1100/' /etc/dphys-swapfile
sudo dphys-swapfile setup
sudo dphys-swapfile swapon

OpenCV共有オブジェクトのリンク

OpenCVの共有オブジェクトをリンクします。
cd ~/.virtualenvs/cv/lib/python3.5/site-packages/
ln -s /usr/local/lib/python3.5/site-packages/cv2/python-3.5/cv2.cpython-35m-arm-linux-gnueabihf.so cv2.so
cd ~

OpenCVサンプルを動かしてみる

OpenCVのサンプルを動かしてみます。
再起動後やターミナルを開き直した時は毎回次の手順でpython仮想環境へ入ります。
source ~/.profile
workon cv
サンプルディレクトリへ移動します。
cd ~/Downloads/opencv/sample/python
demo.pyを動かします。
python demo.py
こんなウインドウが表示されるでしょう。
demo.py
demo.pyの画面
左側にたくさんの機能デモが並んでいます。試しに何かを選んで右上の"Run"を押すとデモが始まるでしょう。すべてのデモが動くとは限りません。USBカメラをつながないと動かないデモもあります。
無事にデモが動けばOpenCVのビルドは成功です。

OpenCVビルドスクリプト

今回の手順のスクリプトを作りました。この記事公開時ではOpenCV 4.0.1とpython 3.5用になっています。バージョンが新しくなっている場合は適時スクリプトを修正してみてください。
OpenCV-4-build-script-on-Raspbian-Stretch | GitHub

使い方

スクリプトを~/Downloadsディレクトリにダウンロードし実行します。
cd ~/Downloads
git clone https://github.com/SignalFlagZ/OpenCV-4-build-script-on-Raspbian-Stretch.git
cd OpenCV-4-build-script-on-Raspbian-Stretch
./build-OpenCV.sh
4時間ほどして終わったら前節のサンプルを動かす手順で動作確認してください。

ビルドの様子

OpenCVのビルドはとても時間がかかります。フリーズしたのか?と不安になるでしょう。そこでビルドの様子をビデオにしてみました。参考にどうぞ。

まとめ

OpenCVのビルドは比較的簡単にできます。注意点は、SDメモリーカードは16GB以上、2GBほどへswapファイルの拡大が必要な事です。
Raspberry Piでやるには少し重すぎますね。今回はRaspberry Pi 3 Model Bでビルドしました。メモリーが1GB搭載されているので比較的速くビルドできるでしょう。RPi 2やRPi Zeroでは何時間かかってしまうのか・・・。

swapファイルはランダムアクセスの高速な外付けドライブへ置くと良いかもしれません。

今回使ったRPi 3Bには小さいヒートシンクを付けています。冷却が間に合わずビルド中に高温警告が表示されてしまいました。ヒートシンクにわずかでも風を当てれば警告は消えました。RPiを小さいケースに入れたままビルドするのは避けましょう。
--

コメント


  1. (´・ω・`)今月とんでもない事に気づきました

    Google+ のアルバム アーカイブ内の写真と動画は、2019 年 4 月 2 日以降に削除されます。



    (´・ω・`)bloogerからUPした画像、全部削除されちゃうって……

    返信削除
    返信
    1. ご無沙汰です! これとても判りにくいですよね。
      Google アルバム アーカイブの中にGoogle+のアルバムアーカイブやBloggerのアルバムアーカイブがあるようです。
      つまり、Google+のアルバムは消えるけどBloggerのアルバムは消えないと私は解釈してますけど・・・
      安全のためダウンロードしようかとも思いますが、bloggerのリンクを直すなんてやってられないですよね。

      削除
    2. ここを開くとGoogle+の”投稿した写真”とBloggerの”Bloggerの写真”は別のフォルダとして表示されていますよね。
      https://get.google.com/albumarchive/

      削除
    3. (´;ω;`)今まで一度も、Google+を利用して漫画を投稿した事がなかったから、気づきませんでした……
      別々になっている事……

      ( ´ ω ` )ありがとうございます

      削除

コメントを投稿

最近のコメント

Threaded Recent Comments will be here.