pythonでOpenCV使うための環境づくり

#前書き
OpenCV使って画像解析する機会ができたので、いつも忘れる、pyenvの設定の仕方を改めてまとめておこうかと。

# シリーズ
* [pythonでOpenCV使うための環境づくり](https://qiita.com/Ryo87/items/939b370c06c60c9d63c8)
* [OpenCVのチュートリアルをやる](https://qiita.com/Ryo87/items/c20be948d261f1be2f22)
* [OpenCVのチュートリアルをやる -その2 変換系-](https://qiita.com/Ryo87/items/6f367bf1eb69c4f3c80e)
* [OpenCVのチュートリアルをやる -その3 -](https://qiita.com/Ryo87/items/0ffc633fb918cb704566)

#開発環境
機種名 : MacBook Pro
OS : Mojave 10.14.2
プロセッサ名 : Intel Core i5 2.6 GHz
メモリ : 16 GB
グラフィック : Intel Iris 1536MB

#本題
## とりあえずいつもの
> @brew

普段はこんな感じに定義しといてbrewのアップデートしときます。
必要だったらそのエラー直します。

```.zshrc
@brew() {brew update && brew upgrade && brew cleanup && brew doctor}
```

## pyenvの準備。
### pyenv 入っていることの確認
```zsh
% pyenv --version                                                                                                                                                                                    
 pyenv 1.2.9
```

### pyenvでpythonのインストール
いろいろ、パッケージあるけどとりあえずシンプルに作っていきます。

```zsh
% pyenv versions                                                                                                                                                                                     
  system
  2.7.9
  3.4.3
* 3.6.3 (set by /Users/ryo/.python-version)
  default
```
なんかいろいろはいってますね。

```zsh
% pyenv install -list
  3.5.6
  3.6.0
  3.6-dev
  3.6.1
  3.6.2
  3.6.3
  3.6.4
  3.6.5
  3.6.6
  3.6.7
  3.6.8
  3.7.0
  3.7-dev
  3.7.1
  3.7.2
  3.8-dev
```

今回入れるのは、、、、`3.6.8`で行きます。

```zsh
% pwd                                                                                                                                                                                               
~/01_OpenCV_Tutorial

% pyenv install 3.6.8                                                                                                                                                                                [20:59:44]
python-build: use openssl from homebrew
python-build: use readline from homebrew
Installing Python-3.6.8...
python-build: use readline from homebrew

BUILD FAILED (OS X 10.14.2 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/n7/XXX(略)XXX/T/python-build.20190111210025.24638
Results logged to /var/folders/n7/XXX(略)XXX/T/python-build.20190111210025.24638.log

Last 10 log lines:
  "__PyMem_RawStrdup", referenced from:
      _main in python.o
  "__PyMem_SetupAllocators", referenced from:
      _main in python.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)clang: error: linker command failed with exit code 1 (use -v to see invocation)

make: *** [Programs/_testembed] Error 1
make: *** Waiting for unfinished jobs....
make: *** [python.exe] Error 1
  103.69s user 25.87s system 188% cpu 1:08.77 total

```

### エラーが、、、

> 関数テンプレートの肝心な処理部分が実装ファイル側に隠蔽されてしまっていることが原因である。
ヘッダ側で宣言部は見えていても、肝心な処理部分がmain関数側のファイルから見えないため、テンプレートの展開・実体化が行えないという単純な話だ。

参考
[Undefined symbols for architecture x86_64:の原因（複数）](https://marycore.jp/prog/xcode/undefined-symbols-for-architecture-x86-64/)


原因がわからないので、とりあえず、久しぶりにXcodeを起動します。(唐突
Xcodeを久しく起動してなかったので、起動して諸々インストール、アップデートしておきます。

>% xcode-select --install

アップデートしたのでもう一回

```
% pyenv install 3.6.8  
python-build: use openssl from homebrew
python-build: use readline from homebrew
Installing Python-3.6.8...
python-build: use readline from homebrew

BUILD FAILED (OS X 10.14.2 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/n7/XXX(略)XXX/T/python-build.20190111211206.36574
Results logged to /var/folders/n7/XXX(略)XXX/T/python-build.20190111211206.36574.log

Last 10 log lines:
      _test_repeated_init_and_subinterpreters in _testembed.o
      _test_pre_initialization_api in _testembed.o
  "_Py_SetStandardStreamEncoding", referenced from:
      _test_forced_io_encoding in _testembed.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [python.exe] Error 1
make: *** Waiting for unfinished jobs....
make: *** [Programs/_testembed] Error 1
  104.40s user 26.90s system 174% cpu 1:15.28 total
```

ログを見る

> ld: warning: ignoring file libpython3.6m.a, file was built for archive which is not the architecture being linked (x86_64): libpython3.6m.ald: warning: ignoring file libpython3.6m.a, file was built for archiv
e which is not the architecture being linked (x86_64): libpython3.6m.a

結果わからず。


### お？なにかヒット。(失敗

> BUILD FAILED (OS X 10.14.2 using python-build 20180424)

```
% CFLAGS="-I$(brew --prefix readline)/include -I$(brew --prefix openssl)/include -I$(xcrun --show-sdk-path)/usr/include" \
LDFLAGS="-L$(brew --prefix readline)/lib -L$(brew --prefix openssl)/lib" \
PYTHON_CONFIGURE_OPTS=--enable-unicode=ucs2 \
pyenv install -v 3.6.8
```

同様のエラーで失敗

### メインのOpenCVに触れないので諦めることに。
一通り触ってみて、pyenvから3.6.8を入れようとしたときに必要とされているライブラリが適切にリンクされていない模様。
リンクのパスを適切に直したら行けると思うんだけど、、、

## すでに入っているpyenvで進めてみる。

```zsh
% pyenv versions                                                                                                                                                                                     
  system
  2.7.9
  3.4.3
* 3.6.3 (set by /Users/ryo/.python-version)
  default
```

3.6.3が入っているのでそれを使います。

```zsh
% pyenv virtualenv 3.6.3 opencv                                                                                                                                                                      
Requirement already satisfied: setuptools in /Users/ryo/.pyenv/versions/3.6.3/envs/opencv/lib/python3.6/site-packages
Requirement already satisfied: pip in /Users/ryo/.pyenv/versions/3.6.3/envs/opencv/lib/python3.6/site-packages
% pyenv versions                                                                                                                                                                                    
  system
  2.7.9
  3.4.3
* 3.6.3 (set by /Users/ryo/.python-version)
  default
  opencv
```

入ってますね。

```zsh
% pyenv local opencv                                                                                                                                                                                 
(opencv) %
```

はい、opencvモードに変更できました。
アップグレード白とのことなので、アップグレード

```zsh
(opencv)% pip freeze
The directory '/Users/ryo/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
You are using pip version 9.0.1, however version 18.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

(opencv)% pip install --upgrade pip
(略)
Successfully installed pip-18.1
(opencv)% pip freeze
(opencv)%
```

とりあえず、opencvモードは空っぽです。

### opencvのインストール
```zsh
(opencv)% pip install opencv-python
Successfully installed opencv-python-4.0.0.21
```
### ついでに必要そうなのインストール(あとで増やすかも)

```zsh
(opencv)% pip install numpy
Successfully installed numpy-1.15.4
```

## 動作確認
opencvのバージョンが出ればOK

```sample.py
import cv2
print(cv2.__version__)
```


```
% python sample.py                                                                                                                                     
4.0.0
```

ちゃんと出ましたので、環境構築完了

#感想
MacOSのバージョンのせいなのか、はたまた他の設定のせいなのかわからないけど、新しいバージョン入れられなかったorz
またそのうち見直せればいいな。

以上。(多分何かないと見直さないんだろうな。。。