目录
前言
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 的源码 Sources:OpenCV 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(问题专栏)进行编译安装!!!