mac下用Pyenv+opencv搭建opencv环境

最近图像识别技术越来越成熟了,乘着周末打算跑一个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
安装numpy
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结果可能如下

mac+pyenv+python2+python3+opencv

最后就可以make了

make
make install

漫长的等待后,在输出的lib/下找到生成的python so 库,手动拷贝到自己虚环境的site-package下。之后就可以import cv2了

最后总结一下其中的坑:

  1. pyenv 安装python时没有启动动态链接支持,导致后续opencv无法链接
  2. pyenv中的python环境没有安装numpy
  3. 使用virtualenv创建了新的虚环境,但是opencv去动态链接时依旧查询pyenv中的环境,导致虚环境中虽然安装了pyenv,但是编译时无法检测到
  4. 调试时重新运行cmake不生效,应为没有删除之前cmake的结果,必须先rm -rf 所有build目录下的文件

前期后后断断续续的搞了2天,才把坑踩平,总算是踩平了

关于xu xc

工作两年了,有点懒,完了在写吧
此条目发表在日誌分类目录,贴了, , 标签。将固定链接加入收藏夹。