doridoridoriand’s diary

主に技術的なことを書いていく予定(たぶん)

pyenvで管理しているPythonからOpenCVを使えるようにする

MacはHomebrew経由でインストールできる模様。以下コマンドを実行してみる。

$ brew install opencv

以下のエラーが出力された。

$ brew install opencv
Error: No available formula with the name "opencv"
It was migrated from homebrew/core to homebrew/science.
You can access it again by running:
  brew tap homebrew/science

メッセージに従って brew tap homebrew/science を実行。

再度 brew install opencv を実行したところ、無事にインストールできた。 ここでpythonからOpenCVを呼び出せるか、試しにREPLを起動してみる。

$ python
Python 3.5.1 (default, Apr 16 2017, 13:35:06)
[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 cv
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'cv'
>>> import opencv
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'opencv'
>>> exit()

どうやらモジュールが発見できていない模様。調べてみるとこのインストール方法はどうやら古い気がする。 python3系から呼び出すためには、別のopencvをインストールする必要がありそう。 先ほどインストールしたものを削除する。

$ brew uninstall opencv
Uninstalling /usr/local/Cellar/opencv/2.4.13.2... (278 files, 35.6MB)

インストールオプションを調べる。

$ brew info opencv3
homebrew/science/opencv3: stable 3.2.0 (bottled), HEAD [keg-only]
Open source computer vision library, version 3
http://opencv.org/
Not installed
From: https://github.com/Homebrew/homebrew-science/blob/master/opencv3.rb
==> Dependencies
Build: cmake ✘, pkg-config ✔
Recommended: eigen ✔, jpeg ✔, libpng ✔, libtiff ✔, openexr ✔, numpy ✔
Optional: ffmpeg ✘, gphoto2 ✘, gstreamer ✘, jasper ✘, jpeg-turbo ✘, libdc1394 ✘, openni ✘, openni2 ✘, qt ✘, tbb ✘, vtk ✘
==> Requirements
Optional: cuda ✘, java ✔, python3 ✔
==> Options

次のコマンドを実行。

$ brew install opencv3 --with-python3

(オプション入れたせいか、すごい時間がかかる。。) (make走るのでかなり時間が掛かる。。) (一時間位かかりそう。。)

なんかまたエラーが出た。

Already downloaded: /Users/dorian/Library/Caches/Homebrew/numpy--nose-1.3.7.tar.gz
==> python3 -c import setuptools... --no-user-cfg install --prefix=/usr/local/Cellar/numpy/1.13.1/libexec/nose --single-version-externally-managed --record=installed.txt
==> python3 setup.py build --fcompiler=gnu95 --parallel=8 install --prefix=/usr/local/Cellar/numpy/1.13.1 --single-version-externally-managed --record=installed.txt
==> Caveats
If you use system python (that comes - depending on the OS X version -
with older versions of numpy, scipy and matplotlib), you may need to
ensure that the brewed packages come earlier in Python's sys.path with:
  mkdir -p /Users/dorian/.local/lib/python3.5/site-packages
  echo 'import sys; sys.path.insert(1, "/usr/local/lib/python2.7/site-packages")' >> /Users/dorian/.local/lib/python3.5/site-packages/homebrew.pth

Python modules have been installed and Homebrew's site-packages is not
in your Python sys.path, so you will not be able to import the modules
this formula installed. If you plan to develop with these modules,
please run:
  mkdir -p /Users/dorian/.local/lib/python3.5/site-packages
  echo 'import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")' >> /Users/dorian/.local/lib/python3.5/site-packages/homebrew.pth
==> Summary
🍺  /usr/local/Cellar/numpy/1.13.1: 1,375 files, 29.1MB, built in 2 minutes 14 seconds
==> Installing homebrew/science/opencv3 --with-python3
==> Downloading https://github.com/opencv/opencv/archive/3.2.0.tar.gz
==> Downloading from https://codeload.github.com/opencv/opencv/tar.gz/3.2.0
######################################################################## 100.0%
Error: opencv3: Does not support building both Python 2 and 3 wrappers

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

え。そうなの? 確かにオプション一覧に無かった。。

ひとまず埒が明かないので、もう一回オプション無しでインストールする。

$ brew install opencv3

問題なくインストール完了。

ではこれを pyenv でインストールしたpythonから呼び出せるか試してみる。 python用のバイナリファイルは以下パスに入っているみたい。

/usr/local/Cellar/opencv3/3.2.0/lib/python2.7/site-packages

個人的にはpython3系に一本化したいので、しばらくpython3でうまく出来ないか(python3系用のsoファイルがインストールされないか)格闘していたが、一筋縄では行かないと判明したので、さっと諦めて pyenv で2.7.11にバージョンを変更。

pyenv でインストールしたpythonは以下ディレクトリに格納されている。

~/.pyenv/versions

brew経由でインストールされたOpenCVpython用バイナリをpyenv経由でインストールしたpythonから参照出来るようにするために、シンボリックリンクを貼ってあげれば良い。そのためには以下コマンドを実行する。

ln -s /usr/local/Cellar/opencv3/3.2.0/lib/python2.7/site-package/cv2.so ~/.pyenv/versions/2.7.11/lib/python2.7/site-packages

実際にpythonから呼び出せるか確かめてみる。

/Users/dorian/.pyenv/versions/2.7.11/lib/python2.7/site-packages python
Python 2.7.11 (default, Aug  6 2016, 11:14:26)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'
>>>

問題なく呼び出せた模様。 環境作るのに時間かかってしまった。。

おまけ

シンボリックリンクの張り替えで、opencvとopencv3を切り替えられた。

$ python
Python 2.7.11 (default, Aug  6 2016, 11:14:26)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'
>>> exit()
$ rm .pyenv/versions/2.7.11/lib/python2.7/site-packages/cv2.so
$ ln -s /usr/local/Cellar/opencv/2.4.13.2/lib/python2.7/site-packages/cv2.so ~/.pyenv/versions/2.7.11/lib/python2.7/site-packages
/Users/dorian python
Python 2.7.11 (default, Aug  6 2016, 11:14:26)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'2.4.13.2'

補足

Twitterでつぶやいたら、anacondaなら一発じゃね?って飛んできたので、試したら本当に楽に入ってしまった。。開発用途ならこれで十分かも。