Raspberry Pi3でOpenCV3.4.6をビルドする

Raspberry Pi3でOpenCV3をソースからビルドする手順の備忘録

事前に必要な画像フォーマット関連のライブラリをインストールします。また、python用の開発パッケージやnumpyもインストールする。

sudo apt install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev 
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev 
sudo apt install libxvidcore-dev libx264-dev libgtk2.0-dev libatlas-base-dev gfortran
sudo apt install python3-dev python3-pip
sudo pip3 install numpy

追加(GStreamer)

> sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libv4l-dev
> cd /usr/include
> sudo ln -s libv4l1-videodev.h videodev.h

pythonの2系、3系を切り替えるpython仮想環境作成ツールをインストール

sudo pip3 install virtualenv virtualenvwrapper

bashrcファイルに以下を記載して反映

> vi ~/.bashrc
# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
source /usr/local/bin/virtualenvwrapper.sh

> source ~/.bashrc
  • virtualenvの使い方

mkvirtualenvで仮想名と実際に使用するpythonモジュールを指定する。作成後、自動的にその環境に切り替わる(プロンプトの前に仮想名が表示される)

> mkvirtualenv cv-python3 -p python3
(cv-python3) >

手動で切り替える場合は、workonコマンドのあとに定義名を指定する。

> workon cv-python3
(cv-python3) > python --version
Python 3.5.3

解除する場合は、deactivateコマンドを実行する

(cv-python3) > deactivate
> python --version
Python 2.7.13

とりあえずpython3に切り替えた状態で、numpyをインストールしておく。

> workon cv-python3
(cv-python3) > python --version
Python 3.5.3
(cv-python3) > pip install numpy --no-cache-dir

OpenCV3のソース入手とビルド

Githubからopencvopencv_contribの2つを取得する。opencv本体のフォルダ以下にbuildフォルダを作成する

> wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.6.zip
> wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.4.6.zip
> unzip opencv.zip
> unzip opencv_contrib.zip
> cd opencv
> mkdir build
> cd build

このあと、cmakeコマンドで、ビルド環境に合わせたMakefileが自動作成される。

ここで足りない環境がないかわかるが、ちょっとハマったことがあって、当初はpython3-devのインストールがされてない状態でcmakeを実行。python3用のモジュールが作成されなかったことが分かった後でpython3-devをインストールしたが、ビルドしてもモジュールが作成されなかった。

後でわかったことだが、cmakeを実行すると、ビルド環境をチェックしてどんなライブラリがあるのかをCMakeCache.txtにキャッシュする。その後にライブラリを追加してcmakeを実行してもキャッシュを優先してしまい、ライブラリがない状態でビルドが実行されてしまうことがわかった。

なので、ライブラリを追加した場合、CMakeCache.txtを削除してからcmakeを実行しないといけない。

cmake実行時のオプション

(cv-python3) > cmake -DCMAKE_BUILD_TYPE=Release \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.6/modules \
    -D ENABLE_VFPV3=ON \
    -D ENABLE_NEON=ON \
    -D BUILD_TESTS=OFF \
    -D WITH_TBB=OFF \
    -D WITH_FFMPEG=ON \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D OPENCV_SKIP_PYTHON_LOADER=ON \
    -D OPENCV_PYTHON3_INSTALL_PATH=/usr/local/lib/python3.7/dist-packages \
    -D OPENCV_GENERATE_PKGCONFIG=ON \
    -D BUILD_EXAMPLES=ON \
    -D WITH_V4L=OFF ..

注意)

上記でPi3やPi4ではうまくいきますが、PiZeroでは実行時にエラーになります。PiZeroで使う場合は、以下の2つのオプションをオフにします。

-D ENABLE_VFPV3=OFF \
-D ENABLE_NEON=OFF \

ちなみにラズパイゼロだと、上記オプションの場合、12時間でも終わらなかったです。
ビルド時間削減するのであれば、サンプルのビルドが大量にあるので、これらのオフが効果あります。

-D BUILD_EXAMPLES=OFF \

実行後、Makefileが作成されるときにどんなライブラリが検出されたかが出力される。Python3向けのライブラリも作成する場合は、以下のようにPython3の項目で、ファイルパスが以下のようになっていれば問題ないはずである。

-- 
--   Python 3:
--     Interpreter:                 /home/pi/.virtualenvs/cv-python3/bin/python3 (ver 3.5.3)
--     Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython3.5m.so (ver 3.5.3)
--     numpy:                       /home/pi/.virtualenvs/cv-python3/lib/python3.5/site-packages/numpy/core/include (ver 1.16.2)
--     install path:                /usr/local/lib/python3.5/dist-packages
-- 
--   Python (for build):            /home/pi/.virtualenvs/cv-python3/bin/python3
  • SWAPファイルサイズの拡大

ビルドの途中でメモリが足りなくなり、エラーになったりちっともコンパイルが終了しない可能性が高いので、あらかじめ仮想メモリを増やしておく。以下の設定の場合は2GBに増える。

> free -h
              total        used        free      shared  buff/cache   available
Mem:           367M         29M        307M        532K         31M        298M
Swap:           99M         20M         79M

> sudo vi /etc/dphys-swapfile
CONF_SWAPSIZE=2048

> sudo systemctl stop dphys-swapfile
> free -h
              total        used        free      shared  buff/cache   available
Mem:           367M         40M        288M        5.1M         38M        281M
Swap:            0B          0B          0B

> sudo systemctl start dphys-swapfile
>  free -h
              total        used        free      shared  buff/cache   available
Mem:           367M         40M        286M        5.1M         40M        280M
Swap:          2.0G          0B        2.0G

問題なければ、makeコマンドを実行する。マルチスレッドで実行すると処理が速くなるので、スレッド数4個で実行している。

make clean
make -j4

make installでインストールを完了させる。またldconfigを実行してライブラリのキャッシュを更新する。

> sudo make install
:
[ 80%] Building CXX object modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp.o

> sudo ldconfig

ちゃんとPython3でOpenCVが使えるかチェック

対話式で良いので、OpenCVモジュールをインポートした後に、cv2のバージョンチェックを行う。ここでエラーにならずにOpenCV3のバージョンが表示されれば、とりあえずインストールまではうまくいっていると思われる。

> python3
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.4.6'
-->