はじめに
Python3.x系で画像処理したいなぁっと思ってOpenCVを入れる時にErrorが発生したので、
備忘録として書いておきます。
注意事項
問題を抱えて読む方へ、以下のことをお願いします。
- 結論は最後まで読んでください。
- 結論まで読み終わるまで、コマンドは実行しないでください。
- エラーが発生した時はちゃんとエラー文を読んでください。
- 焦らずに一つ一つ確認して行うことを忘れないようにしてください。
何が起きたか
まず、Homebrewを使って次のような手順で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を利用するためには、次のような手順でコマンドを実行することで利用可能になりました。
$ 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まとめ
- mac に OpenCV 3.2 をインストール (python3)|FUMIの開発日記
- homebrewとは何者か。仕組みについて調べてみた
- pyenv & Anacondaの環境でOpencv 3.1.0を導入
- Windows 10 でPython3.6でopencv3インストール
- Macでrpathを渡したり確認したり【なれない日記20160715】
- 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
- Library not loaded: @rpath/libopenblasp-r0.2.19.dylib
Ask