Posted at

OSXでOpenCV3 + python3の環境を作る

More than 1 year has passed since last update.


環境

osx El Capitan


インストールするもの


  • python 3.5.1

  • openCV 3.1


流れ


  1. pyenvでpython3.5.1をインストール

  2. OpenCV3のインストール

  3. 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入れるのが一番早いかもしれない。