如何在CMake项目中引入OpenCV

一、OpenCV下载

  1. opencv下载地址
  2. opencv_contrib下载地址
    注意opencv以及opencv_contrib的版本最好对应

二、OpenCV编译安装

2.1 cmake编译安装

下载下来后,进入源码目录(即CMakeLists.txt的同级目录)

  1. 新建build目录
mkdir build
  1. 运行cmake命令,注意针对OpenCV的编译,该命令有许多选项,这里仅给出我自己常用的
    所有的OpenCV编译配置选项见官方文档
cmake -D CMAKE_INSTALL_PREFIX=/media/jc/Config/Deepin/local/libs/opencv/4.5_vino \
-D CMAKE_BUILD_TYPE=DEBUG \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_EXTRA_MODULES_PATH=/media/jc/Config/Deepin/local/libs/opencv_contrib/modules \
-D WITH_FFMPEG=ON ..

下面是安装选项的示例

*  选择安装位置
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv
* 选择编译方式
-D CMAKE_BUILD_TYPE=RELEASE/DEBUG
* 是否生成PKGCONFIG需要的opencv.pc文件
-D OPENCV_GENERATE_PKGCONFIG=ON/OFF
* 是否编译Contrib模块(这里的PATH要写到contrib下的modules)
-D OPENCV_EXTRA_MODULES_PATH=/home/..../opencv_contrib/modules
* 是否只是一个opencv_world动态链接库
-D BUILD_OPENCV_WORLD=ON/OFF
* 是否用Qt作为highgui模块的显示框架(需要先安装Qt)
-D WITH_Qt=ON/OFF
* 是否使用FFMPEG进行视频IO
-D WITH_FFMPEG=ON/OFF
  1. 运行make命令
  2. 运行sudo make install命令(如果是安装到/usr/llib等位置就需要root权限)

2.2 Linux直接安装

这种方式没有FindOpenCV.cmake以及OpenCVConfig.cmake。只有opencv.pc,是通过pkg-config方式组织库的。

sudo apt-get install libopencv-dev

三、在Cmake中引入OpenCV

3.1 使用OpenCVConfig.cmake

先设置OpenCV_DIR这个变量为OpenCVConfig.cmake文件所在的目录,然后可以直接使用find_package命令找到opencv库,后面就可以使用include_directories以及target_link_libraries命令引入opencv的库。cmake脚本代码如下:

set(OpenCV_DIR xxxx) # xxxx目录包含OpenCVConfig.cmake
find_package(opencv required)	# 找到opencv库
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} *.cpp)	# *.cpp指要编译的那些源文件
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBRARIES})

3.2 使用FindOpenCV.cmake

与3.1类似

3.3 使用opencv.pc

cmake_minimum_required(VERSION 3.17)
project(C__test)

set(CMAKE_CXX_STANDARD 14)

set(ENV{PKG_CONFIG_PATH} /usr/lib/x86_x64-linux-gnu/pkgconfig)
find_package(PkgConfig REQUIRED)
pkg_check_modules(OPENCV REQUIRED IMPORTED_TARGET opencv)
#MESSAGE(STATUS ${OPENCV_LIBRARIES})
if(${OPENCV_FOUND})
    MESSAGE(${PKG_CONFIG_EXECUTABLE})
    MESSAGE(${OPENCV_LIBRARIES})
    MESSAGE(${OPENCV_LINK_LIBRARIES})
endif()
add_executable(C__test main.cpp) # 注意add_executable要放在target_link_libraries的前面,不然会报错
# 注意这里可以直接使用PkgConfig::OPENCV这种方式CMake文档, FindPkgConfig中有讲,百度cmake pkgconfig doc就有。
target_link_libraries(${PROJECT_NAME} PkgConfig::OPENCV)

四、在Linux中切换OpenCV的版本

有时不同的程序运行需要不同版本的OpenCV,编译安装了多个OpenCV到不同的位置,就需要切换系统链接时的不同版本。下面记录了Linux系统查找动态链接库的几种方式
Linux查找动态链接库的几种方式
默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件

  1. LD_LIBRARY_PATH
    这是一个全局的变量
  2. rpath
    gcc编译选项中rpath=xxx,如gcc -L. -Wl,-rpath=/home/bow/all/program/test/lib_version_test -o test main.o -ltest
  3. ld.so.conf
    一般位于/etc/ld.so.conf,有时其中的内容为include /etc/ld.so.conf.d/*.conf,直接包含/etc/ld.so.conf.d目录下所有的conf文件
    conf文件中记录库的目录绝对路径,并且由/usr/lib/ld程序使用该配置文件
  4. pkg-config程序
    pkg-config程序是向configure程序提供系统信息的程序,比如软件版本,库版本,库路径等等。安装pkg-config后会有一个PKG_CONFIG_PATH环境变量,这个环境变量存储保存*.pc文件的目录路径,.pc文件则提供库的各种信息,PKG_CONFIG_PATH搜索的优先级高于默认.
    https://blog.csdn.net/weixin_38907560/article/details/81449272
    ./configure常用pkg-config来检查安装环境
    pkg-config --cflags opencv 可以查看opencv的头文件目录
    pkg-config --libs opencv 可以查看opencv的库文件目录
    注意其中opencv是按照opencv.pc的名字来查找的,如果在PKG_CONFIG_PATH环境变量中找不到,就会去其默认的路径中找如/usr/local/lib/pkgconfig下

你可能感兴趣的:(CMAKE,C++,图像处理,直方图均衡化,vba)