Ubuntu 20.04源码编译安装OpenCV 4.7.0

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

前言

1--下载OpenCV 4.7.0

2--编译安装OpenCV 4.7.0

3--测试

3-1--查看安装的版本

3-2--基于VSCode和CMake测试项目

4--报错解决重点

4-1--OpenCV与FFmpeg不兼容

4-2--LIBTIFF报错

4-3--系统与Anaconda的库lib冲突

4-4--测试时CMake的find_package报错


前言

        建议先看第4节相关报错及解决方法再进行安装

1--下载OpenCV 4.7.0

        下载 OpenCV 4.7.0 的源码 SourcesOpenCV 4.7.0

2--编译安装OpenCV 4.7.0

① 解压压缩包

unzip opencv-4.7.0.zip

② 安装依赖

cd opencv-4.7.0

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev

③ 编译

mkdir build 

cd build

cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TIFF=ON ..

-DBUILD_TIFF=ON 的作用在之后报错的章节中会说明

④ 安装

sudo make install -j8

# -j8表示CPU将使用多线程加快安装速度

3--测试

3-1--查看安装的版本

pkg-config --modversion opencv4

        一般情况下正常输入上面的命令就可以直接查看安装的版本如果失败可以参考链接1进行配置环境

3-2--基于VSCode和CMake测试项目

① 编写 main.cpp 文件

# include<cstdio>
# include"opencv2/opencv.hpp"
 
using namespace cv;
 
int main(){
    printf("Hello, Opencv4!\n");
    Mat image = imread("./test1.jpg"); // 读取图片
 
    namedWindow("img1"); // 创建窗口
    imshow("img1", image); // 显示读取的图片
    waitKey(0);
    return 0;
}

② 使用 g++ 直接编译

g++ main.cpp -o test `pkg-config --cflags --libs opencv4`

③ 使用 CMakeLists.txt 进行编译

cmake_minimum_required(VERSION 3.10)  # 指定 cmake的 最小版本
project(test) # 设置项目名称
#set(OpenCV_DIR /usr/local/lib/cmake/opencv4)
find_package(OpenCV REQUIRED)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
add_executable(main main.cpp) # 生成可执行文件
target_link_libraries(main ${OpenCV_LIBS} ) # 设置target需要链接的库
mkdir build

cd build

cmake ..

make

./main

4--报错解决重点

4-1--OpenCV与FFmpeg不兼容

        博主在使用Ubuntu安装OpenCV前曾基于源码编译安装过FFmpeg 5.1两者存在冲突会出现以下错误

        ① modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_ffmpeg.cpp.o] Error 1
        ② modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2

        ③ make[2]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/build.make:302: lib/libopencv_videoio.so.4.7.0] Error 1

        ④ relocation R_X86_64_PC32 against symbol `ff_pw_9' can not be used when making a shared object; recompile with -fPIC

        出现上面几个错误均与博主源码编译安装的FFmpeg 5.1有关。

解决方法卸载FFmpeg 5.1博主改用FFmpeg 4.3得以兼容

4-2--LIBTIFF报错

        博主在编译安装OpenCV时出现了以下 LIBTIFF 的错误

        ① /usr/bin/ld: ../../lib/libopencv_imgcodecs.so.4.7.0: undefined reference to `TIFFReadDirectory@LIBTIFF_4.0'

        ② make[2]: *** [modules/core/CMakeFiles/opencv_test_core.dir/build.make:812: bin/opencv_test_core] Error 1

        ③ make[1]: *** [CMakeFiles/Makefile2:1985: modules/core/CMakeFiles/opencv_test_core.dir/all] Error 2 make: *** [Makefile:163: all] Error 2

解决方法在编译安装的时候加上 -DBUILD_TIFF=ON 的选项这里参考链接2

cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TIFF=ON ..

4-3--系统与Anaconda的库lib冲突

        博主在编译安装OpenCV的时候出现了以下错误

        ① /usr/bin/ld: /usr/lib/x86_64-linux-gnu/libfontconfig.so: undefined reference to `uuid_parse@UUID_1.0'

        ② make[2]: *** [modules/highgui/CMakeFiles/opencv_test_highgui.dir/build.make:122: bin/opencv_test_highgui] Error 1

        ③ make[1]: *** [CMakeFiles/Makefile2:2938: modules/highgui/CMakeFiles/opencv_test_highgui.dir/all] Error 2 make: *** [Makefile:163: all] Error 2

        报错的原因是Conda 的库与系统的库出现了冲突具体分析可参考链接3但博主并没有采用参考链接的解决方法而是猜测只是由于博主在编译 OpenCV 的时候并没有退出 Conda 环境

解决方法在终端退出Conda环境重新进行编译安装

conda deactivate

4-4--测试时CMake的find_package报错

        博主在 VSCode 进行程序测试时无法利用 CMakeLists.txt 进行间接编译出现了以下错误

        ① By not providing "FindOpencv.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "Opencv", but CMake did not find one.

        ② Could not find a package configuration file provided by "Opencv" with any
  of the following names: OpencvConfig.cmake opencv-config.cmake;

         一开始博主以为是没有设置 OpenCV_DIR 导致以上报错所以参考其它答案使用了 Set 命令设置 OpenCV_DIR但并不能解决

        真正的原因其实是一开始博主在 CMakeLists.txt 中的 find_package(Opencv REQUIRED)使用的小写的 cv这才导致了错误。但博主在 Windows 和 Mac 系统下都使用了小写的 Opencv 并没有任何错误离大谱属实过分所以这里不确定真正的原因部分博主分析了可能的原因具体可参考链接4

解决方法将find_package的Opencv改为OpenCV

衷心建议结合OpenCV Github项目的issue问题专栏进行编译安装

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Ubuntu