環境
osx El Capitan
インストールするもの
- python 3.5.1
- openCV 3.1
流れ
- pyenvでpython3.5.1をインストール
- OpenCV3のインストール
- 2.の環境でOpenCV3が動くようにする
1. pyenvでpython3.5.1をインストール
動かしたいのはOpenCV3系だしpythonも新しいものを使いたい。けど、OpenCV2系向けに書かれたものも多く転がっているため、OpenCV2系も動かせるようにしておきたい。OpenCV2系はpython2系でないと動かないみたいなので、複数環境を動かせるような状態にしておきたい。なのでpyenvをインストールしてそこから環境を変えることにする。
$ brew install pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
# python3.5.1をインストール
$ pyenv install 3.5.1
2. OpenCV3のインストール
brewから導入。
# brew install opencv3 --with-python3 を打ってみたけど、opencv3をhomebrew/science/opencv3に変更しろと言われる
$ brew install homebrew/science/opencv3 --with-python3
brewから上記のコマンドを入れるが、以下のようなエラーが出てうまくいかない。
/tmp/opencv3-20161123-64293-17bmzya/opencv-3.1.0/modules/videoio/src/cap_qtkit.mm:46:9: fatal error: 'QTKit/QTKit.h' file not found
#import <QTKit/QTKit.h>
http://qiita.com/masaori/items/0c78fcd58a6c6bf4f655
こちらのリンクではOSX Sierraで発生したとあるが、ElCapitanでも発生。解決法は今のところ同じで、brewのオプションにHEADを指定して新しいものを取得する。HEADを取得することで何か別のコミットも交じっているだろうけど、現時点では特に不都合なし。
$ brew install homebrew/science/opencv3 --with-python3 --HEAD
3. 2.の環境でOpenCV3が動くようにする
pyenv経由でOpenCVのsoファイルを読めるようにシンボリックリンクを張る
$ ln -s /usr/local/Cellar/opencv3/HEAD-b8c875d_4/lib/python3.5/site-packages/cv2.cpython-35m-darwin.so ~/.pyenv/versions/3.5.1/lib/python3.5/site-packages
以下でREPLからちゃんと読み込めるか確認
$ python
Python 3.5.1 (default, Nov 7 2016, 22:30:16)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>>
はまったこと
どこかのタイミングでpython2.7のモジュールを読み込むようになってしまっていた。そのため、brewでOpenCVをビルドした時にsoファイルが/usr/local/opt/opencv3/lib/python2.7/site-packages/
に置かれたり、ファイルの中でもpython2.7前提でのビルドがされているために、シンボリックリンクを張っても以下のようなエラーが出てpythonで読み込めなかったりした。
$ python
Python 3.5.1 (default, Nov 7 2016, 22:30:16)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dlopen(/usr/local/opt/opencv3/lib/python2.7/site-packages/cv2.so, 2): Symbol not found: _PyCObject_Type
Referenced from: /usr/local/opt/opencv3/lib/python2.7/site-packages/cv2.so
Expected in: flat namespace
in /usr/local/opt/opencv3/lib/python2.7/site-packages/cv2.so
>>>
こちらからそのモジュール読み込み問題を解決
http://qiita.com/Asakage/items/690ce9048e708de41166
~/.local/lib/python3.5/site-packages/homebrew.pth
にある行をコメントアウトするとちゃんとpython3.5を読み込んでくれるようになった。どのタイミングでこのパスが読み込まれたのかは不明。pyvenvを設定したりここに書いてないことも少しやっていたので、そのタイミングで発生したのかもしれない。
ビルドにも時間かかるし色々問題が発生したので、condaを使ってOpenCV入れるのが一番早いかもしれない。