Debian从apt源安装OpenCV过程记录

系统:Debian12(Bookworm);OpenCV 4.6.0

一、安装OpenCV

安装OpenCV的CPP库有两种方式,一种是使用apt源安装OpenCV库到默认位置/usr/,另一种是官网下载源码并编译到/usr/local/。自己编译OpenCV可以自定义模块,但是相对较麻烦。在有过几次编译OpenCV的熬夜经历后我想试试第一种方法,也即从apt源安装OpenCV,该方法相对简单,在终端运行如下命令即可。

sudo apt install libopencv-dev

二、配置pkg-config

该步骤理论上无需用户人为配置,在安装好libopencv-dev后系统中的pkg-config自动配置好opencv4.pc文件,该部分后边内容为介绍性文字。pkg-config可以便捷地为第三方库配置-I-L参数,即include头文件库和library链接库,其配置方式是在/usr/lib/x86_64-linux-gnu/pkgconfig文件夹下生成一个opencv4.pc文件,该文件指明了opencv的版本号、头文件库位置、链接库位置,供g++调用(调用方法见下一节)。下面我贴一下我的opencv4.pc文件内容:

# Package Information for pkg-config

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib/x86_64-linux-gnu
includedir=${prefix}/include/opencv4

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.6.0
Libs: -L${exec_prefix}/lib/x86_64-linux-gnu -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_barcode -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_cvv -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_ml -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_wechat_qrcode -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir}

三、pkg-config配合g++使用OpenCV

这里不介绍IDE中如何添加OpenCV的链接库和头文件库,而是用pkg-config搭配最原始的g++编译器来举例,读者可以因IDE制宜。
假设现在写好了一个main.cpp文件,文件中的第一行如下:

#include <opencv2/opencv.hpp>

使用如下命令编译该程序:

g++ main.cpp `pkg-config opencv4 --cflags` -o main.o

同级文件夹下会出现可执行程序main.o,编译成功。

后边文字为总结与思考,很多次我在安装libopencv-dev后直接调用<opencv2/opencv.hpp>等头文件,总是忘记说明OpenCV头文件库的位置。其根本原因如下:

Linux系统环境变量会默认头文件库为/usr/include//include/等等,但是不会追溯到下一文件夹。举例说明:

/usr/include文件夹下tree一下,有大致如下文件结构(字体加粗表示文件夹,不加粗表示文件):

  • /usr/include
    • string.h
    • opencv4
      • opencv2
        • opencv.hpp
        • highgui.hpp

不借助pkg-config或者cmake或者make等工具直接g++编译的前提下,如果在main.cpp中写入#include <string.h>那么不会有问题,但是如果在main.cpp中写入#include <opencv2/opencv.hpp>编译器不知道中间有一个opencv4文件夹所以找不到头文件的位置(所以为什么随着OpenCV版本更新这里会出现一个opencv4文件夹,\战术挠头)。

那么我们可能会自然想到直接在main.cpp中写入#include <opencv4/opencv2/opencv.hpp>不就好了嘛,在尝试过后我发现g++仍然会报错,但是不是在main.cpp主程序报错,而是在opencv.hpp中报错,因为opencv.hpp中有#include <opencv2/opencv_modules.hpp>语句,系统还是忘了有opencv4这个文件夹。

所以通过这一系列测试可以得出:

  1. #include <opencv2/opencv.hpp>中的/与文件夹分割符是一样的含义;
  2. g++编译器只找到默认环境变量/usr/include的下一级位置头文件,而并非此文件夹下的所有子文件夹下的头文件;
  3. pkg-config是CPP依赖配置工具,它指定第三方库的头文件库和链接库,但是没有自动地被g++识别,而是需要手动地将两者配合使用。

参考资料:
How to Install OpenCV on Ubuntu 20.04
pkg-config 与gcc 配合的使用
路过图床提供在线图片支撑。

posted @   北极洲的小卖部  阅读(1423)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示