Debian从apt源安装OpenCV过程记录
<p>系统:Debian12(Bookworm);OpenCV 4.6.0</p><h3 id="一安装opencv">一、安装OpenCV</h3>
<p>安装OpenCV的CPP库有两种方式,一种是使用apt源安装OpenCV库到默认位置<code>/usr/</code>,另一种是官网下载源码并编译到<code>/usr/local/</code>。自己编译OpenCV可以自定义模块,但是相对较麻烦。在有过几次编译OpenCV的熬夜经历后我想试试第一种方法,也即从apt源安装OpenCV,该方法相对简单,在终端运行如下命令即可。</p>
<pre><code class="language-shell">sudo apt install libopencv-dev
</code></pre>
<h3 id="二配置pkg-config">二、配置pkg-config</h3>
<p>该步骤理论上无需用户人为配置,在安装好<code>libopencv-dev</code>后系统中的pkg-config自动配置好opencv4.pc文件,<strong>该部分后边内容为介绍性文字</strong>。pkg-config可以便捷地为第三方库配置<code>-I</code>与<code>-L</code>参数,即include头文件库和library链接库,其配置方式是在<code>/usr/lib/x86_64-linux-gnu/pkgconfig</code>文件夹下生成一个<code>opencv4.pc</code>文件,该文件指明了opencv的版本号、头文件库位置、链接库位置,供g++调用(调用方法见下一节)。下面我贴一下我的<code>opencv4.pc</code>文件内容:</p>
<pre><code># 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}
</code></pre>
<h3 id="三pkg-config配合g使用opencv">三、pkg-config配合g++使用OpenCV</h3>
<p>这里不介绍IDE中如何添加OpenCV的链接库和头文件库,而是用pkg-config搭配最原始的g++编译器来举例,读者可以因IDE制宜。<br>
假设现在写好了一个<code>main.cpp</code>文件,文件中的第一行如下:</p>
<pre><code class="language-cpp">#include <opencv2/opencv.hpp>
</code></pre>
<p>使用如下命令编译该程序:</p>
<pre><code class="language-shell">g++ main.cpp `pkg-config opencv4 --cflags` -o main.o
</code></pre>
<p>同级文件夹下会出现可执行程序<code>main.o</code>,编译成功。</p>
<p>后边文字为<strong>总结与思考</strong>,很多次我在安装<code>libopencv-dev</code>后直接调用<code><opencv2/opencv.hpp></code>等头文件,总是忘记说明OpenCV头文件库的位置。其根本原因如下:</p>
<blockquote>
<p>Linux系统环境变量会默认头文件库为<code>/usr/include/</code>、<code>/include/</code>等等,但是不会追溯到下一文件夹。举例说明:</p>
</blockquote>
<p>在<code>/usr/include</code>文件夹下<code>tree</code>一下,有大致如下文件结构(字体加粗表示文件夹,不加粗表示文件):</p>
<blockquote>
<ul>
<li><strong>/usr/include</strong>
<ul>
<li>string.h</li>
<li><strong>opencv4</strong>
<ul>
<li><strong>opencv2</strong>
<ul>
<li>opencv.hpp</li>
<li>highgui.hpp</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</blockquote>
<p>不借助pkg-config或者cmake或者make等工具直接g++编译的前提下,如果在<code>main.cpp</code>中写入<code>#include <string.h></code>那么不会有问题,但是如果在<code>main.cpp</code>中写入<code>#include <opencv2/opencv.hpp></code>编译器不知道中间有一个<code>opencv4</code>文件夹所以找不到头文件的位置(所以为什么随着OpenCV版本更新这里会出现一个<code>opencv4</code>文件夹,\战术挠头)。</p>
<p>那么我们可能会自然想到直接在<code>main.cpp</code>中写入<code>#include <opencv4/opencv2/opencv.hpp></code>不就好了嘛,在尝试过后我发现g++仍然会报错,但是不是在<code>main.cpp</code>主程序报错,而是在<code>opencv.hpp</code>中报错,因为<code>opencv.hpp</code>中有<code>#include <opencv2/opencv_modules.hpp></code>语句,系统还是忘了有<code>opencv4</code>这个文件夹。</p>
<p>所以通过这一系列测试可以得出:</p>
<blockquote>
<ol>
<li><code>#include <opencv2/opencv.hpp></code>中的<code>/</code>与文件夹分割符是一样的含义;</li>
<li>g++编译器只找到默认环境变量<code>/usr/include</code>的下一级位置头文件,而并非此文件夹下的所有子文件夹下的头文件;</li>
<li>pkg-config是CPP依赖配置工具,它指定第三方库的头文件库和链接库,但是没有自动地被g++识别,而是需要手动地将两者配合使用。</li>
</ol>
</blockquote>
<p>参考资料:<br>
How to Install OpenCV on Ubuntu 20.04<br>
pkg-config 与gcc 配合的使用<br>
路过图床提供在线图片支撑。</p><br><br>
来源:https://www.cnblogs.com/XiongHaiyang/p/17612878.html
頁:
[1]