RaspberryPi4にOpenCVをインストールする。

# RaspberryPi4にopenCV3.4.1をインストールした際の備忘録

#### ファイルシステムを拡張する。
    $ sudo raspi-config 
    7 Advanced Options --> A1 Expand filesystem --> Finsh

#### swapを増やす。
    $ sudo vi /etc/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
    # CONF_SWAPSIZE=100
    CONF_SWAPSIZE=2048

#### dphys-swapfilを再起動
    $ sudo /etc/init.d/dphys-swapfile stop
    $ sudo /etc/init.d/dphys-swapfile start

#### 今回はcmake-guiを使ってみる
    $ sudo apt install cmake-qt-gui

#### 依存関係のあるライブラリをインストールする。
    $ sudo apt install libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev
    $ sudo apt install libv4l-dev v4l-utils libgtk2.0-dev 
    $ sudo apt install libmesa-utils libgl1-mesa-dri libgtkglext1-dev libatlas-base-dev gfortran libeigen3-dev python-2.7-dev python3-dev python-numpy python3-numpy
    $ sudo apt install ant 
    
#### Opencv3.4.1のビルド 
    $ wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.1.zip
    $ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.4.1.zip  
    $ unzip opencv.zip
    $ unzip opencv_contrib.zip
    $ cd opencv-3.4.1
    $ mkdir build 
    $ cmake-gui
GUIが表示されるのでソースコードのディレクトリとビルドディレクトリを選択し[Configure]ボタンをクリックする。
![cmak2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148248/19764154-1c62-a1dd-b27b-9be4a40f65f7.png)

CMakeSetupダイアログが表示されるので[Finish]ボタンをクリックする。
![cmak3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148248/eb446e21-1f50-08a3-2298-779118c24f5e.png)

こんな感じでセットアップが開始される。
![cma4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148248/d39668b7-ff6d-6767-d553-8ae1af83a647.png)


セットアップが終了
![cmak5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148248/560ac806-7475-42c4-9aea-80bacfad1e14.png)

OPENCV_EXTRA_MODULES_PATHを追加する。
wgetしたopencv_contrib-3.4.1/modulesを指定する。
![cmak6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148248/81d36e8e-7475-0b7a-1a92-6b5c5b15479e.png)

WITH_OPENGLにチェックを入れ、[Configure]ボタンをクリック
![cmak7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148248/1948a8a2-5eaa-0927-40e1-b772195f2d76.png)

Configuring doneが表示されたら[Generate]ボタンをクリック
![cmak8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148248/dec05e1d-cf53-83c8-6797-ce13fb54ecbd.png)

Generatin doneが表示されたらビルドの前処理は終了。
画面を閉じターミナルへ戻る。
![cmak9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148248/8fa5af51-35a2-b151-e52a-b1373b7964ad.png)

    $ make -j4 

<b><font color=red>buildエラー
cv2.cpp:889:34: error: invalid conversion from 'const char*' to 'char*' [-fpermissive]</font></b>

[ここの情報によると](https://bugs.gentoo.org/6914809)
This version (and some older versions) don't compile (with Python3.7)
いくつかの古いバージョンはpython3.7でコンパイルできないらしい。
なので
opencv-3.4.1/modules/python/src2/cv2.cppの889行目を修正する。

    bool pyopencv_to(PyObject* obj, String& value, const char* name)
    {
       (void)name;
       if(!obj || obj == Py_None)
           return true;
    -  char* str = PyString_AsString(obj);
    +  const char* str = PyString_AsString(obj);
        if(!str)
           return false;
        value = String(str);
      return true;
    }
 
修正後再ビルド

    $ make -j4
    [100%] Linking CXX executable ../../bin/opencv_test_stitching
    [100%] Building CXX object modules/stitching/CMakeFiles/opencv_perf_stitching.dir/perf/perf_estimators.cpp.o
    [100%] Built target opencv_test_stitching
    [100%] Building CXX object modules/stitching/CMakeFiles/opencv_perf_stitching.dir/perf/perf_main.cpp.o
    [100%] Building CXX object modules/stitching/CMakeFiles/opencv_perf_stitching.dir/perf/perf_matchers.cpp.o
    [100%] Building CXX object modules/stitching/CMakeFiles/opencv_perf_stitching.dir/perf/perf_stich.cpp.o
    [100%] Linking CXX executable ../../bin/opencv_perf_stitching
    [100%] Built target opencv_perf_stitching
    [100%] Linking CXX shared module ../../lib/python3/cv2.cpython-37m-arm-linux-gnueabihf.so
    [100%] Built target opencv_python3
    [100%] Linking CXX shared module ../../lib/cv2.so
    [100%] Built target opencv_python2
    pi@raspberrypi:~/opencv-3.4.1/build$ 
ビルド成功


### 次はopenCV4系をビルドしてみる
### その前に3.4.10のビルドを試す。
#### 3.4.10はソースの修正なしでビルド成功
    $ make -j4 
    [100%] Linking CXX executable ../../bin/opencv_test_tracking
    [100%] Built target opencv_test_tracking
    [100%] Linking CXX shared module ../../lib/python3/cv2.cpython-37m-arm-linux-gnueabihf.so
    [100%] Linking CXX shared module ../../lib/cv2.so
    [100%] Built target opencv_python3
    [100%] Built target opencv_python2
    pi@raspberrypi:~/opencv3/opencv-3.4.10/build $ 
### openCV4.10.0をビルド
    3.4系とほぼ同様だがOPENGL周りで何やらwarningが出たが一旦無視して
    ビルドを実行してみる。


    [100%] Linking CXX executable ../../bin/opencv_test_gapi
    [100%] Built target opencv_test_gapi
    [100%] Linking CXX shared module ../../lib/python3/cv2.cpython-311-aarch64-linux-gnu.so
    [100%] Built target opencv_python3    

ビルド終了

#### C++のサンプルをコンパイルしてみる。