読者です 読者をやめる 読者になる 読者になる

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も入れているので、こっちに対応させる方法もあるのだろうけども。