OpenCV
RaspberryPi

ラズパイにOpenCVをインストールする方法

はじめに

Raspberry Piで動画撮影をして色々したいく、様々な参考書を参考にさせていただきました。
多くはmotionやfswebcamをなどの僕があまり親しみのないツールだったため、OpenCVを導入することにしました。
今回はその一連の流れを書き留めておきます。

環境

Raspberry Pi 3 Model B
OS:Rasbian 9.1
Python Version:2.7 & 3.4
OpenCV Version:3.1.0

インストール

今回はこちらのサイトを和訳しながら、躓いたところを重点的に書いていこうと思います。

File System Expansion

Raspberry Piを普通に導入すると、micro SDの容量のすべてを利用できるようになっていないとのことでストレージの領域を拡張します。

CLIに入り、以下のコマンドでRaspberry Piの設定画面に映ります。

sudo raspi-config

参考サイトとは異なり、「Expand Filesystem」が見当たりませんでした。
実際には「Advanced Options」の中に「Expand Filesystem」がありました。
さらに進んでみると以下のように表示されました。

Your partition layout is not currently supported by this tool. You are probably using NOOBS, in which case your root filesystem is already expanded anyway.

僕の場合はFilesystem Expansionはサポートされておらず、しかもNOOBSを使ってインストールしたのならばExpansion済みですとのこと。
NOOBSのバージョンの更新で最初からExpansionされてくれてるみたいです。

実際にExpansionできてるかどうかは以下のコマンドを入力すると、ファイルシステムが表示されるため、確認できます。

df -h

もしExpansionできていない人がいたら、その場合はExapansion後に以下のスクリプトで再起動してください。。

sudo reboot

Install dependencies

次にOpenCVをインストールするために必要な依存関係のパッケージをインストールしていきます。

まずは既に入っているパッケージを更新しておきます(お決まりのやつです)。

sudo apt-get update
sudo apt-get upgrade

ここから結構な数のパッケージをインストールします。
基本的にapt-getでインストールするため、すべてをまとめて記述してインストールすることも可能です。
しかし、よくわからないままインストールするのもなんなので、参考サイト通りに中身を理解しながら小分けにしてインストールします。
こうすることで、どこかでパッケージのインストールに失敗していた時の見逃しが減ったりするという副産物もあります。

まずcmake関連のツールのインストール。今回はcmakeでOpenCVでビルドします。Ubuntu OSではよくAnacondaを導入してcondaを使用してmenpoからビルド済みのOpenCVをインストールしているのをよく見かけますが、僕はなんでも自分でやってみたい病なのでビルドします(笑)

sudo apt-get install build-essential cmake pkg-config

次に画像の入出力をするためのパッケージをインストールをします。JPEGやPNGなどの拡張子に対応するためです。

sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev

その次に動画の入出力をするためのパッケージをインストールします。
(v4lの最後の一文字は「1(いち)」ではなく「l(エル)」ですので注意。v4lはVideo for Linuxという意味らしい)

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264

次にOpenCVのhighguiモジュールに必要なライブラリであるGTKをインストールします。

sudo apt-get install libgtk2.0-dev

OpenCV内部で行われる行列演算などを最適化するためのパッケージをインストールします(ここらへんはあまり詳しくないです、、、)。

sudo apt-get install libatlas-base-dev gfortran

最後にPython 2.7とPython 3のヘッダファイルをインストールします。

sudo apt-get install python2.7-dev python3-dev

Download the OpenCV source code

ビルドするOpenCVのソースコードのzipをダウンロードして解凍します。
引数の「-O」は「0(ぜろ)」ではなく「O(オー)」なので注意してください。

wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip
unzip opencv.zip

次にSIFTやSURFなどの追加の機能を使用するため以下のopencv_contribをダウンロードします。

wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
unzip opencv_contrib

これで実行していたディレクトリ内にopencv-3.1.0とopencv_contrib-3.1.0が解凍されました。
ちなみに筆者はフォルダがごちゃごちゃするのが嫌いなので「/home/username/Library/opencv」を作り、そこに解凍しています。

Python 2.7 or Python 3?

Pythonのパッケージマネージャであるpipを先にインストールします。

wget https://bootstrap.pypa.io/get-pip.py

Python 2.7でインストールしたい場合は下のスクリプトのうち上の行を、Python 3でインストールしたい場合はしたの行を書いてください。
僕の場合はどちらもpipは最新だったようで特に何も起こりませんでした。

sudo python get-pip.py
sudo python3 get-pip.py

ここから少し重要な話になりますが、Pythonでよく問題になっているのはバージョンの管理です。最近Deep Learningが流行っており、様々なフレームワークが開発されています。
しかし、ここで面倒なのが、各フレームワークごとに依存関係のパッケージのバージョンが異なることです。
そこで独立した仮想環境を作り、そこの中で環境構築することでバージョンの衝突を避けることができます。
そのために導入するのがvirtualenvです。
Python環境管理は他にもpyenvやAnaconda(Raspberry Piの場合はMinicondaしか入りません)などがあります。
今回は参考サイトに従って、virtualenvを選択しました。

まずvirtualenvとvirtualenvwrapperをインストールします。
下のスクリプトの2行目についてですが、僕の場合は、pipのcacheは存在していませんでした。

sudo pip install virtualenv virtualenvwrapper
sudo rm -rf ~/.cache/pip

次にパスを通します。
nanoやvimなどの自分の好きなテキストエディタを用いて、~/.bashrcを開きます。(ちなみに「~」は「/home/username」という意味です)
そして以下を一番下に書きます。

# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

次に~/.bashrcを実行します。

source ~/.bashrc

ここで再起動しなくてもうまくいくことが多いですが、再起動しておきます。

sudo reboot

次に実際に仮想環境を作っていきます。
先程と同様にPython 2でやりたい人は上の行、Python 3でやりたい人は下の行を実行します。

mkvirtualenv cv-python2 -p python2
mkvirtualenv cv-python3 -p python3

virtualenvの使い方の少し下の部分に書いてありますので、そちらを参照してください。

作ったvirtualenvの環境に入り、次に行列演算を得意とするライブラリのnumpyをインストールします。

pip install numpy

virtualenvの使い方

ここで簡単にvirtualenvの使い方を書いておきます。
知ってる人やどうでもいい人は読み飛ばしてください。

環境の作成

envnameを自分の好きな名前に変えてください。-pのあとはpython2もしくはpython3を記述することでpythonのバージョンを指定できます。

mkvirtualenv envname -p python2

環境の有効化

作った環境に入るには以下のようにします。

workon envname

環境に入ったのに成功すると以下のような表示になります。

(envname) pi@raspberrypi:~ $ 

環境の停止

環境から抜け出すには以下のようにします。

deactivate

環境の削除

作った環境を完全に削除するには

rmvirtualenv envname

Compile and Install OpenCV

ようやくcompileするところまでやってきました。
最後の山場です。

まず仮想環境を有効化します(ここでは先程作ったPython 2の仮想環境であるcv-python2を使用します)。

workon cv-python2

次にOpenCVを解凍したディレクトリ(今回は「/home/username/Library/opencv」に解凍してあります)に移動し、以下のようにビルドの設定をします。
最後の行の一番最後に「..」を書くのを忘れないでください。

cd opencv-3.1.0
mkdir build-python2
cd build-python2
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=/home/username/Library/opencv/opencv_contrib-3.1.0/modules -D BUILD_EXAMPLES=ON -D WITH_FFMPEG=ON -D ENABLE_PRECOMPILED_HEADERS=OFF ..

ここで最後の行についてです。参考サイトでは「WITH_FFMPEG」と「ENABLE_PRECOMPILED_HEADERS」の部分はありませんでした。
「WITH_FFMPEG」については、今回は動画を使いたかったため必ず認識してくれよという願いを込めて書いています。
「ENABLE_PRECOMPILED_HEADERS」については、makeの途中で以下のようなエラーが出ました。

fatal error: stdlib.h: No such file or directory
#include <stdlib.h>

そこでこちらのサイトを参考に加えさせていただきました。

そして次にビルドします。
(Raspberry Pi 3は4コアらしいので「-j4」を加えています。心配な人は消してください)

make -j4

上手くいくと最後にこんなのが書いてあります。

次にインストールを行います。

sudo make install

次に共有ライブラリの更新を行います。

sudo ldconfig

Finish installing OpenCV on your Rasberry Pi

いよいよ最後になります。

Python 2の場合

まずは共有ライブラリにcv2.soというOpenCVが入っているかを確認しておきます。
下記のコマンドを実行すると確かにcv2.soが存在しているのを確認できます。
(場合によってはdist-packagesの方に入っていることもあるそうです。)

ls -l /usr/local/lib/python2.7/site-packages/

次に共有ライブラリから仮想環境の共有ライブラリフォルダにリンクを作成します。
(先程は「ls」でしたが、「ln」ですので注意してください。)

cd ~/.virtualenvs/cv-python2/lib/python2.7/site-packages/
ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so

Python 3の場合

まずは共有ライブラリにOpenCVが入っているかを確認しておきます。
下記のコマンドを実行すると確かにcv2.cpython-34m.soが存在しているのを確認できます。
(場合によってはdist-packagesの方に入っていることもあるそうです。)

ls -l /usr/local/lib/python2.7/site-packages/

cv2.cpython-34m-arm-linux-gnueabihf.soという名前をPython 2にそろえるためにcv2.soに変更しておきます。

cd /usr/local/lib/python3.4/site-packages/
sudo mv cv2.cpython-34m-arm-linux-gnueabihf.so cv2.so

次に共有ライブラリから仮想環境の共有ライブラリフォルダにリンクを作成します。
(先程は「ls」でしたが、「ln」ですので注意してください。)

cd ~/.virtualenvs/cv-python3/lib/python3.4/site-packages/
ln -s /usr/local/lib/python3.4/site-packages/cv2.so cv2.so

テスト

本当に入っているかの確認を行います。
まずCLIを閉じて、以下を実行します。

source ~/.bashrc

次に仮想環境に入り、cv2がインポートできるか確認します。

workon cv-python2
python
>>> import cv2
>>> cv2.__version___
>>>

これで何もエラーが出なければ無事にインストールできています。

ちなみにWebカメラから動画を取得するためのコードも以下に貼っておきます。

import cv2

def camera_capture():
  cap = cv2.VideoCapture(0)

  while True:
    ret, frame = cap.read()

    cv2.imshow('camera capture', frame)

    key = cv2.waitKey(1)
    if key == 27:
      break

  cap.release()
  cv2.destroyAllWindows()

if __name__=='__main__':
  camera_capture()

これまで長かったですが、読んでくださりありがとうございました。

参考文献