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からopencv
とopencv_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'