ubuntu16.04 编译 opencv3.1.0 (Anaconda)

前端之家收集整理的这篇文章主要介绍了ubuntu16.04 编译 opencv3.1.0 (Anaconda)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在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:

  1. $ wget https://github.com/opencv/opencv/archive/3.1.0.zip # 从github上直接下载或者clone也行
  2. $ wget https://github.com/opencv/opencv_contrib/archive/3.1.0.zip

安装依赖包:

  1. $ sudo apt-getinstallbuild-essential
  2. $ sudo apt-getinstall cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
  3. $ sudo apt-getinstall python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev # 处理图像所需的包
  4. $ sudo apt-getinstall libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
  5. $ sudo apt-getinstall libxvidcore-dev libx264-dev # 处理视频所需的包
  6. $ sudo apt-getinstall libatlas-base-dev gfortran # 优化opencv功能
  7. $ sudo apt-getinstall ffmpeg

解压opencv包:(先看完整个3操作,再运行命令~~

  1. $ cd opencv-3.2.0
  2. $ mkdir build$ cd build
  3. $ cmake -D CMAKE_BUILD_TYPE=RELEASE \
  4. -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后面的空格去掉在执行一次。
  5.  
  6. $ make -j4
  7. $ sudo makeinstall
  8. $ sudo /bin/bash -c'echo "/home/fanzong/anaconda2/envs/tensorflow/lib" > /etc/ld.so.conf.d/opencv.conf'
  9. $ 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中的很多参数

我的全做法是:

  1. cd */opencv-3.1.0
  2. mkdir build
  3. cd build/
  4. cmake -D CMAKE_BUILD_TYPE=RELEASE \
  5. -D CMAKE_INSTALL_PREFIX=/home/luo/anaconda2/ \ -D PYTHON_EXCUTABLE=/home/luo/anaconda2/bin/python ..
  6. make -j4 # 4代表4个线程并行编译
  7. sudo make install
  1. 由于sudo /bin/bash -c'echo "/home/fanzong/anaconda2/envs/tensorflow/lib" > /etc/ld.so.conf.d/opencv.conf'sudo ldconfig后,
  2. 我的电脑就会重启失败(或说打不开其他窗口),这是因为链接库发生错乱连接。
  3. 此处我直接不执行这两行。
  4. 如果已经执行了这两行,然后其他窗口已经打不开了,就在当前terminal中去把/etc/ld.so.conf.d/opencv.conf那行删掉,然后再sudo ldconfig
  5. 如果已经重启失败(一直卡在ubuntu不动,提示什么 see 'systemctl' status systemd-logind.service for details,那就从u盘启动盘进去,去在系统开机启动执行文件中加入一些代码,将那行删掉并sudo ldconfig
  6. 由于少执行这两行,导致opencv启动时候缺乏库(可以去pythonimport cv2看看),这时候需要把对应的库复制到对应环境中。
  7. 详情请看我的代码步骤。
  1. 在python中import cv2 时候出错
  1. >>> import cv2
  2. Traceback (most recent call last):
  3. File "<stdin>",line 1,in <module>
  4. 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)
  5. >
  1. 查阅说libstdc++.so.6 链接link)的对象版本不对(太低或者太高)
  2. 此处的libstdc++.so.6 -> libstdc++.so.6.0.19
  3. 而查/usr/lib/中的含有高版本的libstdc++.so.6.0.21
  4. 现在想把~/anaconda2/lib/和~/anaconda2/pkgs/libgcc-4.8.5-2/lib/中的libstdc++.solibstdc++.so.6 的软链接指向6.0.21而非6.0.19 (将/usr/lib的复制过去)
  5. 让后对复制过去的6.0.21修改权限755(和原本的6.0.19一样)
  6.  
  7.  
  8. 现在测试是否可行。
  9. 发现应该可行,不过出现了另外一个错误,看2.

2: 第二次import cv2 出错

  1. >>> import cv2
  2. Traceback (most recent call last):
  3. File "<stdin>",in <module>
  4. 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)
  1. 看起来应该是anconda2中的*.so.*都有点旧。需要更新,或者直接修改 此处想将一个个按1方法,复制、修改link修改权限,来解决
  2.  
  3. 查看 http://blog.csdn.net/sinat_33621733/article/details/53710868 也遇到1和2问题,1 问题的解决方法与我做法一致。(我想不复制,直接软链接过来会不会更好点?也怕乱呃其实)
  4.  
  5. 链接中说2问题解决方法1一致。虽然我也这么想,但是在2find出来的只有一个版本,并没有说版本先后。
  6.  
  7. 我先看看两个文件是不是一样的,如果一样,再去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. 上述所说的操作1
  2.  
  3. luo@nango:~/Tools/opencv-3.1.0$ find /home/luo/anaconda2/ -name *libstdc++.so*
  4. /home/luo/anaconda2/pkgs/libgcc-4.8.5-2/lib/libstdc++.so
  5. /home/luo/anaconda2/pkgs/libgcc-4.8.5-2/lib/libstdc++.so.6
  6. /home/luo/anaconda2/pkgs/libgcc-4.8.5-2/lib/libstdc++.so.6.0.19
  7. /home/luo/anaconda2/lib/libstdc++.so
  8. /home/luo/anaconda2/lib/libstdc++.so.6
  9. /home/luo/anaconda2/lib/libstdc++.so.6.0.19
  10. luo@nango:~/Tools/opencv-3.1.0$ ls
  11. 3rdparty build CMakeLists.txt data HowToInstall LICENSE platforms samples
  12. apps cmake CONTRIBUTING.md doc include modules README.md
  13. luo@nango:~/Tools/opencv-3.1.0$ find /usr/lib/ -name libstdc++.so*
  14. /usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.so
  15. /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
  16. /usr/lib/x86_64-linux-gnu/libstdc++.so.6
  17. luo@nango:~/Tools/opencv-3.1.0$ ls -al /usr/lib/x86_64-linux-gnu/libstdc++.so*
  18. lrwxrwxrwx 1 root root 19 9 7 18:27 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 -> libstdc++.so.6.0.21
  19. -rw-r--r-- 1 root root 1566440 11 3 2016 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
  20. luo@nango:~/Tools/opencv-3.1.0$ ls -al ~/anaconda2/lib/libstdc++.so*
  21. lrwxrwxrwx 1 luo luo 19 9 7 21:21 /home/luo/anaconda2/lib/libstdc++.so -> libstdc++.so.6.0.19
  22. lrwxrwxrwx 1 luo luo 19 9 7 21:21 /home/luo/anaconda2/lib/libstdc++.so.6 -> libstdc++.so.6.0.19
  23. -rwxr-xr-x 2 luo luo 1055192 9 19 2015 /home/luo/anaconda2/lib/libstdc++.so.6.0.19
  24. luo@nango:~/Tools/opencv-3.1.0$ ls -al ~/anaconda2/pkgs/libstdc++.so*
  25. ls: cannot access '/home/luo/anaconda2/pkgs/libstdc++.so*': No such file or directory
  26. luo@nango:~/Tools/opencv-3.1.0$ ls -al ~/anaconda2/pkgs/libgcc-4.8.5-2/lib/libstdc++.so*
  27. 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
  28. 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
  29. -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
  30. luo@nango:~/Tools/opencv-3.1.0$ cp /usr/lib/x86_64-linux-gnu/libst
  31. libstartup-notification-1.so.0 libstartup-notification-1.so.0.0.0 libstdc++.so.6 libstdc++.so.6.0.21
  32. luo@nango:~/Tools/opencv-3.1.0$ cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 ~/anaconda2/lib/
  33. luo@nango:~/Tools/opencv-3.1.0$ cd ~/anaconda2/lib
  34. luo@nango:~/anaconda2/lib$ rm libstdc++.so
  35. luo@nango:~/anaconda2/lib$ ln -s libstdc++.so.6.0.
  36. libstdc++.so.6.0.19 libstdc++.so.6.0.21
  37. luo@nango:~/anaconda2/lib$ ln -s libstdc++.so.6.0.21 libstdc++.so
  38. luo@nango:~/anaconda2/lib$ rm libstdc++.so.6
  39. luo@nango:~/anaconda2/lib$ ln -s libstdc++.so.6.0.21 libstdc++.so.6
  40. luo@nango:~/anaconda2/lib$ ls -al libstdc++.so*
  41. lrwxrwxrwx 1 luo luo 19 9 8 15:40 libstdc++.so -> libstdc++.so.6.0.21
  42. lrwxrwxrwx 1 luo luo 19 9 8 15:40 libstdc++.so.6 -> libstdc++.so.6.0.21
  43. -rwxr-xr-x 2 luo luo 1055192 9 19 2015 libstdc++.so.6.0.19
  44. -rw-r--r-- 1 luo luo 1566440 9 8 15:39 libstdc++.so.6.0.21
  45. luo@nango:~/anaconda2/lib$ vim libstdc++.so
  46. luo@nango:~/anaconda2/lib$ cd ../pkgs/
  47. luo@nango:~/anaconda2/pkgs$ ls -al libstdc++.so*
  48. ls: cannot access 'libstdc++.so*': No such file or directory
  49. luo@nango:~/anaconda2/pkgs$ ls -al ./libstdc++.so*
  50. ls: cannot access './libstdc++.so*': No such file or directory
  51. luo@nango:~/anaconda2/pkgs$ cd libgcc-4.8.5-2/lib/
  52. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ls -al libstdc++.so*
  53. lrwxrwxrwx 1 luo luo 19 9 20 2016 libstdc++.so -> libstdc++.so.6.0.19
  54. lrwxrwxrwx 1 luo luo 19 9 20 2016 libstdc++.so.6 -> libstdc++.so.6.0.19
  55. -rwxr-xr-x 2 luo luo 1055192 9 19 2015 libstdc++.so.6.0.19
  56. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 ./
  57. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ rm libstdc++.so
  58. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ln -s libstdc++.so.6.0.21 libstdc++.so
  59. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ln -s libstdc++.so.6.0.21 libstdc++.so.6
  60. ln: Failed to create symbolic link 'libstdc++.so.6': File exists
  61. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ rm libstdc++.so.6
  62. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ln -s libstdc++.so.6.0.21 libstdc++.so.6
  63. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ls -al libstdc++.so*
  64. lrwxrwxrwx 1 luo luo 19 9 8 15:43 libstdc++.so -> libstdc++.so.6.0.21
  65. lrwxrwxrwx 1 luo luo 19 9 8 15:43 libstdc++.so.6 -> libstdc++.so.6.0.21
  66. -rwxr-xr-x 2 luo luo 1055192 9 19 2015 libstdc++.so.6.0.19
  67. -rw-r--r-- 1 luo luo 1566440 9 8 15:42 libstdc++.so.6.0.21
  68. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ sudo chmod 755 libstdc++.so.6.0.21
  69. [sudo] password for luo:
  70. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ls -al libstdc++.so*
  71. lrwxrwxrwx 1 luo luo 19 9 8 15:43 libstdc++.so -> libstdc++.so.6.0.21
  72. lrwxrwxrwx 1 luo luo 19 9 8 15:43 libstdc++.so.6 -> libstdc++.so.6.0.21
  73. -rwxr-xr-x 2 luo luo 1055192 9 19 2015 libstdc++.so.6.0.19
  74. -rwxr-xr-x 1 luo luo 1566440 9 8 15:42 libstdc++.so.6.0.21
  75. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ sudo chmod 755 ../../llibstdc++.so.6.0.21
  76. lazy-object-proxy-1.2.2-py27_0/ libpng-1.6.27-0/ libxml2-2.9.4-0/ locket-0.2.0-py27_1/
  77. libffi-3.2.1-1/ libsodium-1.0.10-0/ libxslt-1.1.29-0/ lxml-3.7.3-py27_0/
  78. libgcc-4.8.5-2/ libtiff-4.0.6-3/ llvmlite-0.18.0-py27_0/
  79. libgfortran-3.0.0-1/ libtool-2.4.2-0/ llvmlite-0.19.0-py27_0/
  80. libiconv-1.14-0/ libxcb-1.12-1/ llvmlite-0.19.0-py27_0.tar.bz2
  81. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ sudo chmod 755 ~/anaconda2/lib/libstdc++.so.6.0.21
  82. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ls -al ~/anaconda2/lib/libstdc++.so*
  83. lrwxrwxrwx 1 luo luo 19 9 8 15:40 /home/luo/anaconda2/lib/libstdc++.so -> libstdc++.so.6.0.21
  84. lrwxrwxrwx 1 luo luo 19 9 8 15:40 /home/luo/anaconda2/lib/libstdc++.so.6 -> libstdc++.so.6.0.21
  85. -rwxr-xr-x 2 luo luo 1055192 9 19 2015 /home/luo/anaconda2/lib/libstdc++.so.6.0.19
  86. -rwxr-xr-x 1 luo luo 1566440 9 8 15:39 /home/luo/anaconda2/lib/libstdc++.so.6.0.21
  87. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ vim ~/Tools/opencv-3.1.0/HowToInstall
  88.  
  89. -----------------------------------------------------------------------------------------------------------------
  90.  
  91. 操作2
  92.  
  93. luo@nango:~$ grep -n -r 'GOMP_4.0' /usr/lib/x86_64-linux-gnu/libgomp.so.1
  94. Binary file /usr/lib/x86_64-linux-gnu/libgomp.so.1 matches
  95. luo@nango:~$ grep -n -r -a 'GOMP_4.0' ~/anaconda2/lib/libgomp.so.1
  96. luo@nango:~$ grep -n -r -a 'GOMP_4.0' ~/anaconda2/pkgs/libgcc-4.8.5-2/lib/libgomp.so.1
  97. 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
  98. 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/
  99. luo@nango:~$ cp /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0 ~/anaconda2/pkgs/libgcc-4.8.5-2/lib/
  100. luo@nango:~$ sudo chmod 755 /home/luo/anaconda2/pkgs/libgcc-4.8.5-2/lib/libgomp.so.1.0.0
  101. luo@nango:~$ sudo chmod 755 /home/luo/anaconda2/lib/libgomp.so.1.0.0
  102. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ls -al ../../../lib/libgomp.so*
  103. lrwxrwxrwx 1 luo luo 16 9 7 21:21 ../../../lib/libgomp.so -> libgomp.so.1.0.0
  104. lrwxrwxrwx 1 luo luo 16 9 7 21:21 ../../../lib/libgomp.so.1 -> libgomp.so.1.0.0
  105. -rwxr-xr-x 1 luo luo 138448 9 8 16:29 ../../../lib/libgomp.so.1.0.0
  106. -rwxr-xr-x 2 luo luo 60968 9 19 2015 ../../../lib/libgomp.so.1.0.0.old
  107. luo@nango:~/anaconda2/pkgs/libgcc-4.8.5-2/lib$ ls -al libgomp.so*
  108. lrwxrwxrwx 1 luo luo 16 9 20 2016 libgomp.so -> libgomp.so.1.0.0
  109. lrwxrwxrwx 1 luo luo 16 9 20 2016 libgomp.so.1 -> libgomp.so.1.0.0
  110. -rwxr-xr-x 1 luo luo 138448 9 8 16:29 libgomp.so.1.0.0
  111. -rwxr-xr-x 2 luo luo 60968 9 19 2015 libgomp.so.1.0.0.old

猜你在找的Ubuntu相关文章