在WSL-Ubuntu20.04下,安装OpenCV-3过程以及遇到的问题和相应的解决办法
安装前先把git连接好,确保能从github下载。
环境配置:
Windows 11, WSL2-Ubuntu20.04,NVDIA版本:10.1.243-3,
cuda版本:10.1,gcc & g++版本:7
安装前必要的准备工作(原因可以参见“报错及解决办法”):
- 1、在进行cmake之前,若是Ubuntu-20.04版本,先把gcc与g++的默认版本换为gcc-7与g++-7。(见错误1的设置流程)
- 2、在进行cmake之前,将“Opencv3缺失文件”这个文件夹中的所有.i文件都复制到
opencv3_contrib\modules\xfeatures2d\src\
这个目录下。
(百度网盘:https://pan.baidu.com/s/15QlHwu5ur2vc6ncyVS4e_Q 提取码:sysu)
- 3、在进行make之前,将以下路径:
opencv-3.3.1\opencv_contrib\modules\xfeatures2d\include\opencv2\
的xfeatures2d文件夹和xfeatures2d.hpp都copy到
opencv-3.3.1\build\opencv2\
路径下。
(opencv_contrib下载连接:https://github.com/opencv/opencv_contrib)
如果在Windows下移动过程提示无权限,则需要在Ubuntu中进行移动。
命令:sudo mv 文件名/文件夹名 目标文件夹路径
例如:sudo mv opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d build/opencv2
(详情请自行查找mv命令的相关参数简介)
- 4、在进行make之前,下载nvida_sdk(链接:https://pan.baidu.com/s/1IykEbf7SZgf2IE0T52_bqA 提取码:sysu)
然后把下载下来的
Video_Codec_Interface_12.1.14\Video_Codec_Interface_12.1.14\Interface\
目录下的三个文件,都复制到
opencv-3.3.1/modules/cudacodec/src/
下;再依次打开以下文件:
precomp.hpp、video_decoder.hpp、cuvid_video_source.hpp、
frame_queue.hpp、video_parser.hpp
将 #if CUDA_VERSION >= 9000
修改为 #if CUDA_VERSION >= 9000 && CUDA_VERSION < 10000
- 5、在进行make之前,打开
opencv-3.3.1\modules\videoio\src\ 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
安装流程:
步骤一:编译前的准备工作
- 下载opencv-3.3.1,以及opencv_contrib-3.3.1。
- 将opencv_contrib-3.3.1文件夹放入opencv-3.3.1文件夹内(我这里的opencv_contrib-3.3.1改名为opencv_contrib)。
步骤二:安装相关的依赖包(注意,这是Ubuntu20.04环境。18.04的依赖包请参考其他文章)
(参考https://blog.csdn.net/qq_41323996/article/details/109469148)
sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libjasper
sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt install libgtk2.0-dev
sudo apt-get install libatlas-base-dev gfortran
报错:Error:Unable to locate package libjasper-dev
解决办法:(参考:https://blog.csdn.net/weixin_41053564/article/details/81254410)
输入以下命令:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
步骤三:编译opencv
cd opencv-3.3.1
mkdir build && cd build
-
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_NVCC_FLAGS="-D_FORCE_INLINES" -D BUILD_opencv_cudacodec=OFF -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ..
sudo make -j6
sudo make install
(此处的 OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules 需要按自己的opencv_contrib名字进行修改)
- 安装过程中可能遇到的ippicv下载慢问题
- 解决办法:
1.下载ippcv_按照自己缺少的版本下载
2.保存至:${path}, 比如我的是${path}=/home/downloads
3.打开${opencv_folder}/3rdparty/ippicv/ippicv.cmake
4.将第47行 https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/
改成:file://${path}
,比如我的就是file:///home/downloads/
报错及解决办法:
- 错误1:在make过程中出现的问题:#error -- unsupported GNU version! gcc versions later than 8 are not supported!
CMake Error at cuda_compile_generated_gpu_mat.cu.o.cmake:206 (message):
Error generating /home/yill/software/opencv-3.3.1/build/modules/core/CMakeFiles/cuda_compile.dir/src/cuda/./cuda_compile_generated_gpu_mat.cu.o
- 原因:gcc版本过高,cuda版本与gcc版本不对应。(cuda10.1版本需用gcc7及以下版本进行编译)
- 解决办法:更换gcc与g++版本。
先下载gcc:sudo apt-get install gcc-7 g++-7
完成后可输入 ls /usr/bin/gcc*与ls /usr/bin/g++*
查看系统装有的gcc与g++版本。
装了gcc-7之后,指定gcc-7进行编译:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
更新默认的gcc版本配置:
sudo update-alternatives --config gcc
指定g++-7进行编译:
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100
更新默认的g++版本配置:
sudo update-alternatives --config g++
- 错误2:报错fatal error: dynlink_nvcuvid.h: No such file or directory 60 | #include <dynlink_nvcuvid.h>
- 原因: cuda10 does not provide dynlink_nvcuvid.h any more.
- 解决办法:
先下载 nvida_sdk (链接:https://pan.baidu.com/s/1IykEbf7SZgf2IE0T52_bqA 提取码:sysu),
然后把下载下来的Video_Codec_Interface_12.1.14\Video_Codec_Interface_12.1.14\Interface\
目录下的三个文件,
都复制到opencv-3.3.1/modules/cudacodec/src/
下;
再依次打开以下文件:
precomp.hpp、video_decoder.hpp、cuvid_video_source.hpp、
frame_queue.hpp、video_parser.hpp
将 #if CUDA_VERSION >= 9000
修改为#if CUDA_VERSION >= 9000 && CUDA_VERSION < 10000
- 错误3:fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory 52 | # include "opencv2/xfeatures2d/cuda.hpp"
- 原因:找不到cuda.hpp
- 解决办法:将
opencv-3.3.1\opencv_contrib\modules\xfeatures2d\include\opencv2
下的一个文件夹和一个.hpp文件都复制到opencv-3.3.1\build\opencv2\
路径下。
- 错误4:在make过程中,出现opencv-3.3.1/modules/videoio/src/cap_ffmpeg_impl.hpp:1573:21: error: ‘CODEC_FLAG_GLOBAL_HEADER’was not declared in this scope c->flags|=CODEC_FLAG_GLOBAL_HEADER;
- 原因:缺少几个关键的宏定义
- 解决办法:(参考https://blog.csdn.net/weixin_44675820/article/details/124926975)
在相应的文件中添加宏定义即可。
打开opencv-3.3.1\modules\videoio\src\ 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
如下图:
- 错误5:make过程中,出现:
opencv-3.3.1/modules/python/src2/cv2.cpp:856:34: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
char* str = PyString_AsString(obj);
- 原因:无法转为目标类型
- 解决办法:(参考https://blog.csdn.net/zhongqli/article/details/112219329)
打开文件:opencv-3.3.1/modules/python/src2/cv2.cpp
在第856行,将char* str = PyString_AsString(obj);
改为char* str = (char*)PyString_AsString(obj);