Opencv3.3(Linux)编译安装至python的坑
编译安装OpenCV绝对是一件让人发狂的事情,CMake繁多的选项,国内蛋疼的网速,实在让人无力吐槽,然而为了使用contrib包,我不得不重新编译他。
OpenCV的编译
其实OpenCV编译并不是很难,但是国内蛋疼的网速实在令人无法忍受,首先简述一下编译过OpenCV的过程
我的编译环境是deepin15
准备工作
首先我们用apt安装必备的库(虽然大部分我在之前已经安装过了 orz)
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
以下是可选包
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
建议大家在官方文档多看下相关的参数和你需要的语言环境,根据自己具体需要来安装自己需要的包
创建自己的工作目录,cd进去clone这两个库
cd ~/<my_working_directory>
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
这里需要注意,opencv和contrib必须对应否则编译会失败,因此我此处clone了最新的
opencv这两个库都相当大,而github的速度相当慢,有一种方法是使用coding.net 或者Oschina导入然后clone,
我在此处通过改CDN来解决访问不稳定的问题
使用CMAKE从源码构建项目
1.创建临时目录用来存储我们编译后的opencv库,你可以随意命名,我这用<cmake_build_dir>来表示这个目录。
cd ~/opencv
mkdir build
cd build
2.构建项目
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
这里列举了最基础的两个参数,编译类型和安装目录。
我这里推荐使用cmake-gui来构建,他能清晰列出可选参数,根据自己需求选择就行。
安装cmake-gui
sudo apt-get install cmake-qt-gui
cmake-gui
这里不多赘述cmake-gui的使用,只是列出我使用的参数
cmake -D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES=../../opencv_contrib/modules \
-D WITH_LIBV4L=ON \
-D WITH_CUDA=OFF \
..
稍微解释一下,我之前使用pytorch等深度学习库时,安装过CUDA,但是cmake的自动配置有问题,因此我关闭了CUDA,使用默认的OPENCL
LIBV4L是因为构建时找不到videoio.h这个库,因此可以使用下面的命令来解决
sudo apt-get install libv4l-dev
若是还不能解决可以加入WITH_V4L=OFF这个参数
3.python相关的参数
若是想指定你的python库安装路径请在此处指定参数
PYTHON2(3)_EXECUTABLE = <path to python>#python执行路径
PYTHON_INCLUDE_DIR = /usr/include/python<version>#python库所在路径
PYTHON_INCLUDE_DIR2 = /usr/include/x86_64-linux-gnu/python<version>
PYTHON_LIBRARY = /usr/lib/x86_64-linux-gnu/libpython<version>.so #python本身的动态链接文件
PYTHON2(3)_NUMPY_INCLUDE_DIRS = /usr/lib/python<version>/dist-packages/numpy/core/include/ #NUMPY所在位置
因为每个人之前的环境不一样,你可能要补全一些环境
sudo apt-get install python-numpy
sudo apt-get install python3-numpy
sudo apt-get install libpython-dev libpython3-dev
4.然后就可以等待愉快的配置了。。。。。个头!!!!!!
国内环境实在太他蛋疼了!!!!!!!!!!!!!!!正值大会,我的梯子在开会前一天突然全部变红,更是令人蛋疼
IPPICV就是一个那么令我蛋疼的库,只能直接下载下来放进去了,唉,我的CMAKE配置会将下载的库 放在编译目录的.cache文件夹中,下下来对文件名进行hash放进去就好了,这个库下载的网址是https://raw.githubusercontent.com/opencv/opencv_3rdparty/a62e20676a60ee0ad6581e217fe7e4bada3b95db/ippicv/ippicv_2017u2_lnx_intel64_20170418.tgz
,实践关系我们需要对标自己实际情况进行更改。这个库存的目录在这https://github.com/opencv/opencv_3rdparty,默认的主分支只提供了readme,你需要更改分支到和你opencv对应的分支下载。
参考了这篇文章
ipp_file=ippicv_2017u2_lnx_intel64_20170418.tgz &&
ipp_hash=$(md5sum ../$ipp_file | cut -d" " -f1) &&
ipp_dir=.cache/ippicv &&
mkdir -p $ipp_dir &&
cp ../$ipp_file $ipp_dir/$ipp_hash-$ipp_file
在opencv目录下进行如上命令即可
可能有些人处出现ffmpeg无法下载的情况,一般使用apt大法
sudo apt-get install ffmpeg-dev
基本可以解决
编译与安装
编译
我在此处没有任何问题,直接
make -j4
安装
sudo make install
anaconda安装cv2
在anaconda安装cv2时出现了个神奇的错误,在命令行调用完美,在使用jupyter时却出现问题
安装
其实默认得make install已经将cv2安装至python目录下了,但是我要安装的是anaconda的python,恰巧anaconda的环境变量我是放在系统的python环境变量下的,平时使用source activate root来使用,自然make install并没有进行安装。

我们在此处可以拷贝make这一步生成的opencv的动态链接文件
如图 我们将其拷贝至anaconda默认python的库目录下
cp cv2.cpython-35m-x86_64-linux-gnu.so ~/anaconda3/lib/python3.6/site-packages/cv.so

之后我使用默认的python调用cv完全没有问题,但是奇怪的是在jupyter notebook出现了很奇妙的问题
jupyter notebook import Error
我在jupyter调用cv2时出现import error这一报错
Import error GLIBCXX_3.4.21 not found when importing cv2
大概就是上面这样子的,没有保存当时报错的截图
GLIBCXX的问题是libgcc链接可能在gcc版本更新后链接没更新导致的,一般anaconda使用万能句法
conda install libgcc
但是这次并没有解决,
使用下面句子检查conda默认的libgcc的链接
ldd anaconda3/lib/libstdgcc.so.6
或者
strings anaconda3/lib/libstdgcc.so.6 | grep GLIBCXX
如果缺少对应GLIBCXX,使用软链接进行链接
cd anaconda3/lib/
mv libstdc++.so.6 libstdc++.so.6.old
ln -s /usr/lib64/libstdc++.so.6 libstdc++.so.6
就当我信心满满的打开jupyter使用import cv2时
现实给了我一个狠狠的耳光,import error,这就很尴尬了,到底怎么解决?
更改核
在python的命令行可以运行,jupyter 却没法运行,是不是可能jupyter核设置有些问题?
不同环境下kenels存在的目录可能不同,一下是官方提供的可能的位置.

我的kernel目录在anaconda3/share/jupyter/kernels/,打开anaconda3/share/jupyter/kernels/python3目录下的kenel.json进行编辑
修改前

修改后

打开jupyter notebook 运行 import cv2
一切正常.opencv的编译安装终于结束了
后记
虽然不知道为什么把环境变量的python改成绝对路径就ok了(也许是anaconda的python在环境变量的顺序在系统后面的原因),但是管他呢,我特码再也不想配置opencv了.
GFW真(和谐和谐)
Opencv3.3(Linux)编译安装至python的坑的更多相关文章
- Python3.6编译安装以及python开发之virtualenv与virtualenvwrapper
Python3.6编译安装 下载python源码包 先到安装目录 cd /opt 下载源码包 wget https://www.python.org/ftp/python/3.6.2/Python-3 ...
- Linux编译安装Qt 5.4.1(-qt-xcb是必须要指定的,卸载自带的gcc等)
转载请注明文章:Linux编译安装Qt 5.4.1 出处:多客博图 很久不写文章了,过程很简单,但是操作很多,简单说吧. 前言: 操作系统CentOS 6.6,64位的. 1.安装gcc 4.8.4, ...
- Linux下安装升级python
本文主要是参考帖子,感谢这位博主,我主要是对相关操作进行补充和说明. 本文主要是在linux(centos)下安装Python3.7.1 1.下载安装Python-3.7.1 1) 下载Python- ...
- 【转】linux 编译安装nginx,配置自启动脚本
linux 编译安装nginx,配置自启动脚本 本文章来给各位同学介绍一篇关于linux 编译安装nginx,配置自启动脚本教程,希望有需要了解的朋友可一起来学习学习哦. 在公司的suse服务器装ng ...
- linux 编译安装nginx,配置自启动脚本
本文章来给各位同学介绍一篇关于linux 编译安装nginx,配置自启动脚本教程,希望有需要了解的朋友可一起来学习学习哦. 在公司的suse服务器装nginx,记录下安装过程: 参照这篇文章:Linu ...
- linux 编译安装PHP模块
本文移到:http://www.phpgay.com/Article/detail/classid/6/id/54.html linux 编译安装PHP模块 1.首先你要有你服务器上安装的PHP的版 ...
- [CentOS_7.4]Linux编译安装ffmpeg
[CentOS_7.4]Linux编译安装ffmpeg 安装过程: 下载安装源,配置,编译,安装,设置环境变量. # wget http://www.ffmpeg.org/releases/ffm ...
- 转:Linux 编译安装 Mysql5.7
http://broqiang.com/2017/04/18/Mysql-Install-5.7.18-Linux-Compile/ 原文 Linux 编译安装 Mysql5.7 Ubuntu 下快速 ...
- Linux编译安装Apache+PHP
Linux编译安装Apache+PHP 来自:自学it网,http://www.zixue.it/. 1]编译安装Apache+PHP 1.安装程序依赖库和开发环境 为了省事把所需要的库文件全都安 ...
随机推荐
- .net core webapi添加swagger
依赖项——右键——管理NuGet程序包——浏览——输入以下内容 Install-Package Swashbuckle.AspNetCore -Pre 双击Properties——点击生成——勾选XM ...
- Django前后端分离跨域请求问题
一.问题背景 之前使用django+vue进行前后端分离碰到跨域请求问题,跨域(域名或者端口不同)请求问题的本质是由于浏览器的同源策略导致的,当请求的响应不是处于同一个域名和端口下,浏览器不会接受响应 ...
- HTML5 canvas绘制图形
demo.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- IBM和DoE推出世界上最快的超级计算机
IBM和美国能源部的橡树岭国家实验室今天发布了该部门最新的超级计算机Summit.IBM声称峰会目前是世界上“最强大,最聪明的科学超级计算机”,其峰值性能每秒高达20万亿次.当新的榜单在本月晚些时候发 ...
- JS中算法之排序算法
1.基本排序算法 1.1.冒泡排序 它是最慢的排序算法之一. 1.不断比较相邻的两个元素,如果前一个比后一个大,则交换位置. 2.当比较完第一轮的时候最后一个元素应该是最大的一个. 3.按照步骤一的方 ...
- 转载--关于FPGA设计数字信号处理电路的心得
FPGA使用的越来越广泛,除了可用于设计控制电路以为,数字信号处理电路更是FPGA的强项和难点.个人可以说才刚刚入门FPGA设计,也做过一些数字信号处理方面的电路设计,记录下个人心得体会. (一)善用 ...
- 【BZOJ2639】矩形计算(二维普通莫队)
题意:输入一个n*m的矩阵,矩阵的每一个元素都是一个整数,然后有q个询问,每次询问一个子矩阵的权值. 矩阵的权值是这样定义的,对于一个整数x,如果它在该矩阵中出现了p次,那么它给该矩阵的权值就贡献p^ ...
- 【BZOJ1396】识别子串(后缀自动机,线段树)
题意: 一行,一个由小写字母组成的字符串S,长度不超过10^5 思路:论文题 设p为自动机上的合法结点,r为右端点,len=st[fa[p]]]+1 位置[r-st[p]+1,r-len+1]与r-i ...
- jsp的课设1
记这个为了巩固整个网站的开发流程,java开发太昂贵基本上很少有公司用,不知道学校怎么想的用这个.基本流程适用于任何后台的开发. JDK的安装不提了,Tomcat和Mysql都是用的最新版的,由于是w ...
- servlet3.0 异步处理
转:https://blog.csdn.net/benjamin_whx/article/details/38874657 13.1.概述 计算机的内存是有限的.Servlet/JSP容器的设计者很清 ...