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
インストールについては以下の記事が参考になりました。
動作確認
$ 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:いろいろ試していたので、これが本質的な解決策ではないかもしれません