文章目录
- Ubuntu22下OpenCV4.6.0+contrib模块编译安装
- 一、工具下载准备阶段
- 下载OpenCV源代码
- 下载 OpenCV contrib
- 安装cmake-gui+mingw-64
- 二、编译前准备
- 下载缺失文件
- 安装opencv依赖
- cmake配置编译
- 文件夹建立
- cmake设置文件路径
- cmake添加contrib文件路径
- 生成makefile
- 三、编译
- 添加路径
- 四、测试
- 五、可能遇到的问题
- 1.在执行 “pkg-config --modversion ”时显示“ No package ‘opencv‘ found”?解决方法
- 2.编译的时遇到"make: *** [Makefile:166:all] 错误 2"问题解决方法
Ubuntu22下OpenCV4.6.0+contrib模块编译安装
由于最近学习需要用到linux开发,所以需要在linux上搭建相应的环境。本文完整介绍了如何在ubuntu22环境下进行opencv环境搭建的流程(其他版本Ubuntu应当相似)。
提示:以下是本篇文章正文内容,下面案例可供参考
一、工具下载准备阶段
下载OpenCV源代码
在OpenCV官网Library下载页下载OpenCV4.6.0的sources源代码
解压将文件放置在自己工作目录,如图笔者就将文件放置于/home/qiyao/OPENCV/opencv-4.6.0目录下:
下载 OpenCV contrib
opencv contrib下载地址:https://github.com/opencv/opencv_contrib/tags 选择对应版本下载即可。
笔者选择4.6.0版本下载,下载完毕后以笔者版本示意->
将解压得到的“opencv_contrib-4.6.0”文件夹移动至/home/qiyao/OPENCV/opencv-4.6.0/目录下
(可以选择其他文件夹,这里为了方便管理整个源代码所以将其放在一起)。
安装cmake-gui+mingw-64
在windows下cmake的gui界面可以很方便地完成编译选项的设置,在linuxshanghai可以安装cmake-gui工具包分别设置source code文件夹路径和buid文件夹路径,点击configure按钮
第一次打开会出现目标文件的选择
实现同样的效果(cmake-gui内置cmake,和系统内置的cmake分立)
$ sudo apt install cmake-qt-gui
$ sudo apt install mingw-w64
接下来就是OpenCV的编译阶段,需要作一些相应的提前准备
二、编译前准备
下载缺失文件
为了方便读者下载这些缺失的文件,笔者将自己所使用的文件进行打包上传至gitee仓库(为了方便记忆在此叫做文件包1)
https://gitee.com/C-Qiyao/opencv-cmake-download-file
安装opencv依赖
$ sudo apt install cmake
$ sudo apt install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev
$ sudo apt install git
cmake配置编译
文件夹建立
在OpenCV源代码文件夹外新建一个build文件夹用以存放cmake的中间文件
笔者的OpenCV源代码文件路径为 /home/qiyao/OPENCV/opencv-4.6.0
新建的build文件夹路径为 /home/qiyao/OPENCV/BUILD
cmake设置文件路径
分别设置source code文件夹路径和buid文件夹路径,点击configure按钮
第一次打开会出现目标文件的选择
我们后面会使用make命令完成opencv的编译所以本次选择 unix makefiles作为目标文件
出现红色选框表示cmake参数出现变动或者问题,再次点击configure按钮,如果还有报错寻找出错的语句行,如果发现文件下载错误,将此前提到的文件包1拷贝至“/home/qiyao/OPENCV/opencv-4.6.0/.cache”文件夹下,再次进行configure操作。
cmake添加contrib文件路径
找到“opencv_extra_modules_path”这一项,填入contrib包对应的路径,精确到contrib的module文件夹
生成makefile
最后勾选自己所需要的模块,cinfigure之后点击generate,在build文件夹下生成对应的opencv makefile文件
三、编译
在buid文件夹下使用终端执行make指令开始进行opencv的编译
建议使用多线程优化的make编译
$ sudo make -j16
笔者在此使用了16个线程进行编译,读者可以根据自己计算机的cpu配置来选择合适的参数。
最后执行安装
$ sudo make install
添加路径
打开文件
$ sudo gedit /etc/ld.so.conf
在该文件内添加一行路径
include /usr/local/lib
使用ctrl+x关闭保存文件,再在终端输入
$ sudo nano ~/.bashrc
添加以下代码
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
保存退出,输入
$ source /etc/bash.bashrc
输入以下命令查看opencv版本
$ pkg-config opencv --modversion
四、测试
以读者的文件目录为例,进入源代码文件夹/opencv-4.6.0/samples/cpp/example_cmake文件夹下
打开终端输入:
$ mkdir build
$ cd build
$ cmake ..
输出如下结果:
-- OpenCV library status:
-- config: /usr/local/lib/cmake/opencv4
-- version: 4.6.0
-- libraries: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio
-- include path: /usr/local/include/opencv4
-- Configuring done
-- Generating done
-- Build files have been written to: /home/qiyao/OPENCV/opencv-4.6.0/samples/cpp/example_cmake/bqiyao@qiyao-Lqiyao@qiyqiyaoqiqqiyao@qiyao-L
运行示例程序:
在build文件夹下继续输入
$ ./opencv_example
这时候会有一个摄像头界面打开,如图所示即大功告成!
五、可能遇到的问题
1.在执行 “pkg-config --modversion ”时显示“ No package ‘opencv‘ found”?解决方法
只需要在/usr/local/lib目录下新建一个 pkgconfig文件夹
$ cd /usr/local/lib
$ sudo mkdir pkgconfig
$ cd pkgconfig
$ sudo nano opencv.pc
在opencv.pc文件内写入如下数据即可:
prefix=/usr/local
exec_prefix=${prefix}
includedir=/usr/local/include
libdir=/usr/local/lib
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.6.0
Libs: -L${exec_prefix}/lib -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_photo -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_optflow -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_xfeatures2d -lopencv_shape -lopencv_video -lopencv_ml -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_flann -lopencv_xobjdetect -lopencv_imgcodecs -lopencv_objdetect -lopencv_xphoto -lopencv_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir}
2.编译的时遇到"make: *** [Makefile:166:all] 错误 2"问题解决方法
在 make -j指令喜爱可能不会输出详细的错误信息,此时可以使用make指令运行一下,发现很多报错内容如下
/home/qiyao/OPENCV/opencv-4.6.0/modules/videoio/src/ffmpeg_codecs.hpp:96:27: error: ‘CODEC_ID_LJPEG’ was not declared in this scope; did you mean ‘AV_CODEC_ID_LJPEG’?
96 | #define AV_CODEC_ID_LJPEG CODEC_ID_LJPEG
| ^~~~~~~~~~~~~~
/home/qiyao/OPENCV/opencv-4.6.0/modules/videoio/src/ffmpeg_codecs.hpp:96:27: note: in definition of macro ‘AV_CODEC_ID_LJPEG’
96 | #define AV_CODEC_ID_LJPEG CODEC_ID_LJPEG
| ^~~~~~~~~~~~~~
/home/qiyao/OPENCV/opencv-4.6.0/modules/videoio/src/cap_ffmpeg_impl.hpp:2842:10: note: in expansion of macro ‘CV_CODEC’
2842 | case CV_CODEC(CODEC_ID_LJPEG):
| ^~~~~~~~
/home/qiyao/OPENCV/opencv-4.6.0/modules/videoio/src/ffmpeg_codecs.hpp:100:30: error: ‘CODEC_ID_RAWVIDEO’ was not declared in this scope; did you mean ‘AV_CODEC_ID_RAWVIDEO’?
100 | #define AV_CODEC_ID_RAWVIDEO CODEC_ID_RAWVIDEO
| ^~~~~~~~~~~~~~~~~
...........
可以判断是ffmpeg模块接口函数不匹配导致的,因为ffmpeg 和opencv版本不匹配导致的
解决方法:在cmake配置过程中关闭videoio模块的编译,或者是寻找合适版本的ffmpeg版本,笔者选择了第一种方案完成了opencv的编译。