Ubuntu16.04にFFmpegとOpenCV3をインストールする
Pythonで動画を扱うためにFFmpegとOpenCVをインストールします。環境はUbuntu16.04です。
FFmpegのインストール
aptでFFmpegをインストールします。
$ sudo add-apt-repository ppa:jonathonf/ffmpeg-3
$ sudo apt update
$ sudo apt install ffmpeg libav-tools x264 x265
インストールについては以下の記事が参考になりました。
How to Install FFMPEG 3.1.3 in Ubuntu 16.04 via PPA | UbuntuHandbook
動作確認
$ ffmpeg -version
バージョン確認のオプションは-vでも--versionでもなく-versionです。
OpenCVのインストール
公式のインストールガイドを参考にしながら、インストールします。
準備
依存関係のパッケージをインストールします。
$ sudo apt install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
Pythonの関連パッケージをインストールします。
$ sudo apt install python-dev python-numpy python3-dev python3-numpy
Githubからソースをダウンロードします。
$ wget https://github.com/opencv/opencv/archive/3.3.0.zip
$ unzip 3.3.0.zip
$ cd opencv-3.3.0
$ mkdir build
$ cd build
設定ファイル作成(Configuring)
cmakeを実行し設定ファイルを生成します。ここでオプションを指定します。ffmpegを使うので、オプションに-D WITH_FFMPEG=ONを加えます。
$ cmake -D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_TBB=ON \
-D WITH_FFMPEG=ON \
-D PYTHON_EXECUTABLE=/usr/bin/python3 ..
WITH_TBBは並列処理を行うライブラリです。WITH_FFMPEG=ONと指定しても対応するライブラリが存在しなければ、有効になりません(エラーは出ませんでした)。cmakeが終わったときに表示されるVideo I/OのFFMPEGの項目がYESになっているか確認してください。
-- Video I/O:
-- DC1394 1.x: NO
-- DC1394 2.x: NO
-- FFMPEG: YES
-- avcodec: YES (ver 57.89.100)
-- avformat: YES (ver 57.71.100)
-- avutil: YES (ver 55.58.100)
-- swscale: YES (ver 4.6.100)
-- avresample: NO
Python3のLibrariesにパスが記載されていることを確認してください。おそらくLibrariesの欄がNOになっていると、cv2.soが生成されません。他の欄もNOになっていない方が良いと思います。
-- Python 3:
-- Interpreter: /usr/bin/python3 (ver 3.5.2)
-- Libraries: /usr/lib/x86_64-linux-gnu/libpython3.5m.so (ver 3.5.2)
-- numpy: /usr/lib/python3/dist-packages/numpy/core/include (ver 1.11.0)
-- packages path: lib/python3.5/dist-packages
--
-- Python (for build): /usr/bin/python3
NOになっている場合、export PYTHON_LIBRARYS=xxx やcmakeのオプションで-D PYTHON_LIBRARYS=xxxのように指定すると解決する説明をいくつか見かけたので、試してみましたがうまく行きませんでした。
$ sudo apt install python3-dev python3-numpy
のようにpythonの関連ライブラリをaptでインストールすると解決しました*1。
ビルド
cmake完了後は、makeコマンドでビルドします。環境に応じて、並列処理数のjオプションの数字を変更してください。makeはかなり時間がかかります。6コアの仮想マシンで50分くらいかかりました。
$ make -j7
$ sudo make install
$ sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
$ sudo ldconfig
Pyhonで確認
エラーがでなければOKです。
$ python
>>> import cv2
また、cv2.soはpackages pathに記載されているところごbuildフォルダにインストールされますが、python3でビルドすると、cv2.soという名前ではなくcv2.cpython-35m-x86_64-linux-gnu.soという名前のファイルが生成されます。
$ sudo find / -name 'cv2.cpython-35m-x86_64-linux-gnu.so'
/usr/local/lib/python3.5/dist-packages/cv2.cpython-35m-x86_64-linux-gnu.so
/home/user/opencv-3.3.0/build/modules/python3/CMakeFiles/CMakeRelink.dir/cv2.cpython-35m-x86_64-linux-gnu.so
/home/user/opencv-3.3.0/build/lib/python3/cv2.cpython-35m-x86_64-linux-gnu.so
インストールのポイント
何回かcmakeとmakeを繰り返した結果、以下がポイントかなと思います。
- pyenvなどの仮想環境は使わない方が無難
- できなくはないと思いますが、パスの指定が難しい
- aptで
python-devとかpython-numpyをいれる - python3で使う場合は、python3でビルドする
- cmakeした後に出力されるメッセージが重要
- pythonでopencvを使う場合は、pythonの項目を確認する
- ffmpegを使う場合は、Video I/OのFFMPEGの項目を確認する
- オプションを変えたりして、cmakeをやり直す場合は
CMakeCache.txtを削除してキャッシュを消す
*1:いろいろ試していたので、これが本質的な解決策ではないかもしれません