RaspberryPi: OpenCV 3.4.5/4.0.1のビルド手順

[ラズパイ向け OpenCVのdebパッケージを作成・公開してます](https://qiita.com/mt08/items/e8e8e728cf106ac83218)が、この記事は、自分でビルドしたい方向けの手順です。

# 環境
- Raspberry Pi: 3B+ / 3B / 2B
- Raspbian: `2018-11-13-raspbian-stretch-lite`
- MicroSD: 16GB


# 手順
1. システムの準備
    1. Raspbian を [Etcher](https://www.balena.io/etcher/)などでmicroSDに焼く。
    2. `ssh` できるように、`ssh`というファイル名の、空ファイルをFAT32パーティションに作成
2. 初回起動
    1. microSDをラズパイ本体に入れて、USB電源アダプタを挿す。
    2. login: `pi` / password: `raspberry` にてログイン
    3. パッケージ更新・再起動:<br>`sudo apt update && sudo apt upgrade -y && sudo reboot`

3. 初期設定
    1. `sudo raspi-config`
        1. パスワード変更
        2. WiFi設定<br>などなど



4. OpenCVビルドの準備
    1. <font color='red'><b>SWAPのサイズ</b></font>を100MB => 2GBに変更

		```bash:こぴぺ
		swapon
		sudo sed -i -e 's/SWAPSIZE=.*/SWAPSIZE=2048/g' /etc/dphys-swapfile
		sudo systemctl restart dphys-swapfile.service
		swapon
		```

		```shell-session:実行例
		pi@raspberrypi:~ $ swapon
		NAME      TYPE SIZE USED PRIO
		/var/swap file 100M   0B   -2
		pi@raspberrypi:~ $ sudo sed -i -e 's/SWAPSIZE=.*/SWAPSIZE=2048/g' /etc/dphys-swapfile
		pi@raspberrypi:~ $ sudo systemctl restart dphys-swapfile.service
		pi@raspberrypi:~ $ swapon
		NAME      TYPE SIZE USED PRIO
		/var/swap file   2G   0B   -2
		pi@raspberrypi:~ $
		```
    2. OpenCVのビルドに必要なパッケージを導入

		```bash:こぴぺ
		sudo apt-get install -y \
			build-essential cmake pkg-config \
			libjpeg-dev libtiff5-dev libpng-dev \
			libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
			libxvidcore-dev libx264-dev \
			libgtk2.0-dev libgtk-3-dev \
			libcanberra-gtk* \
			gfortran \
			python2.7-dev python3-dev \
			libavresample-dev libtesseract-dev libleptonica-dev \
			libgstreamer1.0-dev  libgstreamer-plugins-base1.0-dev libhdf5-dev \
			libatlas-base-dev liblapacke-dev \
			python3-numpy python-numpy libjasper-dev
		```

    3. ソースコード取得・解凍

		```bash:こぴぺ
		cd ~
		#OPENCV_VERSION=3.4.5
		OPENCV_VERSION=4.0.1
		wget https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip -O opencv-${OPENCV_VERSION}.zip
		wget https://github.com/opencv/opencv_contrib/archive/${OPENCV_VERSION}.zip -O opencv_contrib-${OPENCV_VERSION}.zip
		unzip opencv-${OPENCV_VERSION}.zip
		unzip opencv_contrib-${OPENCV_VERSION}.zip
		```



5. OpenCVビルド
    1. `build`フォルダ作成、cmakeにて設定

		```bash:こぴぺ
		OPENCV_VERSION=4.0.1
		cd ~/opencv-${OPENCV_VERSION}
		mkdir build
		cd build 
		cmake -DCMAKE_BUILD_TYPE=Release \
			-D CMAKE_INSTALL_PREFIX=/usr/local \
			-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-${OPENCV_VERSION}/modules \
			-D ENABLE_VFPV3=ON \
			-D ENABLE_NEON=ON \
			-D BUILD_TESTS=OFF \
			-D WITH_TBB=OFF \
			-D INSTALL_PYTHON_EXAMPLES=ON \
			-D OPENCV_SKIP_PYTHON_LOADER=ON \
			-D OPENCV_PYTHON2_INSTALL_PATH=/usr/local/lib/python2.7/dist-packages \
			-D OPENCV_PYTHON3_INSTALL_PATH=/usr/local/lib/python3.5/dist-packages \
			-D OPENCV_GENERATE_PKGCONFIG=ON \
			-D BUILD_EXAMPLES=ON ..
		```

    2. ビルド開始
  
		```bash:こぴぺ
		OPENCV_VERSION=4.0.1
		cd ~/opencv-${OPENCV_VERSION}/build
		make -j4
		```
		\# `-j4`(4プロセス並列)でコケる場合は、`-j1`でやる。python2/3向けのモジュールのリンクあたりがすごくメモリを食う。

    3. 待つ (寝る前に仕掛けておくとよいかも?)
    4. インストール (`CMAKE_INSTALL_PREFIX`で指定した`/usr/local`以下にインストールされる)

		```bash:こぴぺ
		OPENCV_VERSION=4.0.1
		cd ~/opencv-${OPENCV_VERSION}/build
		sudo make install
		sudo ldconfig
		```


6. テスト
後ほど




<!--
# 時間計測

1. cmake の実行時間

    ```
# Raspberry Pi 2B
real    5m2.164s
user    4m7.831s
sys     0m40.569s
```

-->

# その他
1. cpuをパフォーマンスモードにする
`echo performance | sudo tee /sys/devices/system/cpu/cpufreq/policy0/scaling_governor`


	```shell-session:例
	pi@raspberrypi:~ $ # 使用可能なモード
	pi@raspberrypi:~ $ cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors 
	conservative ondemand userspace powersave performance schedutil 
	pi@raspberrypi:~ $ # 現在設定されているモード
	pi@raspberrypi:~ $ cat /sys/devices/system/cpu/cpufreq/policy0/scaling_governor 
	ondemand
	pi@raspberrypi:~ $ # performanceモードに設定
	pi@raspberrypi:~ $ echo performance | sudo tee /sys/devices/system/cpu/cpufreq/policy0/scaling_governor 
	performance
	pi@raspberrypi:~ $ # 設定確認
	pi@raspberrypi:~ $ cat /sys/devices/system/cpu/cpufreq/policy0/scaling_governor 
	performance
	pi@raspberrypi:~ $ 
	```

2. 時間計測 (bashにて)

	```bash
	(time コマンド) 2>&1 | tee filename.log
	```

	```shell-session:例
	pi@raspberrypi:~ $ (time make -j4) 2>&1 | tee ~/build-make.log 
	```

3. アンインストール
    buildフォルダにて、`sudo make uninstall` で、インストールされたファイルの削除が行われるが、フォルダと、(`/usr/local/lib`の)シンボリックリンクが削除されない。