[mac OS]OpenCVのインストールとの闘い...

# はじめに
Python3.x系で画像処理したいなぁっと思ってOpenCVを入れる時にErrorが発生したので、
備忘録として書いておきます。

# 注意事項
問題を抱えて読む方へ、以下のことをお願いします。

1. 結論は最後まで読んでください。
2. 結論まで読み終わるまで、コマンドは実行しないでください。
3. エラーが発生した時はちゃんとエラー文を読んでください。
4. 焦らずに一つ一つ確認して行うことを忘れないようにしてください。

# 何が起きたか
まず、Homebrewを使って次のような手順でOpenCVをインストールしようとしてました。

```bash:OpenCVのインストール
$ brew tap homebrew/science
$ brew install opencv3 --with-python3
```

最初のコマンドは問題なく動いたのですが、２つ目のコマンドで次のようなエラーが発生しました。

```
Error: opencv3: Does not support building both Python 2 and 3 wrappers
```

まぁ、『問題が起きたらGoogle先生に相談だ♪』ということで、
Google検索したら次のサイトがヒットして問題解決しました。

[mac に OpenCV 3.2 をインストール (python3)|FUMIの開発日記](http://mashup.hatenablog.com/entry/2017/05/17/200000)

この記事によると、

```
$ brew install opencv3 --with-python3
```
ではPython3.x系だけでなく、Python2.x系のOpenCVライブラリをインストールしようとするらしいです。そのため、それを避けるには、`--without-python`というオプションを追加してあげることで、Python2.x系のOpenCVライブラリをインストールの対象から外せるみたいです。

# 結論
OpenCVを利用するためには、次のような手順でコマンドを実行することで利用可能になりました。

```bash:OpenCVのインストール
$ brew tap homebrew/science
$ brew install opencv3 --with-python3　--without-python
$ brew link opencv3 --force
```

(※ダウンロード＆インストールで数十分時間がかかります。)

っと閉めようと思っていたのですが...

# 終わらない結論(Phase 1)

実際にPythonを実行すると次のようなエラーが発生しました。

```python:
Python 3.6.1 |Anaconda 4.4.0 (x86_64)| (...) 
[...)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'cv2'
```
※上記の「...」部分は隠しているだけで実際は違う表示がされてます。

う〜ん、pyenv上にAnacondaを入れて使用しているので、brewで入れたものはうまく見に行けないのかもしれないと考えてAnacondaでインストールしている例を探したら次の記事が見つかりました。

* [pyenv & Anacondaの環境でOpencv 3.1.0を導入](http://qiita.com/hephaistos/items/893505d60f419632f6c0)

ただ、この記事の内容の通り次のコマンドを実行したのですが、うまくいきませんでした。

```bash:
conda install -c https://conda.anaconda.org/menpo opencv3
```

それがこちら

```bash:
$ conda install -c https://conda.anaconda.org/menpo opencv3
Fetching package metadata ...........
Solving package specifications: .

UnsatisfiableError: The following specifications were found to be in conflict:
  - opencv3 -> python 2.7* -> openssl 1.0.1*
  - python 3.6*
Use "conda info <package>" to see the dependencies for each package.
```

困ったのでまたGoogle先生に聞いたら次の記事がヒットしました。

* [Windows 10 でPython3.6でopencv3インストール](http://qiita.com/Merdane/items/655130dfd176d8ee272e)

この記事によるとcondaが最新のopencv3が対応できてないとのこと。
そのためcondaの設定に`conda-forge`を追加する必要があるとのこと。

```
$　conda config --add channels conda-forge
```

これを実行後、次のように再度`conda`コマンドを利用して
インストールすると上手くいきました！

```
$　conda install opencv
```

# 終わらない結論(Phase 2)

...っと書きたかったのですが、また問題が発生。
今度は`import cv2`をしようとすると次のエラーが発生しました。

```py3:
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Users/.../.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so, 2): Library not loaded: @rpath/libopenblasp-r0.2.19.dylib
  Referenced from: /Users/.../.pyenv/versions/anaconda3-4.4.0/lib/libopencv_hdf.3.2.0.dylib
  Reason: image not found
```
※上記の「...」部分は隠しているだけで実際は違う表示がされてます。



う〜ん、このエラーは次のような状況なのか？
[1]    `import cv2`をしたことによって以下のファイルをロード

```
/Users/.../.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so
```

[2] ロードしたファイルで以下のファイルを参照した

```
/Users/.../.pyenv/versions/anaconda3-4.4.0/lib/libopencv_hdf.3.2.0.dylib
```

[3] [2]で参照したフィルから`@rpath/libopenblasp-r0.2.19.dylib`というファイルを見つけようとしたが見つからなかった

なるほど。ここで一つ疑問が。
`@rpath`でなんじゃい( *｀ω´)!!!

っということでまたもやGoogle先生に聞くと次の記事がヒットしました。

* [Macでrpathを渡したり確認したり【なれない日記20160715】](http://www.ketsuago.com/entry/2016/07/15/031230)

この記事から派生している記事まで読むと、共有ライブラリのパスを動的に使用したい時に用いるのが`@rpath`らしい。つまり、固定された共有ライブラリのパスは存在しているが、そこではなくユーザが指定した任意の所も共有ライブラリのパスになると。
さてここで問題になるのが、`@rpath`がどこをさしているのか...。

ちょっと疲れてきたので、「`libopenblasp-r0.2.19.dylib`」でGoogle先生に聞いて見た。

すると、次のGithubのQ&Aがヒットした。

* [Library not loaded: @rpath/libopenblasp-r0.2.19.dylib Referenced from: /Users/mona/anaconda/lib/libopencv_hdf.3.2.0.dylib Reason: image not found #3248](https://github.com/conda-forge/staged-recipes/issues/3248)

これによると、conda-forgeを追加しろと書いてあります。

```
conda config --add channels conda-forge
```

しかし、これはすでにやっている...
さらに見ると、

> Yep, using openblas and libgfortran from anaconda is causing issues. Pulling both of these in from conda-forge should fix it.
(Google翻訳：anacondaのopenblasとlibgfortranを使っていると問題が起きている。 これらの両方をconda-forgeから引っ張ってるところを修正する必要があります。)

う〜ん、つまりcondaのconfigファイルを修正すればいいのか？
よく分かんないなぁ...。ということで他の人のコメントを見てみると

> Thanks.
Thanks
This resolved my problem:
`$ conda install -c conda-forge openblas`

ほー。これによって`libopenblasp-r0.2.19.dylib`をゲットできるのかなぁ？
ちょっくらやってみるかぁ！っと思ってやった所。


```py3:
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(/Users/.../.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so, 2): Library not loaded: @rpath/libopenblasp-r0.2.19.dylib
  Referenced from: /Users/.../.pyenv/versions/anaconda3-4.4.0/lib/libopencv_hdf.3.2.0.dylib
  Reason: image not found
```

うん、解決してないね(*ﾉωﾉ)ｷｬｯ
はぁ...。

```
conda list
```
を実行した所、

```
openblas                  0.2.20                        1    conda-forge
```
っとなっていたので、`$ conda install -c conda-forge openblas`自体は成功して、

```bash:
find ~/ -name libopenblasp-r0.2.19.dylib
sudo find / -name libopenblasp-r0.2.19.dylib
mdfind -name libopenblasp-r0.2.19.dylib
```

全て実行して見たのですが、見つからず...。

「あぁ、もう疲れたよぉ...」っと思いながらも探し続け、次のstack overflowのやりとりの記事で奇跡が。

* [Library not loaded: @rpath/libopenblasp-r0.2.19.dylib
Ask](https://stackoverflow.com/questions/44983159/library-not-loaded-rpath-libopenblasp-r0-2-19-dylib)

> it seems that you do not have openblas installed, which is a required module of opencv, but somehow is not included in its dependencies so you have to install it manually, you may confirm this with `conda list|grep openblas`
> 
> If you do not have openblas, install it using following command: `conda install -c conda-forge openblas=0.2.19`
> (Google翻訳：
openblvをインストールする必要はありませんが、opencvの必須モジュールですが、何らかの形で依存関係に含まれていないので、手動でインストールする必要があります。`conda list | grep openblas`で確認できます
>openblasがない場合は、次のコマンドを使用してインストールします。`conda install -c conda-forge openblas = 0.2.19`)

ん！？つまり、自分の場合は`conda install -c conda-forge openblas = 0.2.19`を実行すればいけるのか!?

ということで実行して見ました。

```bash:
$ conda install -c conda-forge openblas=0.2.19
Fetching package metadata ...........
Solving package specifications: .

Package plan for installation in environment /Users/.../.pyenv/versions/anaconda3-4.4.0:

The following packages will be DOWNGRADED:

    openblas: 0.2.20-1 conda-forge --> 0.2.19-2 conda-forge

Proceed ([y]/n)? y

openblas-0.2.1 100% |######################################################################################| Time: 0:00:17   1.05 MB/s
```
※上記の「...」部分は隠しているだけで実際は違う表示がされてます。

お？
今さっきインストールしたopenblasのバージョンが
0.2.20-1から0.2.19-2にダウングレードされている...。

そして、ドキドキの結果発表...

```py3:
Python 3.6.1 |Anaconda 4.4.0 (x86_64)| (...) 
[...)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> 
```
※上記の「...」部分は隠しているだけで実際は違う表示がされてます。

おお！今度はエラーが発生しない！！
つまり、今のダウングレードによって@rpath上に`libopenblasp-r0.2.19.dylib`が作成されたらしい。

# 感想

はぁ、長かった...。
結局夜の8時くらいに始めて、12時くらいであの長いopencvのダウンロード＆インストールを待ってたけど、終わらず寝落ちして、8時くらいに起きて確認して、終了してて、よっしゃこれでできると`import cv2`でエラーが発生...。
そこからこの記事を書き足しつつ、進めて現在時刻が10時。
結局、最初の軽い気持ちから始めて6時間もこれに費やしてしまった...。
まぁ、この記事で同じような境遇の人が減ったらいいなぁ。

# 参考URLまとめ
* [mac に OpenCV 3.2 をインストール (python3)|FUMIの開発日記](http://mashup.hatenablog.com/entry/2017/05/17/200000)
* [homebrewとは何者か。仕組みについて調べてみた](http://qiita.com/omega999/items/6f65217b81ad3fffe7e6)
* [pyenv & Anacondaの環境でOpencv 3.1.0を導入](http://qiita.com/hephaistos/items/893505d60f419632f6c0)
* [Windows 10 でPython3.6でopencv3インストール](http://qiita.com/Merdane/items/655130dfd176d8ee272e)
* [Macでrpathを渡したり確認したり【なれない日記20160715】](http://www.ketsuago.com/entry/2016/07/15/031230)
* [Library not loaded: @rpath/libopenblasp-r0.2.19.dylib Referenced from: /Users/mona/anaconda/lib/libopencv_hdf.3.2.0.dylib Reason: image not found #3248](https://github.com/conda-forge/staged-recipes/issues/3248)
* [Library not loaded: @rpath/libopenblasp-r0.2.19.dylib
Ask](https://stackoverflow.com/questions/44983159/library-not-loaded-rpath-libopenblasp-r0-2-19-dylib)