Manjaro-KDE+Python3.x+OpenCV4.1.x+wxPython4.0.x+USBWebcamの環境構築例

#　無　保　証　で　す
[当方執筆の技術情報に関するライセンス、免責事項、禁止事項](https://qiita.com/EarthSimilarityIndex/items/6b9bb2ccacb38aae15b1)

#総合もくじ
[Python3.7.x+OpenCV4.1.x+wxPython4.0.x+USBWebcamのクロスプラットフォームな環境構築事例集](https://qiita.com/EarthSimilarityIndex/items/122de017102dee2936f7)

# 想定する運用スタイル
 - [OpenCV](https://opencv.org/) を利用する GUI アプリケーションを [wxPython](https://www.wxpython.org/) により構築する。
 - [Webcam](https://ja.wikipedia.org/wiki/Web%E3%82%AB%E3%83%A1%E3%83%A9) を USB 接続し OpenCV から利用する。
 - Python 向けパッケージは pip + venv で管理する。
 - 異なるプラットフォームにおける作業手順を出来るだけ統一化する。[^Ansible]

[^Ansible]: 構築予定の環境の構成によっては [Ansible](https://docs.ansible.com/ansible/latest/modules/pacman_module.html) 等も有用と思われる。
 
※ インストール済みの Python パッケージ全てのアップグレードについては以下を参照下さい。
[How to upgrade all Python packages with pip? - Stack Overflow](https://stackoverflow.com/questions/2720014/how-to-upgrade-all-python-packages-with-pip)

# 環境構築スクリプト記述例
<details><summary>Manjaro 向け環境構築スクリプト</summary><div>

```sh
#!/bin/sh
# variables
VENV_DIR="$HOME/testenv"
WXPYTHON_VERSION="4.0.6"

# install basic build dependencies
cd || exit 1
echo "Enter your password"
sudo pacman -Syyu
sudo pacman -Syu cmake || exit 2

# activate python3's virtual environment
test -d $VENV_DIR || mkdir $VENV_DIR
cd $VENV_DIR || exit 3
test -d $VENV_DIR/py3env || python3 -m venv ./py3env
. ./py3env/bin/activate || exit 4
pip install --upgrade pip setuptools || exit 5

# install opencv-python and wxPython
test -f $VENV_DIR/requirements.txt && rm "$VENV_DIR/requirements.txt"
test -d $VENV_DIR/requirements && rm -r "$VENV_DIR/requirements"
mkdir $VENV_DIR/requirements
cd $VENV_DIR/requirements || exit 6
curl -LO https://raw.githubusercontent.com/wxWidgets/Phoenix/wxPython-$WXPYTHON_VERSION/requirements/devel.txt || exit 7
curl -LO https://raw.githubusercontent.com/wxWidgets/Phoenix/wxPython-$WXPYTHON_VERSION/requirements/install.txt || exit 8
cd $VENV_DIR || exit 9
curl -LO https://raw.githubusercontent.com/wxWidgets/Phoenix/wxPython-$WXPYTHON_VERSION/requirements.txt || exit 10
pip install -r requirements.txt || exit 11
pip install opencv-python wxPython==$WXPYTHON_VERSION || exit 12
rm "requirements.txt"
rm -r "requirements"

# deactivate python3's virtual environment
deactivate
cd || exit 13
exit 0
```
※ 終了ステータスの使い方が少し変則的かもしれません。

</div></details>

# 事前準備：適切なミラーの選択

```sh
sudo pacman-mirrors --fasttrack && sudo pacman -Syyu
```

## 参考とした文献
[Pacman-mirrorsコマンドによるミラーサーバーリストの更新 - Manjaro Linux](https://wiki.manjaro.org/index.php?title=Pacman-mirrors%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%E3%83%9F%E3%83%A9%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E6%9B%B4%E6%96%B0)
[Pacman-mirrors - Manjaro Linux](https://wiki.manjaro.org/index.php?title=Pacman-mirrors)

# 事前準備（コンパイルでつまづく場合）：base 及び base-devel の導入

```sh
sudo pacman -S base base-devel
```

## 参考とした文献
[Arch User Repository - ArchWiki](https://wiki.archlinux.jp/index.php/Arch_User_Repository)
[Pacman Overview - Manjaro Linux](https://wiki.manjaro.org/index.php?title=Pacman_Overview)
[Arch Linux の pacman コマンドを使うことのメモ | Jenemal Notes](http://malkalech.com/arch_linux_pacman)

# 事前準備：cmake の導入

```sh
sudo pacman -S cmake
```

# 事前準備：Python3 の環境構築

## pip の導入（pip 未導入の場合）

```sh
sudo pacman -S python-pip
```

## venv による仮想環境の構築

```sh
cd || exit
test -d $HOME/testenv || mkdir $HOME/testenv
cd $HOME/testenv || exit
python3 -m venv ./py3env
. ./py3env/bin/activate
pip install --upgrade pip setuptools
deactivate
```

※ [direnv](https://direnv.net/) を用いることで、対象ディレクトリに移動するだけで仮想環境が開始されるよう設定出来るそうです。

[BuildWxPythonOnRaspberryPi - wxPyWiki](https://wiki.wxpython.org/BuildWxPythonOnRaspberryPi) より引用
> If your lazy like most programmers. Check out https://direnv.net/ and https://github.com/direnv/direnv/wiki/Python with some fussing the virtenv will load automagically when you enter a directory.

### 参考とした文献
仮想環境 - python.jp
https://www.python.jp/install/centos/virtualenv.html

venv --- 仮想環境の作成 — Python 3.7.4 ドキュメント
https://docs.python.org/ja/3/library/venv.html

# opencv-python と wxPython の導入：pip を利用する場合

## [OpenCV 4.1.x](https://pypi.org/project/opencv-python/) のインストール

```sh
cd $HOME/testenv || exit
. ./py3env/bin/activate || exit
pip install opencv-python
pip show opencv-python
deactivate
cd || exit
```
## [wxPython（4.0.6）](https://pypi.org/project/wxPython/4.0.6/)のインストール

```sh
cd $HOME/testenv || exit
. ./py3env/bin/activate || exit
WXPYTHON_VERSION=4.0.6
test -d Downloads || mkdir Downloads
cd Downloads || exit
test -d wxPython-$WXPYTHON_VERSION-requirements && rm -r "wxPython-$WXPYTHON_VERSION-requirements"
mkdir wxPython-$WXPYTHON_VERSION-requirements
cd  wxPython-$WXPYTHON_VERSION-requirements || exit
curl -LO https://raw.githubusercontent.com/wxWidgets/Phoenix/wxPython-$WXPYTHON_VERSION/requirements.txt
mkdir requirements
cd requirements || exit
curl -LO https://raw.githubusercontent.com/wxWidgets/Phoenix/wxPython-$WXPYTHON_VERSION/requirements/devel.txt
curl -LO https://raw.githubusercontent.com/wxWidgets/Phoenix/wxPython-$WXPYTHON_VERSION/requirements/install.txt
cd ../
pip install -r requirements.txt
pip install wxPython==$WXPYTHON_VERSION
pip show wxPython
unset WXPYTHON_VERSION
deactivate
cd || exit
```

# opencv-python と wxPython の導入：ソースコードからビルド＆インストールする場合

## OpenCV 4.1.1 のビルド＆インストール

### OpenCV をソースコードからビルドする利点と問題点
 - **利点:**
  - 最新版を手軽に試すことが出来る。
  - ビルドオプションを細かく指定してのビルド＆インストールが可能である。
  -  Qt のバージョンが揃うので UI のアイコン表示等が崩れない。
 - **問題点:**
    - pip list に現れない。

### ビルド＆インストール

```sh:venv　仮想環境への　OpenCV　4.1.1　の構築
cd $HOME/testenv || exit
. ./py3env/bin/activate || exit # 仮想環境を開始する
OPENCV_VERSION=4.1.1
pip uninstall opencv-python # pipから導入した opencv-python があれば削除しておく
pip install numpy # opencv-python が構築時、及び導入時に依存する numpy をインストールする
test -d Downloads || mkdir Downloads
cd Downloads || exit
curl -LO https://github.com/opencv/opencv/archive/$OPENCV_VERSION.tar.gz # GitHub から OpenCV のソースコードをダウンロードする
tar zxf $OPENCV_VERSION.tar.gz
cd opencv-$OPENCV_VERSION || exit
mkdir build && cd build || exit
cmake -D CMAKE_BUILD_TYPE=Release -D WITH_QT=YES -D CMAKE_INSTALL_PREFIX=$HOME/testenv/py3env/ ..
make -j$(nproc)
make install # ホームディレクトリ内、仮想環境内部にインストールするのでスーパーユーザー権限は必要ない
python3 -c "import cv2; print(cv2.__version__)" # 導入した opencv-python のバージョンを確認する
python3 -c "import cv2; print(cv2.getBuildInformation())" # 導入した opencv のビルドオプションを確認する
python3 $HOME/testenv/Downloads/opencv-$OPENCV_VERSION/samples/python/video.py # Webcam からの映像を確認、ESC キーでサンプルプログラムは終了する
unset OPENCV_VERSION
deactivate # 仮想環境を終了する
cd || exit
```

※ マルチコアCPUなら例えば```make -j$(nproc)```や```make -j$(grep processor /proc/cpuinfo | wc -l)```などとオプションをわたすことで構築時間を短縮出来ます [^nproc1] [^nproc2] [^proccpuinfo] 。

[^nproc1]: [bash - How to obtain the number of CPUs/cores in Linux from the command line? - Stack Overflow](https://stackoverflow.com/questions/6481005/how-to-obtain-the-number-of-cpus-cores-in-linux-from-the-command-line)
[^nproc2]: [Man page of NPROC - JM Project](https://linuxjm.osdn.jp/html/GNU_coreutils/man1/nproc.1.html)
[^proccpuinfo]: [物理 CPU、CPU コア、および論理 CPU の数を確認する - Red Hat Customer Portal](https://access.redhat.com/ja/solutions/2159401)

###参考とした文献
OpenCV: Installation in Linux
https://docs.opencv.org/4.1.1/d7/d9f/tutorial_linux_install.html

OpenCVのビルド情報を確認するgetBuildInformation() | note.nkmk.me
https://note.nkmk.me/python-opencv-getbuildinformation/

Python Tips：ワンライナーが書きたい - Life with Python
https://www.lifewithpython.com/2015/01/python-use-command-one-liner.html

## wxPython 4.0.6 のビルド＆インストール

### wxPython をソースコードからビルドする利点と問題点
 - **利点:**
  - ビルドオプションを柔軟に指定出来る。
  - システムに既に wxWidgets が導入済みであれば build.py のオプションで ```--use_syswx``` を指定することでそちらを利用出来る。
 - **問題点:**
  - python3 build.py clean を行う際に誤って python3 build.py cleanall とすると sip 配下のファイルやフォルダが一掃されてしまう。

### ビルド＆インストール

```sh:venv　仮想環境への　wxPython　4.0.6　の構築
cd $HOME/testenv || exit
. ./py3env/bin/activate || exit # 仮想環境を開始する
WXPYTHON_VERSION=4.0.6
pip uninstall wxPython # pipから導入した wxPython があれば削除しておく
test -d Downloads || mkdir Downloads
cd Downloads || exit
pip download wxPython==$WXPYTHON_VERSION --no-deps --no-binary :all: # PyPI から wxPython のソースコードをダウンロードする
tar zxf wxPython-$WXPYTHON_VERSION.tar.gz
cd wxPython-$WXPYTHON_VERSION || exit
pip install -r requirements.txt # 構築時依存及び導入時依存 python パッケージのインストールを行う
python3 build.py build bdist_wheel --release --jobs=$(nproc) # wxPython のビルドを行う
pip install dist/wxPython-$WXPYTHON_VERSION-*.whl #wxPython のインストールを行う
pip show wxPython # インストールされた wxPython パッケージの情報を表示する
python3 $HOME/testenv/Downloads/wxPython-$WXPYTHON_VERSION/demo/demo.py # wxPython のデモを実行する
unset WXPYTHON_VERSION
deactivate # 仮想環境を終了する
cd || exit
```

※ マルチコアCPUなら例えば```--jobs=$(nproc)```や```--jobs=$(grep processor /proc/cpuinfo | wc -l)```などと build.py にオプションをわたすことで構築時間を短縮出来ます [^nproc1] [^nproc2] [^proccpuinfo] 。

### 参考とした文献
How to install wxPython - wxPyWiki
https://wiki.wxpython.org/How%20to%20install%20wxPython

BuildWxPythonOnRaspberryPi - wxPyWiki
https://wiki.wxpython.org/BuildWxPythonOnRaspberryPi

Cannot build Phoenix from github master - wxpython-dev＠lists.wxwidgets.org
https://wxpython-dev.wxwidgets.narkive.com/Sdn1NNA8/cannot-build-phoenix-from-github-master