在Anaconda环境中编译opencv3并能让python2.7调用。
这一年倾向于写有道云笔记,懒得写博客。
写得有点超级无敌乱,将就看看吧。我只是想用opencv从电影中提取人脸图片而已= = (打草稿的一篇博客 ort . .
建议下载完整的opencv源码进行编译,而不要用pip install opencv-python
也不要用conda install opencv=3.1.0 (总有一些麻烦惹上来)
参考链接:http://www.cnblogs.com/arkenstone/p/6490017.html
下载opencv 3.1.0:
$ wget https://github.com/opencv/opencv/archive/3.1.0.zip # 从github上直接下载或者clone也行
$ wget https://github.com/opencv/opencv_contrib/archive/3.1.0.zip
安装依赖包:
$ sudo apt-getinstallbuild-essential
$ sudo apt-getinstall cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-getinstall python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev # 处理图像所需的包
$ sudo apt-getinstall libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
$ sudo apt-getinstall libxvidcore-dev libx264-dev # 处理视频所需的包
$ sudo apt-getinstall libatlas-base-dev gfortran # 优化opencv功能
$ sudo apt-getinstall ffmpeg
解压opencv包:(先看完整个3操作,再运行命令~~
$ cd opencv-3.2.0
$ mkdir build$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/home/fanzong/anaconda2/envs/tensorflow \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.2.0/modules \
-D PYTHON_EXCUTABLE=/home/fanzong/anaconda2/envs/tensorflow/bin/python \
-D WITH_TBB=ON \
-D WITH_V4L=ON \
-D WITH_QT=ON \ #1
-D WITH_GTK=ON \
-D WITH_OPENGL=ON \
-D BUILD_EXAMPLES=ON ..
# cmake命令的使用方式:cmake [<some optional parameters>] <pathto the OpenCVsourcedirectory>。如果命令报错的话可以试着把-D后面的空格去掉在执行一次。
$ make -j4
$ sudo makeinstall
$ sudo /bin/bash -c'echo "/home/fanzong/anaconda2/envs/tensorflow/lib" > /etc/ld.so.conf.d/opencv.conf'
$ sudo ldconfig
以上是参考链接里面的操作,而我的编译与他点点不一样:
1. opencv全称、路径不同,OPENCV_EXTRA_MODULES_PATH是额外包,比如SIFT和SURF等那些被申请专利的都在这个包里面。
2. 我将opencv3.1.0装到anaconda中的/home/luo/anaconda2/bin/python
中,即CMAKE_INSTALL_PREFIX和PYTHON_EXCUTABLE都要改变
3. 由于我加入extra包会出现编译错误,且目前还不需要用到extra包内的方法,我最后去掉了OPENCV_EXTRA_MODULES_PATH,也去掉了cmake中的很多参数。
我的全做法是:
cd */opencv-3.1.0
mkdir build
cd build/
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/home/luo/anaconda2/ \
-D PYTHON_EXCUTABLE=/home/luo/anaconda2/bin/python ..
make -j4 # 4代表4个线程并行编译
sudo make install
由于sudo /bin/bash -c'echo "/home/fanzong/anaconda2/envs/tensorflow/lib" > /etc/ld.so.conf.d/opencv.conf',sudo ldconfig后,
我的电脑就会重启失败(或说打不开其他窗口),这是因为链接库发生错乱连接。
此处我直接不执行这两行。
如果已经执行了这两行,然后其他窗口已经打不开了,就在当前terminal中去把/etc/ld.so.conf.d/opencv.conf那行删掉,然后再sudo ldconfig。
如果已经重启失败(一直卡在ubuntu不动,提示什么 see 'systemctl' status systemd-logind.service for details ,那就从u盘启动盘进去,去在系统开机启动执行文件中加入一些代码,将那行删掉并sudo ldconfig
由于少执行这两行,导致opencv启动时候缺乏库(可以去python中import cv2看看),这时候需要把对应的库复制到对应环境中。
详情请看我的代码步骤。
- 在python中import cv2 时候出错
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /home/luo/anaconda2/lib/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /home/luo/anaconda2/lib/python2.7/site-packages/cv2.so)
>
查阅说libstdc++.so.6 所链接(link)的对象版本不对(太低或者太高)
此处的libstdc++.so.6 -> libstdc++.so.6.0.19
而查/usr/lib/中的含有高版本的libstdc++.so.6.0.21
现在想把~/anaconda2/lib/和~/anaconda2/pkgs/libgcc-4.8.5-2/lib/中的libstdc++.so和libstdc++.so.6 的软链接指向6.0.21而非6.0.19 (将/usr/lib的复制过去)
让后对复制过去的6.0.21修改权限755(和原本的6.0.19一样)
现在测试是否可行。
发现应该可行,不过出现了另外一个错误,看2.
2: 第二次import cv2 出错
>>> import cv2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /home/luo/anaconda2/lib/libgomp.so.1: version `GOMP_4.0' not found (required by /usr/lib/x86_64-linux-gnu/libsoxr.so.0)
看起来应该是anconda2中的*.so.*都有点旧。需要更新,或者直接修改? 此处想将一个个按1方法,复制、修改link、修改权限,来解决。
查看 http://blog.csdn.net/sinat_33621733/article/details/53710868 也遇到1和2问题,1 问题的解决方法与我做法一致。(我想不复制,直接软链接过来会不会更好点?也怕乱呃其实)
链接中说2问题解决方法和1一致。虽然我也这么想,但是在2中find出来的只有一个版本,并没有说版本先后。
我先看看两个文件是不是一样的,如果一样,再去apt-get 更新下,看看/usr/lib*中会不会有新的版本出现。
发现/usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0和~/anaconda/lib/libgomp.so.1.0.0以及/home/luo/anaconda2/pkgs/libgcc-4.8.5-2/lib/libgomp.so.1.0.0不一样(后两者文件大小比较小,前者大)
且最重要的,前者能够匹配出’GOMP_4.0’,而后两个不包含这个字符串。
(采用grep -n -r -a ‘GOMP_4.0’ /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0 匹配出(-n 输出行号,-r 递归文件夹,-a 将 binary 文件以 text 文件的方式搜寻数据。 在grep ~/anaconda/*中匹配不了)
现在采用将后两者删掉,用前者替换。(注意权限要一致,我先把后两者修改下名称。软链接不变
在python import cv2
成功。
下面的是我在teiminal中复制出来的过程:
上述所说的操作1:
luo@nango:~/Tools/opencv-3.1.0$ find /home/luo/anaconda2/ -name *libstdc++.so*
/home/luo/anaconda2/pkgs/libgcc-4.8.5-2/lib/libstdc++.so
/home/luo/anaconda2/pkgs/libgcc-4.8.5-2/lib/libstdc++.so.6
/home/luo/anaconda2/pkgs/libgcc-4.8.5-2/lib/libstdc++.so.6.0.19
/home/luo/anaconda2/lib/libstdc++.so
/home/luo/anaconda2/lib/libstdc++.so.6
/home/luo/anaconda2/lib/libstdc++.so.6.0.19
luo@nango:~/Tools/opencv-3.1.0$ ls
3rdparty build CMakeLists.txt data HowToInstall LICENSE platforms samples
apps cmake CONTRIBUTING.md doc include modules README.md
luo@nango:~/Tools/opencv-3.1.0$ find /usr/lib/ -name libstdc++.so*
/usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.so
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
luo@nango:~/Tools/opencv-3.1.0$ ls -al /usr/lib/x86_64-linux-gnu/libstdc++.so*
lrwxrwxrwx 1 root root 19 9月 7 18:27 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 -> libstdc++.so.6.0.21
-rw-r--r-- 1 root root 1566440 11月 3 2016 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
luo@nango:~/Tools/opencv-3.1.0$ ls -al ~/anaconda2/lib/libstdc++.so*
lrwxrwxrwx 1 luo luo 19 9月 7 21:21 /home/luo/anaconda2/lib/libstdc++.so -> libstdc++.so.6.0.19
lrwxrwxrwx 1 luo luo 19 9月 7 21:21 /home/luo/anaconda2/lib/libstdc++.so.6 -> libstdc++.so.6.0.19
-rwxr-xr-x 2 luo luo 1055192 9月 19 2015 /home/luo/anaconda2/lib/libstdc++.so.6.0.19
luo@nango:~/Tools/opencv-3.1.0$ ls -al ~/anaconda2/pkgs/libstdc++.so*
ls: cannot access '/home/luo/anaconda2/pkgs/libstdc++.so*': No such file or directory
luo@nango:~/Tools/opencv-3.1.0$ ls -al ~/anaconda2/pkgs/libgcc-4.8.5-2/lib/libstdc++.so*
lrwxrwxrwx 1 luo luo 19 9月 20 2016 /home/luo/anaconda2/pkgs/libgcc-4.8.5-2/lib/libstdc++.so -> libstdc++.so.6.0.19
lrwxrwxrwx 1 luo luo 19 9月 20 2016 /home/luo/anaconda2/pkgs/libgcc-4.8.5-2/lib/libstdc++.so.6 -> libstdc++.so.6.0.19
-rwxr-xr-x 2 luo luo 1055192 9月 19 2015 /home/luo/anaconda2/pkgs/libgcc-4.8.5-2/lib/libstdc++.so.6.0.19
luo@nango:~/Tools/opencv-3.1.0$ cp /usr/lib/x86_64-linux-gnu/libst
libstartup-notification-1.so.0 libstartup-notification-1.so.0.0.0 libstdc++.so.6 libstdc++.so.6.0.21
luo@nango:~/Tools/opencv-3.1.0$ cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 ~/anaconda2/lib/
luo@nango:~/Tools/opencv-3.1.0$ cd ~/anaconda2/lib
luo@nango:~/anaconda2/lib$ rm libstdc++.so
luo@nango:~/anaconda2/lib$ ln -s libstdc++.so.6.0.
libstdc++.so.6.0.19 libstdc++.so.6.0.21
luo@nango:~/anaconda2/lib$ ln -s libstdc++.so.6.0.21 libstdc++.so
luo@nango:~/anaconda2/lib$ rm libstdc++.so.6
luo@nango:~/anaconda2/lib$ ln -s libstdc++.so.6.0.21 libstdc++.so.6
luo@nango:~/anaconda2/lib$ ls -al libstdc++.so*
lrwxrwxrwx 1 luo luo 19 9月 8 15:40 libstdc++.so -> libstdc++.so.6.0.21
lrwxrwxrwx 1 luo luo 19 9月 8 15:40 libstdc++.so.6 -> libstdc++.so.6.0.21
-rwxr-xr-x 2 luo luo 1055192 9月 19 2015 libstdc++.so.6.0.19
-rw-r--r-- 1 luo luo 1566440 9月 8 15:39 libstdc++.so.6.0.21
luo@nango:~/anaconda2/lib$ vim libstdc++.so
luo@nango:~/anaconda2/lib$ cd ../pkgs/
luo@nango:~/anaconda2/pkgs$ ls -al libstdc++.so*
ls: cannot access 'libstdc++.so*': No such file or directory
luo@nango:~/anaconda2/pkgs$ ls -al ./libstdc++.so*
ls: cannot access './libstdc++.so*': No such file or directory
luo@nango:~/anaconda2/pkgs$ cd libgcc-4.8.5-2/lib/
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ls -al libstdc++.so*
lrwxrwxrwx 1 luo luo 19 9月 20 2016 libstdc++.so -> libstdc++.so.6.0.19
lrwxrwxrwx 1 luo luo 19 9月 20 2016 libstdc++.so.6 -> libstdc++.so.6.0.19
-rwxr-xr-x 2 luo luo 1055192 9月 19 2015 libstdc++.so.6.0.19
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 ./
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ rm libstdc++.so
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ln -s libstdc++.so.6.0.21 libstdc++.so
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ln -s libstdc++.so.6.0.21 libstdc++.so.6
ln: failed to create symbolic link 'libstdc++.so.6': File exists
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ rm libstdc++.so.6
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ln -s libstdc++.so.6.0.21 libstdc++.so.6
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ls -al libstdc++.so*
lrwxrwxrwx 1 luo luo 19 9月 8 15:43 libstdc++.so -> libstdc++.so.6.0.21
lrwxrwxrwx 1 luo luo 19 9月 8 15:43 libstdc++.so.6 -> libstdc++.so.6.0.21
-rwxr-xr-x 2 luo luo 1055192 9月 19 2015 libstdc++.so.6.0.19
-rw-r--r-- 1 luo luo 1566440 9月 8 15:42 libstdc++.so.6.0.21
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ sudo chmod 755 libstdc++.so.6.0.21
[sudo] password for luo:
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ls -al libstdc++.so*
lrwxrwxrwx 1 luo luo 19 9月 8 15:43 libstdc++.so -> libstdc++.so.6.0.21
lrwxrwxrwx 1 luo luo 19 9月 8 15:43 libstdc++.so.6 -> libstdc++.so.6.0.21
-rwxr-xr-x 2 luo luo 1055192 9月 19 2015 libstdc++.so.6.0.19
-rwxr-xr-x 1 luo luo 1566440 9月 8 15:42 libstdc++.so.6.0.21
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ sudo chmod 755 ../../llibstdc++.so.6.0.21
lazy-object-proxy-1.2.2-py27_0/ libpng-1.6.27-0/ libxml2-2.9.4-0/ locket-0.2.0-py27_1/
libffi-3.2.1-1/ libsodium-1.0.10-0/ libxslt-1.1.29-0/ lxml-3.7.3-py27_0/
libgcc-4.8.5-2/ libtiff-4.0.6-3/ llvmlite-0.18.0-py27_0/
libgfortran-3.0.0-1/ libtool-2.4.2-0/ llvmlite-0.19.0-py27_0/
libiconv-1.14-0/ libxcb-1.12-1/ llvmlite-0.19.0-py27_0.tar.bz2
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ sudo chmod 755 ~/anaconda2/lib/libstdc++.so.6.0.21
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ls -al ~/anaconda2/lib/libstdc++.so*
lrwxrwxrwx 1 luo luo 19 9月 8 15:40 /home/luo/anaconda2/lib/libstdc++.so -> libstdc++.so.6.0.21
lrwxrwxrwx 1 luo luo 19 9月 8 15:40 /home/luo/anaconda2/lib/libstdc++.so.6 -> libstdc++.so.6.0.21
-rwxr-xr-x 2 luo luo 1055192 9月 19 2015 /home/luo/anaconda2/lib/libstdc++.so.6.0.19
-rwxr-xr-x 1 luo luo 1566440 9月 8 15:39 /home/luo/anaconda2/lib/libstdc++.so.6.0.21
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ vim ~/Tools/opencv-3.1.0/HowToInstall
-----------------------------------------------------------------------------------------------------------------
操作2:
luo@nango:~$ grep -n -r 'GOMP_4.0' /usr/lib/x86_64-linux-gnu/libgomp.so.1
Binary file /usr/lib/x86_64-linux-gnu/libgomp.so.1 matches
luo@nango:~$ grep -n -r -a 'GOMP_4.0' ~/anaconda2/lib/libgomp.so.1
luo@nango:~$ grep -n -r -a 'GOMP_4.0' ~/anaconda2/pkgs/libgcc-4.8.5-2/lib/libgomp.so.1
luo@nango:~$ mv ~/anaconda2/pkgs/libgcc-4.8.5-2/lib/libgomp.so.1.0.0 ~/anaconda2/pkgs/libgcc-4.8.5-2/lib/libgomp.so.1.0.0.old
luo@nango:~$ mv ~/anaconda2/lib/libgomp.so.1.0.0 ~/anaconda2/lib/libgomp.so.1.0.0.oldluo@nango:~$ cp /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0 ~/anaconda2/lib/
luo@nango:~$ cp /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0 ~/anaconda2/pkgs/libgcc-4.8.5-2/lib/
luo@nango:~$ sudo chmod 755 /home/luo/anaconda2/pkgs/libgcc-4.8.5-2/lib/libgomp.so.1.0.0
luo@nango:~$ sudo chmod 755 /home/luo/anaconda2/lib/libgomp.so.1.0.0
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ls -al ../../../lib/libgomp.so*
lrwxrwxrwx 1 luo luo 16 9月 7 21:21 ../../../lib/libgomp.so -> libgomp.so.1.0.0
lrwxrwxrwx 1 luo luo 16 9月 7 21:21 ../../../lib/libgomp.so.1 -> libgomp.so.1.0.0
-rwxr-xr-x 1 luo luo 138448 9月 8 16:29 ../../../lib/libgomp.so.1.0.0
-rwxr-xr-x 2 luo luo 60968 9月 19 2015 ../../../lib/libgomp.so.1.0.0.old
luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ls -al libgomp.so*
lrwxrwxrwx 1 luo luo 16 9月 20 2016 libgomp.so -> libgomp.so.1.0.0
lrwxrwxrwx 1 luo luo 16 9月 20 2016 libgomp.so.1 -> libgomp.so.1.0.0
-rwxr-xr-x 1 luo luo 138448 9月 8 16:29 libgomp.so.1.0.0
-rwxr-xr-x 2 luo luo 60968 9月 19 2015 libgomp.so.1.0.0.old