OpenCV3 on Python3 on OSX 環境整備に思いのほか手間取った上、結局うまくいかない件。

Udemyのデータサイエンス講習がもうすぐ終わりそうなので、次の教材を探しました。

パラパラ見ていると、前から気になっていたOpenCVを使った画像処理レシピ発見。

画像認識で機械学習を使った解説が盛り込まれている模様。

ということで、まずはOpenCVをOSXにインストールしておこう… 今更Python2に戻りたくないからPython3で… なんて腰を上げたのが運の尽き。ハマるハマる。

OpenCVインストール手順

基本的に、こちらのブログで紹介されている手順でOKなはず。

だったのに、自分の場合、Python環境にanyenvを使っているからか、こんなスマートにいきませんでした…。

OpenCVインストール手順(ハマり過程)

まずはシステムにインストール済みのnumpyをアンインストール。

$ brew unlink numpy
$ brew uninstall numpy

python3で使うことを明示しつつ、numpyを再インストールして、ツール類を/usr/local下にリンクする。

$ pyenv global 3.5.1
$ brew install numpy --with-python3
$ brew link numpy

と、ゴミが残っていたのか、既存ファイルを上書きするオプションつけなさいと怒られるので言うとおりにする。

$ rm '/usr/local/bin/f2py'
$ brew link --overwite numpy

いよいよOpenCVのインストール。ここでもpython3で使うことを明示しておく。

$ brew install opencv3 --with-python3

と、setuptoolsをimportできませんエラーにより、早々にコケる。なぜに…?

この辺りはanyenv環境のせいな気がする。

取り急ぎ、Python2系でインストールしてみる。

$ pyenv global 2.7.11
$ brew install numpy --with-python3
$ brew link --overwrite numpy
$ brew install opencv3 --with-python3

今度はうまくビルドできた。

以下のように、anyenv下のpyenv下に、cv2.soのシンボリックリンクを作成して、python2/3両方からimport cv2できるようにする。

~ $ ln -fs /usr/local/Cellar/opencv3/3.1.0_3/lib/python2.7/site-packages/cv2.so ~/.anyenv/envs/pyenv/versions/2.7.11/lib/python2.7/site-packages/

~ $ ls -al ~/.anyenv/envs/pyenv/versions/2.7.11/lib/python2.7/site-packages/cv2.so
lrwxr-xr-x  1 takashi  staff  68  5 15 10:16 /Users/takashi/.anyenv/envs/pyenv/versions/2.7.11/lib/python2.7/site-packages/cv2.so -> /usr/local/Cellar/opencv3/3.1.0_3/lib/python2.7/site-packages/cv2.so

~ $ ln -fs /usr/local/Cellar/opencv3/3.1.0_3/lib/python2.7/site-packages/cv2.so ~/.anyenv/envs/pyenv/versions/3.5.1/lib/python3.5/site-packages/

~ $ ls -al ~/.anyenv/envs/pyenv/versions/3.5.1/lib/python3.5/site-packages/cv2.so
lrwxr-xr-x  1 takashi  staff  68  5 15 11:04 /Users/takashi/.anyenv/envs/pyenv/versions/3.5.1/lib/python3.5/site-packages/cv2.so -> /usr/local/Cellar/opencv3/3.1.0_3/lib/python2.7/site-packages/cv2.so

python2では無事cv2をインポートできて、顔認識できた!これは感動。

ところが、結局python3でのimport エラーは解決できず。なんでだー。

In [1]: import cv2
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-72fbbcfe2587> in <module>()
----> 1 import cv2

ImportError: dlopen(/Users/takashi/.anyenv/envs/pyenv/versions/3.5.1/lib/python3.5/site-packages/cv2.so, 2): Symbol not found: _PyCObject_Type
  Referenced from: /Users/takashi/.anyenv/envs/pyenv/versions/3.5.1/lib/python3.5/site-packages/cv2.so
  Expected in: flat namespace
 in /Users/takashi/.anyenv/envs/pyenv/versions/3.5.1/lib/python3.5/site-packages/cv2.so

とりあえず、IPythonデータサイエンスクックブックが言うとおり、python2でOpenCVの勉強を始めようと思います…。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする