OpenCV 4.1.0 与 Contrib 源码编译记录(附百度云源码/数据下载)


0. 前言

  • 需求:在使用 mmaction 时需要用到 dense_flow,而为了编译 dense_flow 则需要 CUDA版 OpenCV 4.1.0。
  • 整个编译过程非常痛苦,但好在已经顺利完成。
  • 为了简化自己的工作,也给有需要的大哥们,百度云链接(提取码 3uhr )
    • 第一步中,opencv-4.1.0以及opencv_contrib-4.1.0 源码都有了。
    • 第二步中,cmake阶段需要下载的数据也都下载好了。
    • 第四步中,头文件缺失所导致的问题也处理好了。
  • 基本流程:
    • 第一步:下载OpenCV以及Contrib源码。
    • 第二步:下载编译opencv时所需的数据。
    • 第三步:处理 Video Codec 相关问题。
    • 第四步:处理某头文件缺失的问题。
    • 第五步:普通OpenCV安装。

1. OpenCV 源码下载


2. 下载编译opencv所需的各种奇怪数据

  • 个人心情:
    • 由于国内/公司坑爹的网速,此处省略5000字吐槽。
    • 如果网速好(从github上下载数据很快),可以忽略这一步
    • 对于缺失某些特定数据,有好心人给出了一些百度云下载链接、CSDN下载链接等,但也没有一个百度云合集啥的,所以很可能搞了很久也没有处理完。
    • 我自己也碰到好多次了,所以这次决定彻底搞清楚并解决……
  • 问题描述:在执行 cmake 的时候会尝试下载很多二进制数据。
  • 下载数据的本质:
    • 在稍微看了下 cmake 的源码后发现,其实所有二进制数据下载都是从 Github: opencv/opencv_3rdparty 中下载的。
    • 以 ippicv 为例,对应的配置文件是 opencv-4.1.0/3rdparty/ippicv/ippicv.cmake,上述配置文件的主要内容就是根据操作系统类别下载 opencv_3rdparty 中对应的文件。
    • 那么问题来了,Github中下载速度特别慢,该如何处理呢……
  • 解决方案:手动下载
    • 使用国内 Gitee 来获取 Github数据,在 Gitee 中新建仓库时,可以直接复制Github的repo。
    • 由于 opencv/opencv_3rdparty 太大了(1.26G),需要企业用户才能直接复制。
    • 直接搜索一下,看看有没有好心人clone了最新的库,比如这个
    • 要找到对应的数据,需要切换branch……具体的看cmake配置文件吧……
  • 那要如何将手动下载的数据放到对应的路径呢……
    • 坑爹的又来了,第一次处理我也没啥好办法。
    • 从本质上看,就是需要研究cmake文件,然后看看这些下载操作具体是如何做的。
    • 想要取巧,找了一些资料:
      • 就是将下载好的放到某路径下,然后修改cmake文件……
      • 如果要不修改cmake文件,可能不仅需要将对应的放到指定路径下,还要改文件名称……
    • 由于我已经下载了一部分,所以就用上面的第二种方法手动处理剩下没下载成功的数据:
      • ippicv文件:在研究了对应的 ippicv.cmake 后,需要将下载好的数据放到 opencv-4.1.0/.cache/ippicv中,并在在文件名增加对应的commit id(在cmake文件中可以查看),即 c0bd78adb4156bbf552c1dfe90599607-ippicv_2019_lnx_intel64_general_20180723.tgz
      • 对于 boostdesc 和 vgg 数据,也要将下载的数据保存到 opencv-4.1.0/.cache/xfeatures2d的对应文件夹中,具体文件名称可以查看对应的配置文件(opencv_contrib-4.1.0\modules\xfeatures2d\cmake 中)
      • 下载不成功时遗留文件的名称就是我们所需要的文件名。

3. Video Codec 相关(可选)

  • mmaction 的 dense_flow 库会用到这个功能……
  • 如果不处理之后会碰到的问题:
    • make 时报错 dynlink_nvcuvid.h: No such file or directory
  • 作用:
    • 简单来说,这一步是要处理 cuda video decoder 相关的问题。
    • 对于 CUDA 10.0 以下的版本,这一步可以略过
    • 对于 CUDA 10.0 及以上版本,这一步是必须的。
  • 问题描述:
  • 解决方案:
    • 如果不使用 cuda video decoder,则可以在 cmake时使用 -DBUILD_opencv_cudacodec=OFF 选项,忽略相关功能。
    • 如果需要使用,则需要安装NVIDIA VIDEO CODEC SDK。安装的基本流程是:
      • 下载页面下载对应的包。image_1e9iime0q1o2tjmt13lf11ai1n3s9.png-43.7kB
      • 解压后,将对应的头文件保存到 /usr/local/cuda/include 中,将so文件保存到 /usr/loca/cuda/lib64 中。

4. 某头文件缺失

  • 如果不处理之后会出现的问题:
    • 无法找到 feature2d/test/test_detectors_regression.impl.hpp
    • 简单说就是找不到头文件,要做的当然就是将头文件让源码能找到……
  • 解决方案一
    • 参考这里这里,笨办法,不懂cmake的我也能处理
    • 将对应的 hpp 文件(在 opencv-4.1.0/modules/features2d/test中)放到编译错误的源码(opencv_contrib-4.1.0/modules/xfeatures2d/test)路径下。
    • 修改源码,将 include "xxxx/test_detectors_invariance.impl.hpp 改为 include "test_detectors_invariance.impl.hpp
    • 主要做要修改的内容还不少……
  • 解决方案二:
    • 参考 这里
    • 找不到头文件的原因就是该路径没有放到系统路径下,那就修改对应的 cmake 文件即可。
    • 修改 opencv-4.1.0/CMakeLists.txt,添加 include_directories("modules"),添加到哪一行我也不清楚,原文说是567行,我觉得不靠谱。
    • 其实稍微懂一点cmake就能处理这个问题了,可惜我不懂

5. 普通安装流程

  • 安装对应的包:
sudo apt-get install -y liblapack-dev libatlas-base-dev
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
sudo apt-get install -y software-properties-common
sudo add-apt-repository ppa:jonathonf/ffmpeg-4
sudo apt update
sudo apt install -y ffmpeg
  • 执行cmake
    • 这一步如果前面下载数据没下完,会执行很久很久……
cmake -DCMAKE_BUILD_TYPE=Release \
    -DWITH_CUDA=ON \
    -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.0/modules/ \
    -DWITH_TBB=ON \
    -DBUILD_opencv_cnn_3dobj=OFF \
    -DBUILD_opencv_dnn=OFF \
    -DBUILD_opencv_dnn_modern=OFF \
    -DBUILD_opencv_dnns_easily_fooled=OFF \
    -DOPENCV_ENABLE_NONFREE=ON \
    -D PYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc;
    print(get_python_inc())") \
    -D PYTHON_EXECUTABLE=$(which python) \
    -D PYTHON_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")\
    ..
  • 执行 make :make -j

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章