Open CV 3.1 + Ubuntu クロスコンパイル用 OPENCVライブラリビルド備忘録

かんたんに構築できると思ったら少しハマってしまったこと。
リモートデバッグ環境構築は[こちら](http://qiita.com/btEshink/items/a1b9e4982a655c789ed0)
OpenCVのBuildは[ここを](http://a244.hateblo.jp/entry/2016/10/18/053000)ご参考にさせていただきました。
リモートデバッグするために必要な項目を載せています。

環境
- Host : macOS Sierra
- VM : Ubuntu Gnome 16.04 LTS 32bit
- Target : Raspberry Pi


#1. 依存ライブラリのインストール
### 1.1 リポジトリアップデート
```bash:Terminal
sudo apt-get update
```

### 1.2 Build 用

``` bash:Terminal
sudo apt-get install build-essential cmake pkg-config
```

### 1.3 OpenGL 用

``` bash:Terminal
sudo apt-get install mesa-utils
```

### 1.4 画像関連

``` bash:Terminal
sudo apt-get install libjpeg-dev \
libtiff5-dev \
libpng12-dev \
libjasper-dev \
libavcodec-dev \
libavformat-dev \
libswscale-dev \
libv4l-dev \
libxvidcore-dev \
libx264-dev
libgtk2.0-dev \
```

### 1.5 高速化処理

```bash:Terminal
sudo apt-get install libatlas-base-dev gfortran libeigen3-dev
```

高速化する手段はまだまだあるらしく、現在調査中。。

### 1.6 ドライバ

```bash:Terminal
sudo apt-get install libv4l-dev
```
ちなみに V4L1はCMAKEの結果をみると動作しない模様 (未確認ですが)
V4L2で動作するWebカメラを選びましょう。
現在は[Logicool C270](http://www.logicool.co.jp/ja-jp/product/hd-webcam-c270?crid=34)を使っています

#2. OpenCVのダウンロード
OpenCVと拡張モジュールをダウンロードします

```bash:Terminal
mkdir opencv
cd opencv

wget -O opencv-3.1.0.zip https://github.com/opencv/opencv/archive/3.1.0.zip
wget -O opencv_contrib-3.1.0.zip https://github.com/opencv/opencv_contrib/archive/3.1.0.zip

unzip opencv-3.1.o.zip
unzip opencv_contrib-3.1.0.zip
```

opencv_contrib は必要でない人もいると思うので、各自判断して下さい。
CMAKEをするときにcontribオプションの説明を載せておきます。

#3. Build環境の構築

CMAKEをしたいところですが、makeをするコンパイラを設定する必要があります。

aptにビルドするためのARMコンパイラがあります。
c言語とc++言語用です。

```bash:Terminal
sudo apt-get install g++-arm-linux-gnueabihf
sudo apt-get install gcc-arm-linux-gnueabihf
```

次にtoolchain.cmakeファイルの修正を行います。
今回はARM用のビルドを実施しますので以下のToolchainの修正をして下さい。

```bash:Terminal
sudo vi  /opencv-3.1.0/platforms/linux/arm-gnueabi.toolchain.cmake

find_program(CMAKE_C_COMPILER NAMES arm-linux-gnueabihf-gcc)
find_program(CMAKE_CXX_COMPILER NAMES arm-linux-gnueabihf-g++)
```

次にBuildするフォルダの作成を行います。

``` bash:Terminal 
mkdir build
cd build
```
#4. cmakeからinstallまで


cmake を実行します。
今回の設定は
高速化 NEON TBB の有効化
QTはOFF
toolchainをARM用に指定
contribを有効
zlibのエラー対策でARのバイナリを指定します

//2017/05/14 修正 toolchainの指定間違え修正

```bash:Terminal
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CMAKE_TOOLCHAIN_FILE=~/opencv/opencv-3.1.0/platforms/linux/arm-gnueabi.toolchain.cmake -D CMAKE_AR=/usr/arm-linux-gnueabihf/bin/ar -D OPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib-3.1.0/modules -D ENABLE_NEON:BOOL=ON -D WITH_TBB=ON -D BUILD_TBB=ON -D WITH_QT=OFF -D WITH_OPENGL=OFF -D SOFTFP=ON  ..
```

実行結果は

```bash:Terminal
-- General configuration for OpenCV 3.1.0 =====================================
--   Version control:               unknown
-- 
--   Platform:
--     Host:                        Linux 4.8.0-46-generic i686
--     Target:                      Linux 1 arm
--     CMake:                       3.5.1
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/make
--     Configuration:               RELEASE
-- 
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ Compiler:                /usr/bin/arm-linux-gnueabihf-g++  (ver 5.4.0)
--     C++ flags (Release):      省略   

--     C Compiler:                  /usr/bin/arm-linux-gnueabihf-gcc
--     C flags (Release):        省略
--     C flags (Debug):          省略
--     Linker flags (Release):      -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now 
--     Linker flags (Debug):        -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now 
--     Precompiled headers:         YES
--     Extra dependencies:          dl m pthread rt
--     3rdparty dependencies:       zlib libjpeg libwebp libpng libtiff libjasper IlmImf libprotobuf tbb
-- 
--   OpenCV modules:
--     To be built:                 core flann imgproc ml photo reg surface_matching video dnn fuzzy imgcodecs shape videoio highgui objdetect plot superres ts xobjdetect xphoto bgsegm bioinspired dpm face features2d line_descriptor saliency text calib3d ccalib datasets rgbd stereo structured_light tracking videostab xfeatures2d ximgproc aruco optflow stitching
--     Disabled:                    world contrib_world
--     Disabled by dependency:      -
--     Unavailable:                 cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev java python2 python3 viz cvv hdf matlab sfm
-- 
--   GUI: 
--     QT:                          NO
--     GTK+:                        NO
--     GThread :                    NO
--     GtkGlExt:                    NO
--     OpenGL support:              NO
--     VTK support:                 NO
-- 
--   Media I/O: 
--     ZLib:                        zlib (ver 1.2.8)
--     JPEG:                        libjpeg (ver 90)
--     WEBP:                        build (ver 0.3.1)
--     PNG:                         build (ver 1.6.19)
--     TIFF:                        build (ver 42 - 4.0.2)
--     JPEG 2000:                   build (ver 1.900.1)
--     OpenEXR:                     build (ver 1.7.1)
--     GDAL:                        NO
-- 
--   Video I/O:
--     DC1394 1.x:                  NO
--     DC1394 2.x:                  NO
--     FFMPEG:                      NO
--       codec:                     NO
--       format:                    NO
--       util:                      NO
--       swscale:                   NO
--       resample:                  NO
--       gentoo-style:              NO
--     GStreamer:                   NO
--     OpenNI:                      NO
--     OpenNI PrimeSensor Modules:  NO
--     OpenNI2:                     NO
--     PvAPI:                       NO
--     GigEVisionSDK:               NO
--     UniCap:                      NO
--     UniCap ucil:                 NO
--     V4L/V4L2:                    NO/YES
--     XIMEA:                       NO
--     Xine:                        NO
--     gPhoto2:                     NO
-- 
--   Parallel framework:            TBB (ver 4.3 interface 8002)
-- 
--   Other third-party libraries:
--     Use IPP:                     NO
--     Use VA:                      NO
--     Use Intel VA-API/OpenCL:     NO
--     Use Eigen:                   YES (ver 3.2.92)
--     Use Cuda:                    NO
--     Use OpenCL:                  YES
--     Use custom HAL:              NO
-- 
--   OpenCL:
--     Version:                     dynamic
--     Include path:                ~/opencv-3.1.0/3rdparty/include/opencl/1.2
--     Use AMDFFT:                  NO
--     Use AMDBLAS:                 NO
-- 
--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.12)
-- 
--   Python 3:
--     Interpreter:                 /usr/bin/python3 (ver 3.5.2)
-- 
--   Python (for build):            /usr/bin/python2.7
-- 
--   Java:
--     ant:                         NO
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
-- 
--   Matlab:                        Matlab not found or implicitly disabled
-- 
--   Documentation:
--     Doxygen:                     NO
--     PlantUML:                    NO
-- 
--   Tests and samples:
--     Tests:                       YES
--     Performance tests:           YES
--     C/C++ Examples:              YES
-- 
--   Install path:                  /usr/local
-- 
--   cvconfig.h is in:              ~/opencv-3.1.0/build
-- -----------------------------------------------------------------
```
こんな感じです。

あとは、

```bash:Terminal
sudo make -j2
```
CPUコアの指定を-j2で実施しています。
2コアでmakeします。
Makeが完了したら

```bash:Terminal
sudo make install
```
でおわり。