在文章开始前首先感谢这篇博文ubuntu+anaconda环境下opencv+contrib源码编译:刚脱坑,写一篇实实在在的编译教程及其作者Synioe,写得非常详细,而且真实可用。中间我出现了一些与Synioe大佬不太一样的小错误,不过最终也都找到了解决方案。
1.下载并安装anaconda,然后创建一个虚拟环境(我将我的新环境命名为caffe,并安装了python3.5;另外很重要的,要安装numpy,用anaconda的命令即可,如我的就是:conda install -n caffe numpy,因为网速的原因,可能会安装失败,没关系,多执行这个命令几次就好,总会成功的)。网上教程很多,这里就不多说了。
2.下载opencv3.1.0和opencv_contrib-3.1.0的source包。网址如下:
opencv_contrib-3.1.0(有zip和tar两种压缩模式,只选其中一种就好)
然后解压缩:首先解压opencv-3.1.0(我解压到了我的 "~/File" 文件夹下),然后将opencv_contrib-3.1.0解压到刚才的opencv-3.1.0下,即目录关系为:~/File/opencv-3.1.0/opencv_contrib-3.1.0。
3.然后对opencv进行编译:
这里也就是我糊涂的地方,我一直想知道,我应该在anaconda新搭建的caffe环境下编译,还是在计算机环境的base中编译呢?在不同的环境中对opencv进行编译,会有区别吗?是不是如果我在base环境下编译,那么就无法链接到caffe环境下的python中呢?
上网查anaconda的讲解,也没有人提到过这个问题。后来经过摸索+猜测,大概明白了:在哪个环境下编译不重要,重要的是编译前的cmake选项要选对,比如python的版本、python存放的路径等等,一定要选对。比如我想对caffe环境下的python3.5安装opencv,那么我在编译opencv的时候,python的路径就一定要选/home/pi(pi是我在ubuntu下的用户名)/anaconda3/envs/caffe/lib/python3.5,而不能选base环境下的python路径。另外还有其他的一些注意事项,等一下再说。
明白了这一点,就可以放心大胆得进行编译了。(但是,以防万一,我以下操作全都是在anaconda新搭建的caffe环境下进行操作的)
首先安装依赖项:这里提一下,依赖项也是在哪个环境下安都可以,因为它最终都会给你安到计算机原本的base环境下。
sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev libxvidcore-dev libx264-dev
这里可能会出现libjasper-dev安装不上的问题,请大家自行上网搜索解决方案,很简单的。
依赖项都安装好后,进入"opencv-3.1.0"文件夹,建立并进入build文件夹:
mkdir build && cd build
然后在build目录下进行编译,首先设置编译前选项:(这一点很重要,再次感谢博主Synioe)
cmake -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_V4L=ON -D WITH_OPENGL=ON -D WITH_VTK=ON -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_EXTRA_MODULES_PATH=/home/pi//File/opencv-3.1.0/opencv_contrib-3.1.0/modules -D WITH_IPP=OFF -D PYTHON_DEFAULT_EXECUTABLE=/home/pi/anaconda3/envs/caffe/lib/python3.5 -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D PYTHON3_EXCUTABLE=/home/pi/anaconda3/envs/caffe/lib/python3.5 -D PYTHON3_INCLUDE_DIR=/home/pi/anaconda3/envs/caffe/include/python3.5m -D PYTHON3_LIBRARY=/home/pi/anaconda3/envs/caffe/lib/libpython3.5m.so.1.0 -D PYTHON_NUMPY_PATH=/home/pi/anaconda3/envs/caffe/lib/python3.5/site-packages -D BUILD_EXAMPLES=ON -D BUILD_LIBPROTOBUF_FROM_SOURCES=ON -D BUILD_opencv_hdf=OFF -D ENABLE_PRECOMPILED_HEADERS=OFF -D BUILD_TESTS=OFF ..
(pi是我在ubuntu下的用户名)
(注意,这一步不是直接复制粘贴就行的,这里面有很多路径,大家要把我的路径修改掉,改称你们电脑中的路径,比如PYTHON3_EXCUTABLE=/home/pi/anaconda3/envs/caffe/lib/python3.5,大家要改称PYTHON3_EXCUTABLE={你的anaconda3所在的文档}/anaconda3/envs/caffe/lib/python3.5)
这一步运行时,会出现一大段文字,一定要确保其中有如下方框中的文字:(路径可以不一样,但一定要有有路径,不能让它显示"NO")
中间如果出现错误,请大家自行百度或google。遇到难解决的问题,多看几篇帖子,总会解决的。
完成以后:
make
sudo make install
sudo ldconfig
4.将opencv关联到anaconda下caffe环境中的python3.5:
搜索cv2.cpython-35m-x86_64-linux-gnu.so文件:
sudo find / -name "cv2.cpython-35m-x86_64-linux-gnu.so"
我这边弹出了两个路径:
/usr/local/lib/python3.5/site-packages/cv2.cpython-35m-x86_64-linux-gnu.so
/home/pi/File/opencv-3.1.0/build/lib/python3/cv2.cpython-35m-x86_64-linux-gnu.so
盲猜第一个,最后发现猜中了(不要问我原因,因为我也不知道)。如果你的路径跟我不一样,反正就选某个python路径下的cv2.cpython-35m-x86_64-linux-gnu.so就对了,不要选其他路径下的(比如我第二个路径是opencv下的,一看就不靠谱:我是要把python关联到opencv,又不是把opencv关联到opencv)。
进入第一个"cv2.cpython-35m-x86_64-linux-gnu.so"的文件夹:
sudo su
cd /usr/local/lib/python3.5/site-packages
将其中的"cv2.cpython-35m-x86_64-linux-gnu.so"复制一份,并改名为"cv2.so":
cp cv2.cpython-35m-x86_64-linux-gnu.so cv2.so
进入你anaconda下caffe环境中python3.5的"site-packages"文件夹,并对上面刚创建的cv2.so建立软链接:
cd home/你的用户名/anaconda3/envs/caffe/lib/python3.5/site-packages
ln -s /usr/local/lib/python3.5/site-packages/cv2.so cv2.so
5.之后,在caffe环境下进入python,尝试import cv2,可能还会出错。比如我的是:
ImportError: libpython3.5m.so.1.0: cannot open shared object file: No such file or directory
这时候,要去找" libpython3.5m.so.1.0"所在的路径(每个人情况不同,你们的可能不是" libpython3.5m.so.1.0"):
sudo find / -name " libpython3.5m.so.1.0"
这时候会出来一到两条路径:假设为 "XXXXXX1","XXXXXX2"。
然后,进入如下文件夹,并新建一个文本opencv.conf:
sudo su
cd /etc/ld.so.conf.d
nano opencv.conf
在打开的文本中写入如下:
/usr/local/lib
XXXXXX1
XXXXXX2
按control + o保存,再按control + x退出,保存后退出,再次输入:
sudo ldconfig -v
然后应该就没问题了。
输入python,然后import cv2尝试一下吧。
=====================================make过程中出现的错误=============================================
以前出现的错误都比较好解决,但是这次出现了一个以前没见过的错误:
modules/core/CMakeFiles/opencv_test_core.dir/build.make:854: recipe for target 'bin/opencv_test_core' failed
make[2]: *** [bin/opencv_test_core] Error 1
CMakeFiles/Makefile2:1960: recipe for target 'modules/core/CMakeFiles/opencv_test_core.dir/all' failed
make[1]: *** [modules/core/CMakeFiles/opencv_test_core.dir/all] Error 2
Makefile:160: recipe for target 'all' failed
make: *** [all] Error 2
经谷歌,是因为anaconda中自带的依赖包libtiff把我安装到电脑的usr/lib中的依赖包libtiff给隐藏了,解决方法是卸载anaconda中的这个依赖包,命令如下:
首先用conda deactive跳出自建的环境,然后运行如下命令 :
conda uninstall libtiff
(中间可能会出现网络错误,需多次尝试)]
命令完成后,用make clean清除之前make生成的文件,然后删除build文件,再重建build文件,重新设置编译前选项,并make.