kumilog.net

データ分析やプログラミングの話などを書いています。

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

インストールについては以下の記事が参考になりました。

ubuntuhandbook.org

動作確認

$ 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:いろいろ試していたので、これが本質的な解決策ではないかもしれません