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 源码下载
- 由于国内/公司坑爹的网速,此处省略5000字吐槽。
- 官网的下载地址是在Github上,可以从 releases 中选择下载链接。
- 有好心大哥把OpenCV的源码搬运了,好人一生平安。
2. 下载编译opencv所需的各种奇怪数据
- 个人心情:
- 由于国内/公司坑爹的网速,此处省略5000字吐槽。
- 如果网速好(从github上下载数据很快),可以忽略这一步。
- 对于缺失某些特定数据,有好心人给出了一些百度云下载链接、CSDN下载链接等,但也没有一个百度云合集啥的,所以很可能搞了很久也没有处理完。
- 我自己也碰到好多次了,所以这次决定彻底搞清楚并解决……
- 问题描述:在执行 cmake 的时候会尝试下载很多二进制数据。
- 下载数据的本质:
- 在稍微看了下 cmake 的源码后发现,其实所有二进制数据下载都是从 Github: opencv/opencv_3rdparty 中下载的。
- 以 ippicv 为例,对应的配置文件是
opencv-4.1.0/3rdparty/ippicv/ippicv.cmake
,上述配置文件的主要内容就是根据操作系统类别下载opencv_3rdparty
中对应的文件。 - 那么问题来了,Github中下载速度特别慢,该如何处理呢……
- 解决方案:手动下载
- 那要如何将手动下载的数据放到对应的路径呢……
- 坑爹的又来了,第一次处理我也没啥好办法。
- 从本质上看,就是需要研究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
。
- make 时报错
- 作用:
- 简单来说,这一步是要处理 cuda video decoder 相关的问题。
- 对于 CUDA 10.0 以下的版本,这一步可以略过
- 对于 CUDA 10.0 及以上版本,这一步是必须的。
- 问题描述:
- 在CUDA10.0及以后,cuda video decoer 就已经 deprecated 了,不能使用。
- 相关issue:Cuda 10.0 fatal error: dynlink_nvcuvid.h: No such file or directory
- 解决方案:
- 如果不使用 cuda video decoder,则可以在
cmake
时使用-DBUILD_opencv_cudacodec=OFF
选项,忽略相关功能。 - 如果需要使用,则需要安装NVIDIA VIDEO CODEC SDK。安装的基本流程是:
- 在下载页面下载对应的包。
- 解压后,将对应的头文件保存到
/usr/local/cuda/include
中,将so文件保存到/usr/loca/cuda/lib64
中。
- 如果不使用 cuda video decoder,则可以在
4. 某头文件缺失
- 如果不处理之后会出现的问题:
- 无法找到
feature2d/test/test_detectors_regression.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