OpenCV + Python3 on Raspberry Pi

- Python3 で
- Raspberry Pi で
- OpenCV3 で

やってみた
 
Raspberry Pi でセルフコンパイル。
時間がかかるので、実際の作業時刻とともに記録。

# 下準備

2015年9月にやってみたが、Wheezyでうまくいかなかった。
その時はこれを基にした。
http://www.pyimagesearch.com/2015/07/27/installing-opencv-3-0-for-both-python-2-7-and-python-3-on-your-raspberry-pi-2/

今回はこれも参考にしたが、
http://www.pyimagesearch.com/2016/04/18/install-guide-raspberry-pi-3-raspbian-jessie-opencv-3/

これらは virthalenv を使って Python3 の環境を構築している。今回はどういうわけかうまくいかなかったので、 virtualenv 使わずにインストールしたもの。

## microSDカード

前回は 4GB の microSD で作業を始めると途中で足りなくなった。8GB だと何とかなるが、OpenCV インストールした後に更にいろいろ入れていこうとすると苦しいかもしれない。
ということで今回は16Gで作業した。

作業前の容量

```


pi@raspberrypi:~ $ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root         15G  845M   14G    6% /
devtmpfs         427M     0  427M    0% /dev
tmpfs            432M     0  432M    0% /dev/shm
tmpfs            432M  5.8M  426M    2% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            432M     0  432M    0% /sys/fs/cgroup
/dev/mmcblk0p1    41M   21M   21M   51% /boot

```
作業後の容量

```

[~/raspberrypi 15:30:16] $ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root         15G  5.5G  8.5G   40% /
devtmpfs         427M     0  427M    0% /dev
tmpfs            432M     0  432M    0% /dev/shm
tmpfs            432M  5.8M  426M    2% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            432M     0  432M    0% /sys/fs/cgroup
/dev/mmcblk0p1    41M   21M   20M   52% /boot
```

## raspbian の初期設定

今回使ったものは RASPBIAN JESSIE LITE の April 2017 版。
294MのZipファイルを展開すると1.3Gのイメージになる。
これを書き込み、Raspberry Pi でインストールして起動。

```

$ sudo raspi-config 
```

で、以下のように設定しておく

- ロケールをja_JP.UTF-8に、
- TIMEZONEを ASIA/Tokyo
- sshサーバ有効
- 専用カメラを有効


# 12:00- システム環境をアップデートしておく


```

$ sudo apt-get update ; sudo apt-get upgrade
```

# 12:10- 必要なパッケージをインストールする

```

$ sudo apt-get install build-essential git cmake pkg-config libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libgtk2.0-dev libatlas-base-dev gfortran
```

# 12:20- Python3関連のセットアップ

```

$ sudo apt-get install python3-dev python3-pip
```

# 12:25- opencv,opencv_contribをダウンロード

```

$ cd ~
$ git clone https://github.com/Itseez/opencv.git
$ cd opencv
$ git checkout 3.2.0
$ cd ..
$ git clone https://github.com/Itseez/opencv_contrib.git
$ cd opencv_contrib/
$ git checkout 3.2.0
$ cd ..

```

# 12:37- numpyのインストール

```

$ sudo pip3 install numpy
```

# 12:54- OpenCVのインストール

githubページを見たら3.2.0が最新リリースだったのでそれを使うことにした。

```

$ cd opencv
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
>     -D CMAKE_INSTALL_PREFIX=/usr/local \
>     -D INSTALL_PYTHON_EXAMPLES=ON \
>     -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
>     -D BUILD_EXAMPLES=ON ..
```

しばらくすると、以下のように表示される

```
...
--     Use OpenCL:                  YES
--     Use OpenVX:                  NO
--     Use custom HAL:              YES (carotene (ver 0.0.1))
--
--   OpenCL:                        <Dynamic loading of OpenCL library>
--     Include path:                /home/pi/opencv/3rdparty/include/opencl/1.2
--     Use AMDFFT:                  NO
--     Use AMDBLAS:                 NO
--
--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.9)
--
--   Python 3:
--     Interpreter:                 /usr/bin/python3.4 (ver 3.4.2)
--     Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython3.4m.so (ver 3.4.2)
--     numpy:                       /usr/local/lib/python3.4/dist-packages/numpy/core/include (ver 1.12.1)
--     packages path:               lib/python3.4/dist-packages
--
--   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
--
--   Tests and samples:
--     Tests:                       YES
--     Performance tests:           YES
--     C/C++ Examples:              YES
--
--   Install path:                  /usr/local
--
--   cvconfig.h is in:              /home/pi/opencv/build
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/opencv/build

```
Python3 の項目、問題なさげなのでそのまま進む

```

$ make -j4
Scanning dependencies of target opencv_core_pch_dephelp
Scanning dependencies of target libwebp
Scanning dependencies of target carotene_objs
Scanning dependencies of target IlmImf
[  0%] Building CXX object modules/core/CMakeFiles/opencv_core_pch_dephelp.dir/opencv_core_pch_dephelp.cxx.o
[  0%] Building C object 3rdparty/libwebp/CMakeFiles/libwebp.dir/dec/alpha.c.o
[  0%] Building CXX object 3rdparty/carotene/hal/carotene/CMakeFiles/carotene_objs.dir/src/absdiff.cpp.o
[  1%] Building C object 3rdparty/libwebp/CMakeFiles/libwebp.dir/dec/buffer.c.o
[  1%] Building CXX object 3rdparty/openexr/CMakeFiles/IlmImf.dir/Half/half.cpp.o
[  1%] Building C object 3rdparty/libwebp/CMakeFiles/libwebp.dir/dec/frame.c.o

...

[ 99%] Building CXX object modules/optflow/CMakeFiles/opencv_test_optflow.dir/test/test_motiontemplates.cpp.o
[100%] Linking CXX executable ../../bin/opencv_test_optflow
[100%] Built target opencv_test_optflow
[100%] Linking CXX executable ../../bin/opencv_perf_optflow
[100%] Built target opencv_perf_optflow
[100%] Linking CXX shared module ../../lib/python3/cv2.cpython-34m.so
[100%] Built target opencv_python3
[build/raspberrypi 14:55:43] $
```

```

$ sudo make install
$ sudo ldconfig

```

14:58 に作業終わりました。

# 15:00 テスト

```

$ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'
>>> exit()
```

いけそうですね。サンプルプログラム作ってみる。
この記事を元にした。
http://peaceandhilightandpython.hatenablog.com/entry/2016/02/18/194303

```

 $ cat test.py
import cv2
import numpy as np

faceCascade = cv2.CascadeClassifier('opencv/data/haarcascades/haarcascade_frontalface_default.xml')

img = cv2.imread('opencv/samples/data/lena.jpg', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face = faceCascade.detectMultiScale(gray, 1.1, 3)

if len(face) > 0:
        for rect in face:
                cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 0,255), thickness=2)
else:
        print( "no face" )

cv2.imwrite('detected.jpg', img)

```
INSTALL_PYTHON_EXAMPLES=ON なので、サンプルファイルができている。そこに含まれている lena.jpg というのは1972年11月号のPLAYBOYのグラビアの一部だそうで。

```

$ python3 test.py
```

で実行すると、detected.jpg が生成された。

# ssh 作業での結果の確認

sshで作業していたので GUI は使えない。けれどもカンタンに生成結果などを確認したい。
今回は Apache2 (プログラム作成用に vim も一緒に)をインストールして、操作している PC から Webブラウザで参照するようにしてみる。


```

$ sudo apt-get install vim apache2
$ sudo cp detected.jpg /var/www/html
```
このタイミングで vim もインストールしておいた。

http://192.168.11.14/detected.jpg にアクセスすると顔認識の結果が表示された。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/139524/6bdbe08b-33aa-207b-b89f-163b75823ac8.png)

このあとは、以下の資料などを見て遊んでみよう。

http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html



#　（おまけ） virtualenvを使ったやり方（失敗）

上記のやり方をする前に、virtualenvを使ってインストールしてみたけれどもうまくいかなかった。一応、備忘録。

途中までは上記と同じ、pip3をインストールした後、

```

$ sudo pip3 install virtualenv virtualenvwrapper
Downloading/unpacking virtualenv
  Downloading virtualenv-15.1.0-py2.py3-none-any.whl (1.8MB): 1.8MB downloaded
Downloading/unpacking virtualenvwrapper
  Downloading virtualenvwrapper-4.7.2.tar.gz (90kB): 90kB downloaded
  Running setup.py (path:/tmp/pip-build-g16wz9ic/virtualenvwrapper/setup.py) egg_info for package virtualenvwrapper

    Installed /tmp/pip-build-g16wz9ic/virtualenvwrapper/pbr-3.0.1-py3.4.egg
    [pbr] Processing SOURCES.txt
    warning: LocalManifestMaker: standard file '-c' not found

    warning: no previously-included files found matching '.gitignore'
    warning: no previously-included files found matching '.gitreview'
    warning: no previously-included files matching '*.pyc' found anywhere in distribution
    warning: no files found matching '*.html' under directory 'docs'
    warning: no files found matching '*.css' under directory 'docs'
    warning: no files found matching '*.js' under directory 'docs'
    warning: no files found matching '*.png' under directory 'docs'
Downloading/unpacking virtualenv-clone (from virtualenvwrapper)
  Downloading virtualenv-clone-0.2.6.tar.gz
  Running setup.py (path:/tmp/pip-build-g16wz9ic/virtualenv-clone/setup.py) egg_info for package virtualenv-clone

Downloading/unpacking stevedore (from virtualenvwrapper)
  Downloading stevedore-1.22.0-py2.py3-none-any.whl
Downloading/unpacking six>=1.9.0 (from stevedore->virtualenvwrapper)
  Downloading six-1.10.0-py2.py3-none-any.whl
Downloading/unpacking pbr>=2.0.0,!=2.1.0 (from stevedore->virtualenvwrapper)
  Downloading pbr-3.0.1-py2.py3-none-any.whl (99kB): 99kB downloaded
Installing collected packages: virtualenv, virtualenvwrapper, virtualenv-clone, stevedore, six, pbr
  Running setup.py install for virtualenvwrapper
    [pbr] Generating AUTHORS
    [pbr] AUTHORS complete (0.0s)
    [pbr] Reusing existing SOURCES.txt
    changing mode of build/scripts-3.4/virtualenvwrapper.sh from 644 to 755
    changing mode of build/scripts-3.4/virtualenvwrapper_lazy.sh from 644 to 755
    Skipping installation of /usr/local/lib/python3.4/dist-packages/virtualenvwrapper/__init__.py (namespace package)
    Installing /usr/local/lib/python3.4/dist-packages/virtualenvwrapper-4.7.2-nspkg.pth
    changing mode of /usr/local/bin/virtualenvwrapper.sh to 755
    changing mode of /usr/local/bin/virtualenvwrapper_lazy.sh to 755
  Running setup.py install for virtualenv-clone

    Installing virtualenv-clone script to /usr/local/bin
  Found existing installation: six 1.8.0
    Not uninstalling six at /usr/lib/python3/dist-packages, owned by OS
Successfully installed virtualenv virtualenvwrapper virtualenv-clone stevedore six pbr
```
なんだか Skipping installation とか出ていて、ここらへんがダメだったのかも。 


```

$ vi ~/.profile
```

として、

```

# virtualenv and virtualenvwrapper
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
```
これを書き加え、

```

$ source ~/.profile
```
で反映。

```

$  mkvirtualenv cv -p python3
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/pi/.virtualenvs/cv/bin/python3
Also creating executable in /home/pi/.virtualenvs/cv/bin/python
Installing setuptools, pip, wheel...done.
/usr/bin/python: No module named virtualenvwrapper
```
うーん、エラー出る。こうしたらどうかな？

```

pi@raspberrypi:~/opencv_contrib $ mkvirtualenv cv
Using base prefix '/usr'
New python executable in /home/pi/.virtualenvs/cv/bin/python3
Not overwriting existing python script /home/pi/.virtualenvs/cv/bin/python (you must use /home/pi/.virtualenvs/cv/bin/python3)
Installing setuptools, pip, wheel...done.
/usr/bin/python: No module named virtualenvwrapper
pi@raspberrypi:~/opencv_contrib $ workon cv
/usr/bin/python: No module named virtualenvwrapper
/usr/bin/python: No module named virtualenvwrapper
```

やっぱりエラー出る。このまま進めてみると・・・

```

(cv) pi@raspberrypi:~/opencv_contrib $ pip3 install numpy
```



```

$ cd opencv
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
>     -D CMAKE_INSTALL_PREFIX=/usr/local \
>     -D INSTALL_PYTHON_EXAMPLES=ON \
>     -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
>     -D BUILD_EXAMPLES=ON ..
```
しばらくすると

```
--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.9)
--
--   Python 3:
--     Interpreter:                 /home/pi/.virtualenvs/cv/bin/python3.4 (ver 3.4.2)
--     Libraries:                   /usr/lib/arm-linux-gnueabihf/libpython3.4m.so (ver 3.4.2)
--     numpy:                       /home/pi/.virtualenvs/cv/lib/python3.4/site-packages/numpy/core/include (ver 1.12.1)
--     packages path:               lib/python3.4/site-packages
--
--   Python (for build):            /usr/bin/python2.7
--
```
と出てくる。このまま進めてみると、

```
$ make -j4
$ sudo make install
$ sudo ldconfig
$ cd ~/.virtualenvs/cv/lib/python3.4/site-packages/
$ ln -s /usr/local/lib/python3.4/site-packages/cv2.cpython-32mu.so cv2.so
```
インストールできたかな？

```

$ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'cv2'
>>> exit()
```
動かない。

```

$ cd /usr/local/lib/python3.4/site-packages/
(cv) pi@raspberrypi:/usr/local/lib/python3.4/site-packages $ ls
cv2.cpython-34m.so
(cv) pi@raspberrypi:/usr/local/lib/python3.4/site-packages $ sudo cp cv2.cpython-34m.so cv2.so
```
とすると動いた

```

(cv) pi@raspberrypi:/usr/local/lib/python3.4/site-packages $ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'
>>> exit()
```
しかしながら再起動すると動かなくなってしまった。

```

pi@raspberrypi:~ $ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'cv2'
>>> exit()
pi@raspberrypi:~ $ ls /usr/local/lib/python3.4/site-packages/
cv2.cpython-34m.so  cv2.so
```
virtualenv 環境に入らないといけなかったかな？

```

pi@raspberrypi:~ $ workon cv
/usr/bin/python: No module named virtualenvwrapper
/usr/bin/python: No module named virtualenvwrapper
(cv) pi@raspberrypi:~ $ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'cv2'
```

標準のPythonを3.4にしておいた方がいいのかな？

```
pi@raspberrypi:~ $ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.4 1
update-alternatives: /usr/bin/python (python) を提供するために自動モードで /usr/bin/python3.4 を使います
pi@raspberrypi:~ $ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2
update-alternatives: /usr/bin/python (python) を提供するために自動モードで /usr/bin/python2.7 を使います

```

こうして改めて再起動してcmakeからやり直したけれど改善しませんでした。
ということで virtualenv つかったやり方は断念。