Ubuntu20.04下配置OpenCV2.4.13


环境如标题
参考文章:

https://blog.csdn.net/surgewong/article/details/39078251 【Ubuntu12安装OpenCV2】
https://www.cnblogs.com/woshijpf/p/3840530.html 【linux下编译OpenCV的方法】
https://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-in-gcc/409470#409470 【gcc/g++编译详解】

你的点赞和评论对我真的很重要!!

一、安装OpenCV及相关依赖

1.OpenCV安装包,https://opencv.org/releases/page/3/
在该页面找到2.4.13,下载并解压到目录

2.build-essential 软件包为编译程序提供必需软件包的列表信息,如头文件与库函数位置,并安装gcc/g++/gdb/make 等基本编程工具

sudo apt-get install build-essential

3.以下依赖用于支持读写图片以及视频

sudo apt-get install libgtk2.0-dev libavcodec-dev libavformat-dev libtiff4-dev libswscale-dev libjasper-dev

4.安装cmake

sudo apt-get install cmake

5.安装pkg-config,用于提供从源代码中编译软件时查询已安装的库时使用的统一接口

sudo apt-get install pkg-config

补充
你可能会遇到如下问题

  1. 安装依赖时提示
    参考文章:https://blog.csdn.net/Collin_D/article/details/109067301

unable to locate libjasper-dev

解决方案:更新仓库源

sudo add-apt-repository "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe"
sudo apt update
sudo apt install libjasper1 libjasper-dev
  1. 出现以下错误
    参考文章:https://stackoverflow.com/questions/46884682/error-in-building-opencv-with-ffmpeg

error: ‘CODEC_FLAG_GLOBAL_HEADER’ was not declared in this scope c->flags |= CODEC_FLAG_GLOBAL_HEADER;
……

解决方案:这是由于OpenCV的版本升级,预编译常量命名变化而导致的,因此需要你在OpenCV安装目录下找到cap_ffmpeg_impl.hpp,并在头部添加如下代码

#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020

二、编译安装

据参考文章3可知,运行OpenCV主要有两种方法,CMake(一般用这个)和Command Line (可用于编译样例,检测OpenCV安装情况)。

1. cmake

(1)使用cmake来检测编译环境以及生成makefile以及其他project信息

cd opencv_dir 
mkdir build	//一般为命名为build或release
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. 
//CMAKE_BUILD_TYPE=RELEASE保证产生的makefile文件make生成的可执行文件带有调试信息,供gdb和gdbserver使用
//CMAKE_INSTALL_PREFIX设置编译路径

(2)make编译并安装

make -j$(nproc) //单纯make会很慢,$(nproc)指令表示能参与编译的最大内核线程数
//也可以自定义线程数如,make -j16	
sudo make install

(3)设置OpenCV环境变量(很重要!无论采用哪种编译方法都需要设置)

设置pkg-config的OpenCV库路径

export PKG_CONFIG_PATH=/..../OpenCV-dir/build/unix-install
//或者 export PKG_CONFIG_LIBDIR=/..../OpenCV-dir/build/unix-install
//LIBDIR环境变量优先级更高,一般用PATH设置即可
//该路径包含了opencv.pc文件,其中包含了头文件位置、库文件位置等信息

如果该目录下没有该文件则需要手动创建并配置,方法如下

cd /usr/local/lib
sudo mkdir pkgconfig
cd pkgconfig
sudo touch opencv.pc
sudo vi opencv.pc //vi、vim、gedit都行,爱用哪个用哪个

添加如下信息

# Package Information for pkg-config

prefix=/usr/local
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: 2.4.13.6
Libs: -L${exec_prefix}/lib -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab -lrt -lpthread -lm -ldl
Cflags: -I${includedir_old} -I${includedir_new}

保存并退出,导入环境变量

export  PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

ps:导入环境变量的方法有很多,本文已经很长了,就不详细介绍了,简单提一下:
(1)直接导入库路径配置文件,在/etc/ld.so.conf.d下添加opencv.conf,并写入/usr/local/lib
(2)配置全局变量,在/etc/profile文件末尾追加

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
然后更新环境变量
source /etc/profile

(3)配置用户本地变量,在/etc/bash.bashrc文件末尾追加

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
然后更新环境变量
source /etc/profile

最后,更新系统库缓存

ldconfig

查看opencv是否配置成功

pkg-config --cflags opencv
pkg-config --libs opencv

2. Command Line(运行测试)

切换到OpenCV-dir/samples/c/(或者cpp)
(1)简单方案,编译所有样例

cd /.../opencv_dir/samples/c/
cd ./build_all.sh	//编译所有样例
cd ./find_obj

即可看到下图

(2)仅编译某个样例,使用如下的命令编译运行即可:

gcc -ggdb xxx.c -o xxx `pkg-config --cflags --libs opencv` //若文件为.c
g++ -ggdb xxx.cpp -o xxx `pkg-config --cflags --libs opencv` //若文件为.cpp
./xxx

-o 生成对象文件,其后紧跟要生成的对象文件名;
–cflags 引入各种头文件位置;
–libs 引入动态链接库;
另外,应当注意,gcc/g++采用比较严格的指令执行顺序(从左向右)。在最近的发行版本中,都默认使用了–as-needed参数,强制要求程序的对象文件必须出现在动态库之前并且它并不会因为参数顺序不对而报错,因此只有当-libs参数在xxx.cpp后时程序才能正常执行
也就是说,以g++为例

g++ -ggdb `pkg-config --cflags --libs opencv` xxx.cpp -o xxx  //错误
g++ -ggdb `pkg-config --cflags opencv` xxx.cpp -o xxx `pkg-config --libs opencv` //正确
g++ -ggdb xxx.cpp -o xxx `pkg-config --cflags --libs opencv` //正确

效果图

  • 2
    点赞
  • 7
    收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论 4

打赏作者

quiet2333

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值