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

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