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

More than 1 year has passed since last update.


はじめに

Python3.x系で画像処理したいなぁっと思ってOpenCVを入れる時にErrorが発生したので、

備忘録として書いておきます。


注意事項

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


  1. 結論は最後まで読んでください。

  2. 結論まで読み終わるまで、コマンドは実行しないでください。

  3. エラーが発生した時はちゃんとエラー文を読んでください。

  4. 焦らずに一つ一つ確認して行うことを忘れないようにしてください。


何が起きたか

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


OpenCVのインストール

$ brew tap homebrew/science

$ brew install opencv3 --with-python3

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

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

まぁ、『問題が起きたらGoogle先生に相談だ♪』ということで、

Google検索したら次のサイトがヒットして問題解決しました。

mac に OpenCV 3.2 をインストール (python3)|FUMIの開発日記

この記事によると、

$ brew install opencv3 --with-python3

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


結論

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


OpenCVのインストール

$ brew tap homebrew/science

$ brew install opencv3 --with-python3 --without-python
$ brew link opencv3 --force

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

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


終わらない結論(Phase 1)

実際に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でインストールしている例を探したら次の記事が見つかりました。

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

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

それがこちら

$ 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先生に聞いたら次の記事がヒットしました。

この記事によるとcondaが最新のopencv3が対応できてないとのこと。

そのためcondaの設定にconda-forgeを追加する必要があるとのこと。

$ conda config --add channels conda-forge

これを実行後、次のように再度condaコマンドを利用して

インストールすると上手くいきました!

$ conda install opencv


終わらない結論(Phase 2)

...っと書きたかったのですが、また問題が発生。

今度はimport cv2をしようとすると次のエラーが発生しました。

>>> 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先生に聞くと次の記事がヒットしました。

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

さてここで問題になるのが、@rpathがどこをさしているのか...。

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

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

これによると、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をゲットできるのかなぁ?

ちょっくらやってみるかぁ!っと思ってやった所。

>>> 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自体は成功して、

find ~/ -name libopenblasp-r0.2.19.dylib

sudo find / -name libopenblasp-r0.2.19.dylib
mdfind -name libopenblasp-r0.2.19.dylib

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

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


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を実行すればいけるのか!?

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

$ 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にダウングレードされている...。

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

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まとめ