关键词:pkg-config,cmake,opencv
掌握opencv多版本的安装(编译,make install),pkg-config配置及编译程序,采用cmake来编译opencv项目。
1. 安装多个版本的opencv
多个版本的opencv可以通过apt-get
,源码编译…等各种方式进行
这里我已经通过apt-get,源码编译两种方式安装好了。注意两种方式安装的路径不能一样,这里具体说一下我安装的路径
1.1 apt-get安装的路径
文件在/usr/include/opencv
&& /usr/include/opencv2
,库文件在/usr/lib/
, find_package需要用到的文件在/usr/share/OpenCV/OpenCVConfig.cmake
(为什么不是FINDOpenCV.cmake呢?后面说明)
1.2 源码编译opencv
参考:源码编译opencv
注意: CMAKE_INSTALL_PREFIX != CMAKE_INSTALL_PREFIX=/usr/local, 最好安装在一个自定义的路径,比如:/home/opencv/install
已经就安装好了两个opencv了,但是怎么使用opencv呢?也有两种方式:pkg-config,和cmake
2. pkg-config
pkg-config通过一个**.pc
文件来记录一些变量,其实就是指明opencv的头文件,库文件路径
2.1 配置pkg-config路經
这里,我们使用上面源码安装的opencv,$INSTALL_PATH/lib/pkgconfig
下生成了opencv.pc
文件.
##opencv.pc
# Package Information for pkg-config
prefix=/home/darknet/CM/profile/opencv-3.4.5/install
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.4.5
Libs: -L${exec_prefix}/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_viz -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}
这个文件很重要,里面记录了OpenCV头文件、库文件的路經。需要进行如下配置:
#进入 bash.bashrc
sudo gedit /etc/bash.bashrc
#在文件最后添加如下内容
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
#更新
sudo updatedb
2.2 配置库路經
#打开下列文件
sudo gedit /etc/ld.so.conf.d/opencv.conf
# 添加lib路經
/usr/local/lib
# 更新
sudo ldconfig
2.3 测试
查看opencv版本号:
pkg-config --modversion
2.4 如何使用apt-get的版本呢?
在bash.bashrc
中注释掉PKG_CONFIG_PATH
环境变量,在source
一下就ok了,因为通过apt-get安装的opencv的opencv.pc文件在/usr/lib/x86_64-linux-gnu/pkgconfig/opencv.pc
,该路径在pkg-config的默认搜索路径中,所以不需要再设置
2.5 编译opencv的项目
这种方式比较适合小项目,
gcc Test.c -o Test `pkg-config --cflags --libs opencv`
可以输出cflags opencv
和libs opencv
,可以看到就是头文件的路径和库文件的名字:
3. cmake 方式
cmake方式中使用find_package(OpenCV)
来导入包,那我安装了两个版本的opencv:3.2.0和3.4.5,如何控制采用哪个来编译程序呢?
需要掌握:
- find_package的module,config模式和区别
3.1 module,config模式
这里就不细讲了。
可参考:
2. findpackage默认的搜索路径
来自:https://cmake.org/cmake/help/latest/command/find_package.html,这里的<prefix>
好像是/usr
路径(ubuntu中),U
表示unix系统,w表示windows
<prefix>/ (W)
<prefix>/(cmake|CMake)/ (W)
<prefix>/<name>*/ (W)
<prefix>/<name>*/(cmake|CMake)/ (W)
<prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/ (U)
<prefix>/(lib/<arch>|lib*|share)/<name>*/ (U)
<prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/ (W/U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/ (W/U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (W/U)
3.2 使用apt-get安装的opencv
看了上面两篇博客之后,就知道opencv是采用OpenCVConfig.cmake
文件来使cmake找到的。
那apt-get安装的opencv之后,该文件在/usr/share/OpenCV/OpenCVConfig.cmake
,所以在cmake中直接写:
find_package(OpenCV REQUIRED)
该条命令,实际是采用的config
模式来找的(可以通过查考${OpenCV_DIR}
变量来验证)
可以看到,找到的是/usr
目录下的opencv
3.3 使用手动编译的opencv
- 通过设置<package_name>_DIR来实现
在cmake中加上一句:
# set(OpenCV_DIR $INSTALL_PATH/install/share/OpenCV)
其中的$INSTALL_PATH/install/share/OpenCV
指向的OpenCVConfig.cmake
所在的路径,因为这样设置不会去子目录下找
再次cmake验证一下
- 通过设置<package_name>_ROOT来实现
设置<package_name>_ROOT会去子目录下找OpenCVConfig.cmake
,但是需要在find_package
前额外的设置一句
# cmake_policy(SET CMP0074 NEW)
find_package(OpenCV REQUIRED)
不然会忽略<package_name>_ROOT