文章目录

  • 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源代码

Y16_YUV_PARAM格式图像如何用opencv显示 opencv yuv422_c++

解压将文件放置在自己工作目录,如图笔者就将文件放置于/home/qiyao/OPENCV/opencv-4.6.0目录下:

Y16_YUV_PARAM格式图像如何用opencv显示 opencv yuv422_opencv_02

下载 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按钮

第一次打开会出现目标文件的选择

Y16_YUV_PARAM格式图像如何用opencv显示 opencv yuv422_opencv_03

我们后面会使用make命令完成opencv的编译所以本次选择 unix makefiles作为目标文件

Y16_YUV_PARAM格式图像如何用opencv显示 opencv yuv422_opencv_04

出现红色选框表示cmake参数出现变动或者问题,再次点击configure按钮,如果还有报错寻找出错的语句行,如果发现文件下载错误,将此前提到的文件包1拷贝至“/home/qiyao/OPENCV/opencv-4.6.0/.cache”文件夹下,再次进行configure操作。

cmake添加contrib文件路径

Y16_YUV_PARAM格式图像如何用opencv显示 opencv yuv422_opencv_05

找到“opencv_extra_modules_path”这一项,填入contrib包对应的路径,精确到contrib的module文件夹

生成makefile

最后勾选自己所需要的模块,cinfigure之后点击generate,在build文件夹下生成对应的opencv makefile文件

Y16_YUV_PARAM格式图像如何用opencv显示 opencv yuv422_opencv_06

三、编译

在buid文件夹下使用终端执行make指令开始进行opencv的编译
建议使用多线程优化的make编译

$ sudo make -j16

笔者在此使用了16个线程进行编译,读者可以根据自己计算机的cpu配置来选择合适的参数。

Y16_YUV_PARAM格式图像如何用opencv显示 opencv yuv422_opencv_07

最后执行安装

$ 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

Y16_YUV_PARAM格式图像如何用opencv显示 opencv yuv422_c++_08

这时候会有一个摄像头界面打开,如图所示即大功告成!

五、可能遇到的问题

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的编译。