OpenCV2.3のインストールでハマった話
OpenCV2.3のPythonバインディングはnumpyが入っている必要があるっぽい。
うちの環境では/opt以下にPython(2.6, 2.7)を入れてvirtualenvで切り替えているのですが、numpyはいつもvirtualenv下のpipで入れていました。
今回、OpenCV2.3環境が必要になったので2.2と同じようにインストールしていたら、Pythonバインディング用のcv.soが生成されない。
# cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/opt/opencv2.3.1 -D BUILD_NEW_PYTHON_SUPPORT=ON -D PYTHON_EXECUTABLE=/opt/python2.6/bin/python -D PYTHON_LIBRARY=/opt/python2.6/lib/libpython2.6.so -D PYTHON_INCLUDE_PATH=/opt/python2.6/include/python2.6 . ... -- Interfaces: -- Python: YES -- Python interpreter: /opt/python2.7/bin/python -B (ver 2.6) -- Python numpy: NO (Python wrappers will not be generated) ...
numpyを入れる必要があるらしい。
#あとで確認してみたら2.2では Python numpy: NO (Python interface will not cover OpenCV 2.x API) になっていました。
#こちらはnumpyなしでもcv.soは生成されます。
numpyを入れるが、ここでまたハマる。
numpyをソースから入れようとするも上手くコンパイルできない。
仕方がないのでeasy_installから入れようとするもこれもエラー。
# yum install gcc-gfortran # /opt/python2.6/bin/easy_install numpy ... /usr/bin/ld: cannot find -lpython2.6 ...
-lpython2.6がないと言われる。
# ldconfig -p || grep python2.6 libpython2.6.so.1.0 (libc6,x86-64) => /opt/python2.6/lib/libpython2.6.so.1.0 libpython2.6.so (libc6,x86-64) => /opt/python2.6/lib/libpython2.6.so
ちゃんとリンクはされているはず。
悩んだ末、
# export CFLAGS=-L/opt/python2.6/lib/ # /opt/python2.6/bin/easy_install numpy
でインストールできた。正しい解決方法があったら教えてください。
なお、easy_installでインストールしたモジュールのアンインストールはこちらが参考になります。
pythonモジュールのアンインストール
OpenCVに戻る。
# cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/opt/opencv2.3.1 -D BUILD_NEW_PYTHON_SUPPORT=ON -D PYTHON_EXECUTABLE=/opt/python2.6/bin/python -D PYTHON_LIBRARY=/opt/python2.6/lib/libpython2.6.so -D PYTHON_INCLUDE_PATH=/opt/python2.6/include/python2.6 . ... -- Interfaces: -- Python: YES -- Python interpreter: /opt/python2.6/bin/python -B (ver 2.6) -- Python numpy: YES ... # make # make install # ls /opt/opencv2.3.1/lib/python2.6/site-packages/ | grep cv cv.py cv2.so
できました。
なんでOpenCV2.3とPython2.6の組み合わせかっていうと、
開発環境のMacでHomebrewから入れたOpenCV2.3がPython2.6(Macデフォルト)になっていたため。
HomebrewでPython2.7も入れているので、こっちに対応させる方法もあるのだろうけども。