1. 程式人生 > 實用技巧 >Ubuntu 環境安裝 opencv 3.2 步驟和問題記錄

Ubuntu 環境安裝 opencv 3.2 步驟和問題記錄

  記錄下筆者原始碼編譯 opencv 的過程( Ubuntu 環境下 ),以及某些報錯的解決方法,希望可以幫助有需要的人...

  原始碼編譯 opencv 的主要流程

  1.獲取 opencv 原始碼,使用者可以在 opencv-github獲取對應版本的 opencv 原始碼,並將其解壓;

    upzip opencv-3.2.0.zip -d ~          //解壓 .zip 檔案,預設解壓至當前目錄,通過 -d 指定解壓的目標目錄
    tar -xvzf opencv-3.2.0.tar.gz -C ~    //解壓 tar.gz 檔案,通過 -C 命令解壓至目標目錄

  2.進入解壓完成的原始碼目錄,並在其中建立一個新的目錄 build,進入該目錄;

    cd ~/opencv-3.2.0        //進入解壓好的 opencv 原始碼目錄
    mkdir build              //在原始碼目錄中建立新目錄 build
    cd build                 //進入 build 目錄

  3.使用 cmake 命令生成編譯整個 opencv 專案的 makefile 等內容,並完成對系統環境的檢測,為實際編譯過程確定環境。這一步的 cmake 命令中可以加入很多的編譯選項,來選擇如何對 opencv 原始碼進行編譯,如指定那些模組會被編譯,哪些模組不進行編譯,以及哪些模組由於依賴關係未被滿足(如系統上不存在其所需要的相關庫元件等)而無法編譯等。是最重要的一步。如果在使用中只需要使用 opencv 的部分模組的話,可以在該階段進行指定,進而簡化編譯流程和對系統環境的要求。該步驟所生成的所有資訊均存放在之前步驟所新建的 build 目錄下,故而可以通過刪除 build 目錄下的內容來重新執行本步驟。筆者使用的編譯指令如下所示。

    cmake -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_opencv_gpu=OFF -DWITH_IPP=OFF -DWITH_CUDA=OFF -DWITH_LAPACK=OFF -DCMAKE_INSTALL_PREFIX=~/opencv_src -DBUILD_TIFF=ON  ..

  筆者蒐集到一些該步驟下可以使用的 cmake 引數,使用者可以根據需要進行使用。  

    -DCMAKE_INSTALL_PREFIX=/path/to/target/   //編譯完成後 make install 的安裝目錄,預設為 /usr/local/
    -DBUILD_opencv_python2=OFF               
    
-DBUILD_opencv_python3=OFF //和對應的 python 模組相關 -DOPENCV_GENERATE_PKGCONFIG=ON -DBUILD_opencv_world=OFF        //將所有的動態庫融合為一個 libopencv_world.so 庫 -DOPENCV_EXTRA_MODULES_PATH=/path/to/target/ // 如果需要 opencv contrib 的功能,如人臉識別,則通過該引數指定 contrib 目錄下 module 資料夾的地址

  事實上,這些 cmake 的選項基本可以在 opencv 的原始碼目錄下的 CMakeLists.txt 中找到。在筆者裝置上即為 ~/opencv-3.2.0/CMakeLists.txt 檔案。

  在執行 cmake 命令完成後,會輸出對環境和編譯模組的檢測報告,使用者可以從該報告中檢視 opencv 編譯環境的相關情況。如在 Opencv modules 部分,可以看到後續會對哪些模組進行編譯,而哪些模組無法使用。

  

  4.在 cmake 命令執行成功後,直接通過 make 命令執行編譯過程;  

    make -j4        //執行 make 開始編譯流程,其中的 -j4 選項指定執行的任務數,可大大加快編譯速度

  5.進行安裝操作;

    make install          //執行安裝操作,會將編譯好庫檔案,可執行檔案等複製至 CMAKE_INSTALL_PREFIX 指定的目錄

  可能的報錯及解決方法:

  libzstd.so.1.3.7, needed by /home/xxxxanaconda3/lib/libtiff.so.5

  在進行編譯的時候,產生報錯 "libzstd.so.1.3.7, needed by home/xxxx/anaconda3/lib/libtiff.so.5". 當時的報錯的原因在於進行 opencv 編譯的時候,使用了存放在 Anaconda 目錄 anaconda3/lib/ 中的 libtiff.so 庫,原理上其依賴的是同一 anaconda3/lib 目錄下的 libzstd.so 庫檔案,而該目錄並不在系統的庫檔案搜尋路徑中( /etc/ld.so.conf 指定),使得最終產生找不到 libzstd.so 庫的報錯。

  解決的方案應該是有兩種,一種首先檢視一下當前裝置的 Anaconda 安裝目錄中的庫目錄(也就報錯資訊中的 /home/xxx/ananconda3/lib/ )中是否存在上述兩個庫,若存在,則將上述兩個庫檔案所在的資料夾加入系統的庫檔案搜尋路徑中即可,這裡主要通過環境變數 LD_LIBRARY_PATH 指定。這種方式要確保系統上確實存在某個目錄中存在上述滿足依賴關係的庫檔案,如本例中 /home/xxx/anaconda3/lib/ 目錄中即存在 libtiff.so 庫和其所依賴的 libzstd.so 庫。

  1)首先通過 grep -E 命令搜尋多個字串結果,筆者的裝置上的 ~/anaconda3/lib/ 資料夾中即顯示有 libtiff.so.5 和 libzstd.so.1.3.7. 首先確定對應的目錄下確實包含有上述報無法找到錯誤的庫。

    ls ~/anaconda3/lib/ | grep -E "zstd|tiff"        //檢視使用者主目錄 ~ 下的 anaconda3/lib/ 目錄中是否存在名字帶 zstd 或 tiff 的庫

  2) 將上述目錄加入系統庫檔案搜尋路徑中,通過對環境變數 LD_LIBRARY_PATH 的設定實現

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxxx/anaconda3/lib/        //將上述存在 libzstd.so 庫的路徑加入庫檔案搜尋路徑中

  第二種解決方法即 opencv 在進行編譯的時候實際可以選擇不選用系統上的 libtiff.so 庫,而是直接對其所依賴的 tiff 模組進行編譯,從而避免產生缺少依賴庫的情況。只需在 cmake 階段加入引數 -D BUILD_TIFF=ON 即可。如筆者的 opencv-3.2.0 原始碼包中,其目錄 3rdparty 下即包含有 libtiff 的原始碼,選擇指定上述選項即使系統通過上述原始碼進行編譯。筆者即通過第二種方法解決。

    -DBUILD_TIFF=ON          // cmake 階段加入該引數,使得 opencv 自行編譯 libtiff.so 等依賴庫,而不依賴使用系統上的已有庫

  參考:

  opencv github issue  

  complie and link,warning not found libpcre.so.1

  ICV: Local copy of ICV package has invalid MD5 hash

  根據網上的資料,上述錯誤產生的原因是下載 ippicv 錯誤造成的。如果實際上並不使用 ippicv 功能的話,可以在 cmake 命令執行時加上關閉 IPP 的選項。網上討論有說上述報錯是由於 CMake 在不支援正確的下載協議時下載空檔案所造成的。如果必須使用 IPP 相關功能,可以查閱參考文獻的相關內容。  
    -DWITH_IPP=OFF          //關閉對 ippicv 模組的使用

  參考:

  OpenCV build fails because I cannot download ICV on our build farm——opencv

  Why cannot I compile the opencv?——stackoverflow

    

  fatal error: LAPACKE_H_PATH-NOTFOUND/lapacke.h: No such file or directory#include "LAPACKE_H_PATH-NOTFOUND/lapacke.h"

  上述報錯的原因為在編譯時的 build 目錄下存在一個 opencv_lapack.h 標頭檔案,而其中存在語句 #include "LAPACKE_H_PATH-NOTFOUND/lapacke.h“,而實際上系統無法定位得到對應的 lapacke.h 標頭檔案。搜尋的解決方案有兩種,一種即若使用者確定不需要 LAPACK 庫的支援,可以在 cmake 階段使用 -DWITH_LAPACK=OFF 選項關閉 LAPACK 相關的編譯流程,從而避免出現問題(需要重新執行 cmake 指令)。

    -DWITH_LAPACK=OFF    //關閉對應的 LAPACK 選項

  另一種即需要補齊缺失的標頭檔案,這種方法需要自己具備有安裝依賴的許可權。具體而言,可以通過 apt install 安裝對應的 liblapacke-dev 等包,如下命令所示。

    sudo apt install liblapacke-dev checkinstall      //安裝缺失的依賴庫

  在安裝之後,將上述 #include"LAPACKE_H_PATH-NOTFOUND/lapacke.h" 替換為語句 "lapacke.h" 即可完成正確編譯。

  參考:

  fata error: LAPACKE_H_PATH-NOTFOUND when building OpenCV 3.2

  OpenCV installation error  

  與 contrib 模組一起編譯時出現 file DOWNLOAD HASH mismatch 的問題

  這部分的報錯貌似和上面的 "Local copy of ICV package has invalid MD5 hash" 的報錯問題根源較為一致,都是由於 cmake 下載檔案出現問題,根源的解決方法應該時對 cmake 進行重新安裝,可以參考上面問題的連結。cmake 的問題導致最終下載的檔案大小為 0,從而使得 hash 計算結果出問題。筆者救急使用的方法是將那些出現下載檔案問題的檔案手動下載至對應的檔案目錄中,從而使得 cmake 過程可以順利進行。具體的檔案包括,主要從 opencv 論壇的這個問題cmake failing with hash mismatch [closed]找到答案。
    boostdesc_lbgm.i 
    boostdesc_bgm.i 
    boostdesc_binboost_064.i 
    boostdesc_bgm_bi.i 
    boostdesc_bgm_hd.i 
    boostdesc_binboost_128.i 
    boostdesc_binboost_256.i 
    vgg_generated_48.i
    vgg_generated_64.i 
    vgg_generated_80.i 
    vgg_generated_120.i 

  另外還有可能遇到protobuf-cpp-3.1.0.tar.gz 的下載問題,同樣自行下載可以解決,下載地址https://github.com/google/protobuf/releases/download/v3.1.0/protobuf-cpp-3.1.0.tar.gz ,或者直接網路搜尋protobuf-cpp-3.1.0.tar.gz download。

  參考:   CMake3.8.2編譯OpenCV3.2及其擴充套件模組以及在Visual Studio 2015
  cmake failing with hash mismatch [closed]   OpenCV build fails because I cannot download ICV on our build farm   PS   opencv 3.4.0 之後,開始支援使用者在編譯時指定需要編譯那些模組而不對未指定的模組進行編譯。具體可以參考 opencv-github-Added BUILD_LIST