在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-7g++-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)

输入以下命令

步骤三:编译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);

  

 

posted @ 2023-11-08 22:01  LesPlumes  阅读(733)  评论(0编辑  收藏  举报