Raspberry Pi に Opencv3.4をinstallしてみた

## はじめに
[Raspberry Pi に Python3.6をinstallしてみた](https://qiita.com/satsukiya/items/581ffdc6f4dcef650835) の続きです。
Raspberry Pi に OpenCVをinstallしました。

後々で動画を保存する機能のみ使うので必要最低限のbuildをしています。

## 方法

### ⑴ 必要なパッケージをインストール
```
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
```

### ⑵ opecv をdownload
```
wget https://github.com/opencv/opencv/archive/3.4.3.zip
unzip 3.4.3.zip
cd ./opencv-3.4.3
```
### ⑶ opecv をinstall
```
$ mkdir build
$ cd build

$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_OPENCL=OFF -D WITH_CUDA=OFF -D BUILD_opencv_gpu=OFF \ 
-D BUILD_opencv_gpuarithm=OFF -D BUILD_opencv_gpubgsegm=OFF \ 
-D BUILD_opencv_gpucodec=OFF -D BUILD_opencv_gpufeatures2d=OFF \ 
-D BUILD_opencv_gpufilters=OFF -D BUILD_opencv_gpuimgproc=OFF \ 
-D BUILD_opencv_gpulegacy=OFF -D BUILD_opencv_gpuoptflow=OFF \ 
-D BUILD_opencv_gpustereo=OFF -D BUILD_opencv_gpuwarping=OFF \ 
-D BUILD_DOCS=OFF -D BUILD_TESTS=OFF \ 
-D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF \ 
-D BUILD_opencv_python3=ON -D FORCE_VTK=ON \ 
-D WITH_TBB=ON -D WITH_V4L=ON \ 
-D WITH_OPENGL=ON -D WITH_CUBLAS=ON \ 
-D WITH_FFMPEG=ON ..

$ sudo make -j 4
$ sudo install
$ sudo ldconfig
```

なぜこんなにコマンドが長いですが、sample codeやGPUの設定をoffにして必要のないlibファイルを作成しないようにするためです。(詳細は[Install OpenCV-Python in Fedora](https://docs.opencv.org/3.4.1/dd/dd5/tutorial_py_setup_in_fedora.html):Configuring and Installing)

で、pythonベースで`cv2.VideoCapture(0)`を使って動画を起動して、avi形式で保存するappを作成を考えています。そのため、`-D BUILD_opencv_python3=ON -D WITH_FFMPEG=ON` のフラグが必須です。 ないと、画像（静止画）の保存はできますが動画再生はできないです。


#### もしmakeが進まないと思ったら。。。
また、このまま `make` すると `opencv_python3`のlibファイル生成時にロード中のままで止まってしまいます。解消法としてはRaspberryPi自体のswap領域を拡張することです。

```:ページを開く
$ sudo vim /etc/dphys-swapfile
```

```:dphys-swapfile
# set size to absolute value, leaving empty (default) then uses computed value
#   you most likely don't want this, unless you have an special disk situation
# 1024~2048 に数値変更
CONF_SWAPSIZE=1024
```

```:swap領域を更新
$ sudo systemctl stop dphys-swapfile
$ sudo systemctl start dphys-swapfile
```

```:swap領域を確認
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           874M        147M        139M         25M        588M        643M
Swap:          1.0G        1.0M        1.0G
```

### ⑷ numpyをインストール

```
$ sudo pip3 install numpy
```

### (5) 確認

```
$ python3
Python 3.6.8 (default, Jun 17 2019, 16:55:54) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> import cv2
>>> cv2.__version__
'3.4.6'
>>> 
```


## おわりに
(3) で cmakeするときの設定ですが、raspberrypiの環境と自分の使いたい機能を確認してから`-D XXX`
とセットすると良いです。今使っているmicroSDの容量が16GBしかないので、何もしないと要らない機能までlibファイルが作成されるのですぐにfullfull:ice_cream:になってしまいます。

## reference
[Required Packages](https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html)
[Raspberry Pi CameraモジュールとOpenCVで人間の顔を認識する](https://qiita.com/hidakanoko/items/3f2f6ae9b5af2b06eec6)
[Installing OpenCV 3.4.3 on Raspberry Pi 3 Model B+](https://www.alatortsev.com/2018/09/05/installing-opencv-3-4-3-on-raspberry-pi-3-b/)
[OpenCVのVideo Writerではきだした動画が再生できない。Ubuntu環境です。](https://teratail.com/questions/135559)
[ラズパイにOpenCVをインストールした時に困った事とその解決策](https://qiita.com/sawamura_np/items/2b24cdbe8f5b0dec3b5d)
[ラズパイ（Raspbian Jessie）とスワップメモリ容量の変更（環境設定の続き）](https://a244.hateblo.jp/entry/2016/12/12/010429)