关于linux下编译Opencv已经有许许多多的相关文章,包括一些需要依赖的库,在此不再赘述,本文主要的目的是为了解决在python2 与 python3同时存在时,如何仅编译python3-opencv的方法.
需要使用到的工具链请读者们自行配置,本人在编译时使用的是fedora24 + python 3.5.1 + opencv3.1.
由于在linux下安装gtk-devel时会引入python2的安装,导致在使用cmake时会检测到两个python版本,而cmake会倾向于使用低版本的python,也就是会选择python2,这时我们需要加入参数来修改这个倾向.
<span style="font-family:SimSun;">cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_java=OFF \
-D PYTHON_EXECUTABLE=$(which python3) \
-D OPENCV_EXTRA_MODULES_PATH=<your extra modules path> ..</span>
这里我们关闭编译python2-opencv,因为我们没有安装python2相关的编译依赖库,如果尝试编译会造成错误,况且我们也不是为了编译python2的版本,所以干脆关掉.
配置完后,我们直接执行
# make –j8
大约30分钟左右能完成opencv3.1的编译,效果如下:
这里生成的cv2.cpython-35m-x86_64-linux-gnu.so就是我们编译成功的opencv模块了.现在我们就可以在python3中使用opencv3.1了.
这里附带提一下,如果要编译视频处理模块,需要自行编译ffmpeg,本人在编译的时候使用的是 2.6.9的版本,由于高版本存在函数移除导致opencv编译失败,所以还是老实点用低版本,具体编译可自行百度,或翻墙谷歌.
如果自行编译ffmpeg,那么在编译opencv时还会遇到静态库在链接中产生的无法重定位的错误.可以这样解决.
在编译ffmpeg前使用此种参数
# ./configure --enable-shared --disable-static
# make –j8 && make install
我们使用共享库来完成opencv的编译,这时需要修改opencv源码目录下有个叫OpenCVFindLibsVideo.cmake的文件.
# sed -i -e's/libavformat\.a/libavformat.so/g' \
-e 's/libavutil\.a/libavutil.so/g' \
-e 's/libswscale\.a/libswscale.so/g' \
-e's/libavresample\.a/libavresample.so/g' \
-e 's/libavcodec\.a/libavcodec.so/g' \
OpenCVFindLibsVideo.cmake
这条命令是用于替换cmake中的文本,将对(*.a)的依赖改为对(*.so)的依赖,也就是使用动态库完成链接.
这样编译就不会出现不能重定位的错误.
opencv 与cmake的安装过程可以参考文章: http://docs.opencv.org/3.1.0/dd/dd5/tutorial_py_setup_in_fedora.html#gsc.tab=0