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
这个文件夹。
所以通过这一系列测试可以得出:
#include <opencv2/opencv.hpp>
中的/
与文件夹分割符是一样的含义;- g++编译器只找到默认环境变量
/usr/include
的下一级位置头文件,而并非此文件夹下的所有子文件夹下的头文件;- pkg-config是CPP依赖配置工具,它指定第三方库的头文件库和链接库,但是没有自动地被g++识别,而是需要手动地将两者配合使用。
参考资料:
How to Install OpenCV on Ubuntu 20.04
pkg-config 与gcc 配合的使用
路过图床提供在线图片支撑。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)