文章目录
0. 需要(Science 上网)
1. 环境依赖
sudo apt-get install build-essential
问题:
build-essential : 依赖: libc6-dev 但是它将不会被安装
或 libc-dev依赖: gcc (>= 4:7.2) 但是它将不会被安装
依赖: g++ (>= 4:7.2) 但是它将不会被安装
依赖: dpkg-dev (>= 1.17.11) 但是它将不会被安装
解决:先检查是否换源,如果没有,先换源,再sudo apt-get update.
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
出现的问题:libjasper-dev无法安装的问题
解决:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
2. opencv 3.4.16 下载以及contrib3.4.16付费部分下载
2.1 OpenCV主程序
OpenCV主程序下载地址:
https://opencv.org/releases/
选择source版本
2.2 Opencv_contrib
下载地址:
https://github.com/opencv/opencv_contrib ,此处操作要注意版本一致:
- 点击Branch:master
- 点击Tags
- 选择3.4.16
下载zip压缩包就可以!!!
3. 整理OpenCV源码文件包
(可以随便放了~,只不过下面cmake 需要填写路径)
3.1 我的路径
在/home/你的名字/ 文件夹下建一个opencv文件夹,并且将下载好的两个文件opencv-3.4.16和opencv_contrib3.4.16复制到 /home/你的名字/opencv
在opencv 文件夹下,新建build文件夹
3.2 付费包
找到并打开opencv-3.4.10 文件夹 目录中的CMakeLists.txt文件,搜索OPENCV_ENABLE_NONFREE变量,将后面OFF更改为ON,并保存,此步的作用是打开付费功能。因为在一些新版本上,SIFT、SURF被申请了专利,不能商用,所以需要打开付费功能才能调用这些申请过专利的程序。
4. cmake
在build文件下,执行4.1代码
4.1 代码
cmake -D CMAKE_INSTALL_PREFIX=/usr/local \
-D CMAKE_BUILD_TYPE=Release \
-D OPENCV_ENABLE_NONFREE:BOOL=ON \
-D OPENCV_EXTRA_MODULES_PATH=/home/lessle6/opencv/opencv_contrib-3.4.16/modules \
../opencv-3.4.16
4.2 解释
-D CMAKE_BUILD_TYPE=Release 意思是设置build(编译)的类型为“Release”
-D OPENCV_EXTRA_MODULES_PATH=…/opencv_contrib/modules 意思是增加opencv的额外模块路径为“…/opencv_contrib/modules ” 后面是opencv的主程序源码位置
4.3 踩坑
因为contrib 和主程序版本不对,踩了很多坑!!!
contrib如果版本与opencv版本一致,将不会出现以下问题!!!
浅看一下~
5. make && install
在build文件下,执行:
sudo make -j4
sudo make install
注意:sudo make -j4, 4的意思是用4核线程并行编译
6. 配置动态链接库
任意文件夹执行以下6.1 代码:
6.1 代码
cd /etc/ld.so.conf.d
sudo touch opencv.conf
sudo gedit opencv.conf
#在opencv.conf里面写入:
/usr/local/lib
执行生效命令:
sudo ldconfig
6.1 解释
opencv是一个第三方的库,我们要引用它需要对系统的环境变量进行配置,找到动态链接库。
/etc/ld.so.conf 此文件记录了编译时使用的动态库的路径,也就是加载so库的路径。so? so文件是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据。.so一般是linux的动态链接库,相当于windows的.dll。默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,–prefix会默认将库安装在/usr/local目录下(第4步 编译),如果没有在文件/etc/ld.so.conf中添加/usr/local/lib这个目录。那这样的话,虽然安装了源码包,但是使用时仍然找不到相关的.so库,就会报错。也就是说系统不知道安装了源码包。对于此种情况有2种解决办法:
(1)在用源码安装时,用–prefix指定安装路径为/usr/lib(第4步 编译)这样的话也就不用配置PKG_CONFIG_PATH
(2)直接将路径/usr/local/lib路径加入到文件/etc/ld.so.conf文件的中。在文件/etc/ld.so.conf中末尾直接添加:/usr/local/lib)(当前操作)
如果打开终端查看etc文件夹下面包含ld的文件(ls /etc/ | grep ld)
会发现有三个文件:
ld.so.cache (文件)
ld.so.conf (文件)
ld.so.conf.d (目录)
其中ld.so.conf.d是目录类型的文件,他的下面存放这各种.conf文件,我们刚才写的opencv.conf就在这个目录下ld.so.conf是普通文件类型的文件,打开ld.so.conf会发现里面写着:include /etc/ld.so.conf.d/*.conf 这代表将引用ld.so.conf.d目录下的所有.conf文件这样的话,当操作系统加载动态库时,会首先去读取ld.so.conf文件,然后进入ld.so.conf.d目录下,读取里面所有的配置文件,这些配置文件(比如我们刚才new出来的opencv库路径)内记载着库的路径,这样就可以找到动态库了。但是Linux还有一个缓存机制,为了防止在目录下一层层的找库,Linux会建立一个缓存文件,ld.so.cache,这实际上是一个二进制文件,我们可以通过 cat /etc//ld.so.cache 命令,可以看到里面存储着库的目录,这样一来每当Linux要找库时,就会直接读取ld.so.cache文件,而当我们新增加了库时也要使用sudo ldconfig来进行更新。
7.配置OpenCV环境变量
任意文件夹执行以下7.1 代码:
7.1 代码
sudo gedit /etc/bash.bashrc
在文件的末尾加入:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export LD_LIBRARY_PATH=/usr/local/lib
保存后并执行:
source /etc/bash.bashrc
7.2 解释
在6 计算机已经知道动态库的位置,但是还有一个问题,我们在build一个可执行程序的最后一步,是不是要知道动态库的头文件和库文件在哪里,也就是说要知道这个库的依赖,我们才能真正使用动态库。这一步通过PKG_CONFIG_PATH来完成Opencv动态库依赖的库文件和头文件的配置。
7.3 测试头文件库文件
- 查看opencv头文件:
pkg-config --libs opencv
- 查看opencv库文件:
pkg-config --cflags opencv
8. 测试OpenCV是否成功
查看现在的OPENCV版本:
pkg-config --modversion opencv