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