AmazonLinux2にPython3+OpenCV3+ffmpegをインストールし、動画像処理を行えるようにする。


# 背景
EC2（Amazon Linux 2 t2.medium）で動画像処理を行うために、Python3とOpenCV3とffmpegをインストールしようとしたが、あまりに時間がかかってしまったのでまとめる。

ffmpegはOpenCVで動画を扱うために必要なモジュール。これがなくてもOpenCVはインストールできてしまうが、動画を処理したい時には一切使えなくなってしまう。

今回はPython3.6.5をインストールしたが、他のバージョンを使うときは、いくつか修正が必要になってしまうので注意。


主に以下の記事を参考にした。（※この記事がなければ動画像処理をすることはできませんでした。本当にありがとうございました。）

https://qiita.com/sarumonera/items/ab661b378f5a47c1f282


# 各ライブラリをインストールする

## 前準備
```
sudo yum -y upgrade
```

## 必要なパッケージをyumでインストール

```
sudo yum install -y git gcc bzip2 bzip2-devel openssl openssl-devel readline readline-devel sqlite-devel
```

## pyenvのインストール
```
cd /usr/local/src
sudo git clone --depth 1 git://github.com/yyuu/pyenv.git ./pyenv
echo 'export PYENV_ROOT="/usr/local/src/pyenv"' | sudo tee -a /etc/profile.d/pyenv.sh
echo 'export PATH="${PYENV_ROOT}/shims:${PYENV_ROOT}/bin:${PATH}"' | sudo tee -a /etc/profile.d/pyenv.sh
source /etc/profile.d/pyenv.sh
```
インストールできたか確認

```
pyenv --version
```
## PATHの設定変更
vimの使用方法はこちら --- https://qiita.com/hide/items/5bfe5b322872c61a6896

```
sudo visudo
```

```Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin```を探して、secure_pathをコメントアウトし、env_keepを追加（見つけにくいけどどこかにあるはず！）

```
# Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults    env_keep += "PATH"
Defaults    env_keep += "PYENV_ROOT"
```
## Python3.6.5をインストール
他のバージョンが良ければそれに合わせて変更する。（後のcmakeのオプションも変える必要が出てくる）

```
sudo env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.5
sudo pyenv global 3.6.5
```
インストールできたか確認

```
python --version
```

## ffmpegをインストール
ffmpegをインストールするには前もって入れておかなければいけないものがいくつかあるため、頑張ってインストールしていく
### yumで入るライブラリを入れる

```
sudo yum install -y autoconf automake gcc-c++ libtool wget nasm libtheora-devel
sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo yum install -y yasm openal-devel
```

### nasmのアップデート
これをしなければ次のX264をインストールできなかった

```
sudo curl -LO https://www.nasm.us/pub/nasm/releasebuilds/2.13.01/nasm-2.13.01.tar.gz
sudo tar xzvf nasm-2.13.01.tar.gz 
cd nasm-2.13.01
sudo ./configure --prefix=/opt/nasm
sudo make
sudo make install
export PATH=/opt/nasm/bin/:$PATH
```
### X264をインストール
```
cd /usr/local/src
sudo git clone --depth 1 https://code.videolan.org/videolan/x264.git
cd x264
sudo ./configure --enable-shared
sudo make
sudo make install
```

### fdk-aacをインストール
```
cd /usr/local/src
sudo git clone --depth 1 git://github.com/mstorsjo/fdk-aac.git
cd fdk-aac
sudo autoreconf -fiv
sudo ./configure
sudo make
sudo make install
export LD_LIBRARY_PATH=/usr/local/lib
export LD_RUN_PATH=$LD_LIBRARY_PATH
```

### lameをインストール
```
cd /usr/local/src
sudo wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
sudo tar zxvf lame-3.99.5.tar.gz
sudo mv lame-3.99.5 lame
cd lame
sudo ./configure --enable-nasm
sudo make
sudo make install
```

### xvidをインストール
```
cd /usr/local/src
sudo wget http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz
sudo tar xzvf xvidcore-1.3.2.tar.gz
sudo chown -R root:root xvidcore
cd xvidcore/build/generic/
sudo ./configure
sudo make
sudo make install
```

### ffmpegをインストール
```sudo make -j2```の最後の数字は、処理に当てるCPUのコア数を表しているため、自分のマシンの性能に合わせて変更する

```
cd /usr/local/src
sudo git clone --depth 1 git://source.ffmpeg.org/ffmpeg.git
cd ffmpeg
sudo ./configure --arch=x86_64 --enable-gpl --enable-libmp3lame --enable-libtheora --enable-libx264 --enable-nonfree --disable-static --enable-shared --enable-version3 --enable-zlib --enable-pthreads
sudo make -j2
sudo make install
```
下記のパスを追加しておく。

```
echo 'export LD_LIBRARY_PATH=/usr/local/lib' | sudo tee -a /etc/profile.d/ffmpeg.sh
echo 'export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig' | sudo tee -a /etc/profile.d/ffmpeg.sh
source /etc/profile.d/ffmpeg.sh
sudo sh -c "echo /usr/local/lib >> /etc/ld.so.conf.d/ffmpeg.conf"
sudo ldconfig
```

## OpenCV3をインストール

### yumで必要なライブラリをインストールする
```
sudo sh -c "yum install -y opencv && yum remove -y opencv"
sudo yum install -y cmake libjpeg-devel libtiff-devel libpng-devel jasper-devel 
```
### pipでnumpyをインストールする
```
sudo pip install --upgrade pip
sudo pip install numpy
```
### OpenCV3のインストール
```
cd /usr/local/src
sudo wget https://github.com/Itseez/opencv/archive/3.1.0.zip
sudo wget https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
sudo unzip 3.1.0.zip\*
cd opencv-3.1.0
sudo mkdir build
cd build
```
cmakeのオプションを各自の環境に合わせて変更しなければならない。make中にエラーが多発するが、主にここを変更すれば直る。

```
sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D BUILD_opencv_python3=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D PYTHON_EXECUTABLE=$(which python) \
-D PYTHON3_EXECUTABLE=$(which python) \
-D PYTHON3_INCLUDE_DIR=/usr/local/src/pyenv/versions/3.6.5/include/python3.6m \
-D PYTHON3_PACKAGES_PATH=/usr/local/src/pyenv/versions/3.6.5/lib/python3.6/site-packages \
-D PYTHON3_INCLUDE_PATH=/usr/local/src/pyenv/versions/3.6.5/include/python3.6m \
-D PYTHON3_INCLUDE_DIR=/usr/local/src/pyenv/versions/3.6.5/include/python3.6m \
-D PYTHON3_INCLUDE_DIRS2=/usr/local/src/pyenv/versions/3.6.5/include/python3.6m \
-D PYTHON3_LIBRARY=/usr/local/src/pyenv/versions/3.6.5/lib/libpython3.6m.so \
-D OPENCV_EXTRA_MODULES_PATH=/usr/local/src/opencv_contrib-3.1.0/modules \
-DENABLE_PRECOMPILED_HEADERS=OFF \
-DCMAKE_POSITION_INDEPENDENT_CODE=ON ..
```

### ffmpegのエラー対応
build中にffmpegに関するエラーが出るので、以下の記事を参考にして修正する
https://stackoverflow.com/questions/46884682/error-in-building-opencv-with-ffmpeg

```
sudo vim /usr/local/src/opencv-3.1.0/modules/videoio/src/cap_ffmpeg_impl.hpp
```
上の方のいい感じのところに#も含めてコピペする

```
#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020
```
makeする。ここもCPUのコア数に合わせて-jに続く数字を変更する。かなり時間がかかる。

```
sudo make -j2
```

### make中のエラー対応
エラーがよく出るが、rootユーザーで実行すると基本的に上手くいく。

```
sudo su
cd /usr/local/src/opencv-3.1.0/build
cmake ..
make -j2
make install
```

### その他のエラー

#### Pythonのパスが間違っている

```
fatal error: Python.h: No such file or directory
```
もし上のようなエラーが出ると、cmakeの時に設定したパスが間違っているため、 https://eigo.rumisunheart.com/2018/06/06/post-9479/ を参考に、cmakeのオプションを変更する

#### make中に色々変更しすぎて訳がわからなくなった

以下のコマンドを実行して、cmakeのキャッシュを削除すれば一からやり直せる。

```
sudo rm CMakeCache.txt
```