最近图像识别技术越来越成熟了,乘着周末打算跑一个opencv,看网上教程,很多都是基于brew的,可是这样编译出来的看起来只能绑定系统的版本(因为是走默认的环境)
考虑到有多个不同版本python需要安装opencv的需求,于是决定从源码中之间编译 (本文使用opencv 3.4.3 , python 3.6.6 python 2.7.15, pyenv 1.2.7, mac 16.7.0 测试)
那首先就是要下载源码了,opencv源码分了两部分,一个是opencv,一个是opencv_contrib,可以直接从git上clone,也可以直接从release里下.但要注意两个版本保持一致
https://github.com/opencv/opencv/releases
https://github.com/opencv/opencv_contrib/releases
下载好了之后解压,得到两个目录,一个是opencv 一个是opencv_contrib,把她们放到统一工作目录下
在编译开始前,进入pyenv后要确保pyenv安装的python开启了动态链接,检查环境变量PYTHON_CONFIGURE_OPTS 是否设置mac上为--enable-framework, linux 上为 --enable-shared. 之后重新安装制定的版本
export PYTHON_CONFIGURE_OPTS=--enable-framework pyenv install 3.3.6 pyenv local 3.6.6 |
pip3 install numpy |
此时,python已经通过pyenv配置(已3.6.6为例),同时安装了numpy。如果需要安装ffmpeg/VTK支持。
brew install ffmpeg vtk |
如果opencv_contrib和opencv同级存放。
mkdir opencv/build |
cd opencv/build |
python_root=$(python-config --prefix) echo $python_root |
cmake -DCMAKE_BUILD_TYPE=Release \ -D PYTHON3_INCLUDE_DIR=${python_root}/include/python3.6m \ -D PYTHON3_EXECUTABLE=${python_root}/bin/python3 \ -D PYTHON3_LIBRARY=${python_root}/lib/lib/libpython3.6m.dylib \ -DPYTHON3_PACKAGES_PATH=${python_root}/site-packages \ -DCMAKE_INSTALL_PREFIX=$HOME/opencv/ \ -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ \ -DBUILD_TESTS=OFF \ -DBUILD_PERF_TESTS=OFF \ -DBUILD_opencv_python3=ON .. |
如果要同时安装python2 添加python2的配置,要注意的是 PYTHON*系列选项的路径可能会变化,所有需要手动检查一下,不要忘了都需要安装pynum否则无法编译
如果也配置了2.7结果可能如下
最后就可以make了
make make install |
漫长的等待后,在输出的lib/下找到生成的python so 库,手动拷贝到自己虚环境的site-package下。之后就可以import cv2了
最后总结一下其中的坑:
- pyenv 安装python时没有启动动态链接支持,导致后续opencv无法链接
- pyenv中的python环境没有安装numpy
- 使用virtualenv创建了新的虚环境,但是opencv去动态链接时依旧查询pyenv中的环境,导致虚环境中虽然安装了pyenv,但是编译时无法检测到
- 调试时重新运行cmake不生效,应为没有删除之前cmake的结果,必须先rm -rf 所有build目录下的文件
前期后后断断续续的搞了2天,才把坑踩平,总算是踩平了
您必须登录才能发表评论。