linux下编译opencv需要cmake,有两种方式,cmake与cmake-gui,这个网上教程很多,但是opencv4版本之后,默认配置是不生成opencv.pc,就导致我们使用起来很困难,所以我们cmake的时候可以先配置一下:
cmake -D WITH_TBB=ON -D WITH_EIGEN=ON -D OPENCV_GENERATE_PKGCONFIG=ON ..
cmake -D BUILD_DOCS=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF ..
cmake -D WITH_OPENCL=OFF -D WITH_CUDA=OFF -D BUILD_opencv_gpu=OFF -D BUILD_opencv_gpuarithm=OFF -D BUILD_opencv_gpubgsegm=O
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
注意一行一行的来,这里其他不配置都无所谓,但是 -D OPENCV_GENERATE_PKGCONFIG=ON这个配置一定要加上,Linux下我们使用opencv,需要使用pkg-config来进行环境变量的管理,这个软件需要.pc类型的文件作为软件配置信息,如果我们不配置,会出现opencv安装成功但是c编程无法使用的情况,Python好像可以直接使用。。,网上有部分教程说可以手写,但是其实很困难,因为库之间是有依赖关系的,所以如果顺序放错也会找不到,最好还是自动生成。
linux下安装opencv4还有以下几个坑:
1.pkg-config配置不全,找不到头文件和库路径
2.系统自带的有opencv2,版本冲突
3.安装成功后没有更新动态库
4.安装配置都成功后,编译示例时没有启用c++11
下附安装步骤;
1.首先安装cmake,用来编译opencv
apt-get install cmake
apt-get install build-essential libgtk2.0-dev libavcodec-dev
apt-get install libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev
Ubuntu下是这样,我的系统自带的有3.9版本的,centos下同样自带的有,不过版本可能是2,opencv4需要3以上的版本,需要更新一下
安装成功后输入
cmake -version
检查cmake是否安装成功
2.接下来安装pkg-config,用来配置环境变量。
apt-get install pkg-config
一般系统都自带的有,可以输入
pkg-config --version
查看pkg-config版本
3.下载opencv,我的版本是4.3.0
将源码包解压,官网上下下来的是zip压缩的
unzip opencv-4.3.0.zip
解压成功后当前目录下有一个opencv-4.3.0 的文件夹,注意控制一下目录,这里解压的目录只是用来编译的目录,清晰易找即可,我的就是在桌面上。
进到opencv-4.3.0中,新建一个目录build
mkdir build
这是由于cmake的语法决定的,cmake需要CMakeLists.txt的文件,然后根据这个文件生成Makefile文件来实现跨平台,具体的cmake语法感兴趣的可以去学习一下
我们进入build目录
cd build
然后使用cmake命令进行配置
cmake -D WITH_TBB=ON -D WITH_EIGEN=ON -D OPENCV_GENERATE_PKGCONFIG=ON -D BUILD_DOCS=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D WITH_OPENCL=OFF -D WITH_CUDA=OFF -D BUILD_opencv_gpu=OFF -D BUILD_opencv_gpuarithm=OFF -D BUILD_opencv_gpubgsegm=O -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
这条命令会在build目录里生成对应配置的Makefile文件,可以看到配置信息之间是通过空格和-D来分割和标示的,配置了很多信息,我觉得比较重要的一个是 -D OPENCV_GENERATE_PKGCONFIG=ON,生成opencv.pc文件的配置(注意,opencv4生成的文件叫做opencv4.pc),另外就是 CMAKE_INSTALL_PREFIX=/usr/local这个关于安装路径的配置,这里的安装路径是在/usr/local下,这也是opencv的默认配置。
千万注意,最后的两个..千万不要删,这个指向CMakeLists.txt所在的目录
此时当前目录仍是build,直接编译安装即可
make install
这里需要sudo权限,也有的同学喜欢先make,在make install ,均可,先make的话可以使用make -j8指定多线程编译,会更快
安装成功后会刷出很多信息,仔细看会发现都是说×××库被安装在×××目录下的,我们这里说明一下:
因为我们指定了安装路径,所以我们的头文件被放在/usr/local/include/opencv4/opencv2/目录下,我们的库文件被放在/usr/local/lib/目录下,可以进去查看一下这些文件是否是否存在。
接下来可以输入
opencv_version
来判定安装成功的opencv版本号,当出现你安装的opencv版本号时,就安装成功了。
4.opencv是一个第三方的库,我们要引用它需要对系统的环境变量进行配置。
vim /etc/ld.so.conf.d/opencv.conf
在文件末尾添加:/usr/local/lib
如果这是我们第一次安装opencv,这个文件可能是个空文件,这里的/usr/local/lib就是我们安装opencv时安装的那些库的目录
将这个文件保存然后
sudo ldconfig
即可。
下为原理分析,不感兴趣的同学可以直接跳到第五步。
如果我们
ls /etc/ | grep ld
会发现在etc下存在这三个文件:
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目录下,读取里面所有的配置文件,这些配置文件内记载着库的路径,这样就可以找到动态库了
但是Linux还有一个缓存机制,为了防止在目录下一层层的找库,Linux会建立一个缓存文件,ld.so.cache,这实际上是一个二进制文件,
cat /etc//ld.so.cache
通过这个命令,可以看到里面存储着库的目录,这样一来每当Linux要找库时,就会直接读取ld.so.cache文件,而当我们新增加了库时也要使用
sudo ldconfig
来进行更新
5.接下来要为我们编写c++程序配置环境变量,我们知道一个c文件编译时首先会预处理,将头文件转换为对应的代码,所以第一步会先去找c文件里引用的头文件,然后生成中间文件,中间文件会去找它依赖的库,然后生成可执行文件,这是第二步,我们需要配置的环境变量主要就是这两个方面。
我们这里使用2步骤时安装成功的pkg-config来进行配置
首先在终端输入
vim /etc/bash.bashrc
然后在文本末尾处添加:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
这里是为pkg-config设置系统环境变量,当pkg-config运行时,他会在他的配置目录下查找.pc文件,找到对应的文件就读取它,pkg-config的默认路径是: /usr/lib/pkgconfig/和/usr/share/pkgconfig/,这里我们新给他添加了一个路径/usr/local/lib/pkgconfig。
然后
source /etc/bash.bashrc
更新一下系统的环境变量
接下来在/usr/local/lib/目录下建立pkgconfig目录,然后将build文件夹下编译生成的opencv4.pc 拷贝进/usr/local/lib/pkgconfig
(可以通过命令行查找opencv4.pc:)
find ./ -name opencv4.pc
然后
pkg-config --cflags opencv4
测试是否配置好环境变量
这里记住两个值: pkg-config --cflags 代表我们安装的头文件路径, pkg-config --libs opencv4代表我们安装的库文件路径
6.环境变量配置好后,进到我们解压opencv包的目录,里面有一个samples文件夹,这个里面全是各种语言的测试
cd opencv-4.3.0/samples/cpp/
进到cpp目录下测试c++使用opencv,随便找一个.cpp文件进行编译
例如:
g++ -o edge edge.cpp `pkg-config --cflags --libs opencv4`
注意这里的两个``是键盘左上方的符号,不是单引号,这代表shell的运行语句
编译成功就代表你的opencv可以使用啦!!!
7.这里谈两个问题,第一个是opencv版本冲突的问题,因为linux自带的opencv是2版本的,所以会出现一些函数未声明的错误
,直接将2版本的卸载就行了。
sudo apt-get autoremove libopencv-dev
我直接用了这个命令,反正如果卸多了再重新装缺失的包就行了
centos下可以先查找opencv相关的包,因为我们编译安装的是不会在包管理器中的,所以出现的一定是系统自带的包
yum list installed *opencv*
然后把出现的包卸载就行了
第二个问题是opencv需要c++11支持的问题,报错中会有体现,如果有同学的编译信息过多不好直接找报错,可以
g++ -o egde egde.cpp `pkg-config --cflags --libs opencv4` 2> error
这样当前目录下会出现一个error的文件,vim打开再分析就可以
如果是c++11的问题,直接在编译命令后加上-std=c++11,或者将g++更新到最新版本即可